Django POST URL错误

Zab*_*abi 18 python django restful-architecture

我试图通过输出Json在Django中创建REST Api.如果我在终端使用curl发出POST请求,我会遇到问题.我得到的错误是

您通过POST调用此URL,但URL不以斜杠结尾,并且您设置了APPEND_SLASH.在保持POST数据时,Django无法重定向到斜杠URL.将表单更改为指向127.0.0.1:8000/add/(注意斜杠),或在Django设置中设置APPEND_SLASH = False.

我的url.py是

    from django.conf.urls.defaults import patterns, include, url
import search

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',

    url(r'^query/$', 'search.views.query'),
    url(r'^add/$','search.views.add'),
)
Run Code Online (Sandbox Code Playgroud)

我的意见是

# Create your views here.
from django.http import HttpResponse
from django.template import Context,loader
import memcache
import json

def query(request):
    data=['a','b']

    mc=memcache.Client(['127.0.0.1:11221'],debug=0)
    mc.set("d",data);

    val=mc.get("d")

    return HttpResponse("MEMCACHE: %s<br/>ORIGINAL: %s" % (json.dumps(val),json.dumps(data)) )

def add(request):
    #s=""
    #for data in request.POST:
    #   s="%s,%s" % (s,data)
    s=request.POST['b']
    return HttpResponse("%s" % s)
Run Code Online (Sandbox Code Playgroud)

我知道它不给Json,但是当我在终端发出POST请求时,我遇到了上面提到的问题

curl http://127.0.0.1:8000/add/ -d b=2 >> output.html
Run Code Online (Sandbox Code Playgroud)

我是django的新手.

Bur*_*lid 32

首先,请确保您发送的请求http://127.0.0.1/add/没有http://127.0.0.1/add.

其次,您可能还希望通过添加@csrf_exempt装饰器来免除csrf处理视图- 因为您没有从cURL发送适当的令牌.


Chr*_*att 26

对于URL一致性,Django有一个名为的设置APPEND_SLASH,如果没有以这种方式发送,它总是在URL的末尾附加一个斜杠.这确保了/my/awesome/url/总是来自于该网址,而不是两个服务/my/awesome/url /my/awesome/url/.

但是,Django通过自动将没有斜杠的版本重定向到末尾带有斜杠的版本来实现这一点.重定向不会随身携带请求的状态,因此当发生这种情况时,您的POST数据将被丢弃.

您需要做的就是确保在发送POST时,将其发送到末尾带有斜杠的版本.


小智 5

只需从 URL 中删除尾部斜杠即可

urlpatterns = [
    path('', views.home, name= 'home'),
    path('contact/', views.contact, name= 'contact'),
    path('about/', views.about, name= 'about')
]
Run Code Online (Sandbox Code Playgroud)

改成

urlpatterns = [
    path('', views.home, name= 'home'),
    path('contact', views.contact, name= 'contact'),
    path('about', views.about, name= 'about')
]
Run Code Online (Sandbox Code Playgroud)

或者

在 HTML 表单中添加尾部斜杠到操作

 <form method="POST" action="/contact/">
    {% csrf_token %}
Run Code Online (Sandbox Code Playgroud)

这对我有用