1

Ich habe eine API mit djangorestframework erstellt, aber wenn ich es im Terminal mit Python manage.py runserver Befehl ausführen zeigt es "HTTP/1.0 301 Moved Permanently" -Fehler. This the Message which it showsHTTP/1.0 301 Moved Permanently-Django

Aber die coole Sache ist, wenn ich es im Browser ausführen zeigt es die Daten. This the result in Chrome

Ich wollte wissen, was passiert ist.

Und darin funktioniert auch der POST-Anruf nicht.

Unten ist der Code:

serializers.py

from rest_framework import serializers 
from snippets.models import Snippet 

class SnippetSerializer(serializers.ModelSerializer): 
      class Meta: 
       model = Snippet 
       fields = ('title','code',) 

def create(self, validated_data): 
    return Snippet.objects.create(**validated_data) 


def update(self, instance, validated_data): 
    instance.title = validated_data.get('title', instance.title) 
    instance.code = validated_data.get('code', instance.code) 
    instance.save() 
    return instance 

Views.py

from django.shortcuts import render 
from django.http import HttpResponse 
from django.views.decorators.csrf import csrf_exempt 
from rest_framework.renderers import JSONRenderer 
from rest_framework.parsers import JSONParser 
from snippets.models import Snippet 
from snippets.serializers import SnippetSerializer 


# Create your views here. 


class JSONResponse(HttpResponse): 
    def __init__(self,data,**kwargs): 
     content = JSONRenderer().render(data) 
     kwargs['content_type']='application/json' 
     super(JSONResponse, self).__init__(content, **kwargs) 

@csrf_exempt 
def snippet_list(request): 
    """ 
    List all code snippets, or create a new snippet. 
    """ 
    if request.method == 'GET': 
     snippets = Snippet.objects.all() 
     serializer = SnippetSerializer(snippets, many=True) 
     return JSONResponse(serializer.data) 

    elif request.method == 'POST': 
     data = JSONParser().parse(request) 
     serializer = SnippetSerializer(data=data) 
     if serializer.is_valid(): 
      serializer.save() 
      return JSONResponse(serializer.data, status=201) 
     return JSONResponse(serializer.errors, status=400) 

@csrf_exempt 
def snippet_detail(request, pk): 
    """ 
    Retrieve, update or delete a code snippet. 
    """ 
    try: 
     snippet = Snippet.objects.get(pk=pk) 
    except Snippet.DoesNotExist: 
     return HttpResponse(status=404) 

    if request.method == 'GET': 
     serializer = SnippetSerializer(snippet) 
     return JSONResponse(serializer.data) 

    elif request.method == 'PUT': 
     data = JSONParser().parse(request) 
     serializer = SnippetSerializer(snippet, data=data) 
     if serializer.is_valid(): 
      serializer.save() 
      return JSONResponse(serializer.data) 
     return JSONResponse(serializer.errors, status=400) 

    elif request.method == 'DELETE': 
     snippet.delete() 
     return HttpResponse(status=204) 

Models.py

from __future__ import unicode_literals 

from django.db import models 

# Create your models here. 


class Snippet(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    title = models.CharField(max_length=100, blank=True, default='') 
    code = models.TextField() 


class Meta: 
    ordering = ('created',) 

Antwort

3

30 1 ist kein Fehler, sondern eine Umleitung. Über die Befehlszeile haben Sie eine URL ohne abschließenden Schrägstrich angefordert, aber Ihre URL-Muster erwarten, dass der Schrägstrich dort angezeigt wird. Django hat eine nette , um in solchen Fällen eine Weiterleitung zurückzugeben.

Im Gegensatz zu Ihrem Befehlszeilen-HTTP-Client erkennt Ihr Browser die Weiterleitung und verfolgt anschließend eine zweite Anforderung an die neue URL, einschließlich des abschließenden Schrägstrichs.

+0

Vielen Dank @koniiiik, es funktionierte –

+0

aber @ koniiiik ich bin nicht in der Lage Daten POST auf, um es, Postbote mit –

+1

Sie müssen Geben Sie in die URL, die den abschließenden Schrägstrich enthält, die ohne Schrägstrich immer eine Weiterleitung zurück und ignorieren Sie den Anfragetext. – koniiiik

0

Es sieht so aus, als ob Sie APPEND_SLASH auf true gesetzt haben. Wenn Sie ohne einen Schrägstrich an den Endpunkt gehen, es leitet es automatisch auf die gleiche URL mit einem Schrägstrich, was in dem 301.

Documentation is here.

+0

Bah, Ninja'd dazu! – Withnail

+0

Vielen Dank @Withnail, es funktionierte Mann –

0

Der Effekt, den Sie sehen, ist, weil die URL mit einer Endung abgebildet wird / und der von Ihnen angeforderte Link hat keine Endung /. Django versucht standardmäßig eine URL mit der Endung /, wenn keine Übereinstimmung mit der angeforderten URL gefunden werden kann.

Dies wird durch die APPEND_SLASH Einstellung gesteuert, die auf True Voreingestellt ist:

Wenn auf True gesetzt, wenn die URL nicht in der URLconf einem der Muster entsprechen und es doesn‘ t Ende in einem Schrägstrich, eine HTTP Weiterleitung wird an die gleiche URL mit einem angehängten Schrägstrich ausgegeben. Beachten Sie, dass die Umleitung dazu führen kann, dass alle in einer POST-Anfrage gesendeten Daten verloren gehen.

um dieses Problem zu beheben, um Ihren Befehl ändern:

http http://127.0.0.1:8006/snippets/ 
+0

danke Bhurhan –