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 –