1

我已經使用djangorestframework創建了一個API,但是當我在終端中使用python manage.py runserver命令時,它顯示「HTTP/1.0 301 Moved Permanently」錯誤。 This the Message which it showsHTTP/1.0 301永久移動 - Django

但很酷的是,當我在瀏覽器中運行它顯示數據。 This the result in Chrome

我想知道發生了它。

而在此POST調用也不起作用。

下面是代碼:

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',) 

回答

3

30 1不是錯誤,而是重定向。在命令行中,您請求了一個沒有斜線的URL,但是您的URL模式期望斜槓在那裏。在這種情況下,Django有一個不錯的convenience feature來返回重定向。

與您的命令行HTTP客戶端不同,您的瀏覽器會識別重定向,然後對第二個請求進行跟蹤,包括尾部斜槓。

+0

非常感謝@koniiiik,它的工作 –

+0

但@ koniiiik我無法職位上給它的數據,使用郵遞員 –

+1

您需要發佈到包含結尾斜槓的URL,沒有斜槓的URL將始終返回重定向,並忽略請求主體。 – koniiiik

0

它看起來像你有APPEND_SLASH設置爲true。當你去到終點沒有斜線,它會自動因爲你的URL與一個結局映射重定向到以斜槓相同的URL,致使301

Documentation is here.

+0

Bah,Ninja'd它! – Withnail

+0

非常感謝@絲襪,它工作的人 –

0

你所看到的效果/和您請求的鏈接沒有結尾/。如果Django無法找到與請求的URL匹配的內容,則默認情況下會嘗試一個結尾爲/的網址。

這是由APPEND_SLASH設置,這是默認設置爲True控制:

設置爲True時,如果請求的URL不匹配任何URL配置的 模式和它doesn」 t以斜線結尾,HTTP 重定向發出到附加了斜線的相同URL。請注意, 重定向可能導致在POST請求中提交的任何數據丟失 。

要解決此問題,改變你的命令:

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

謝謝Bhurhan –