32

我正在尝试通过输出 Json 在 Django 中制作 REST Api。如果我在终端中使用 curl 发出 POST 请求,我会遇到问题。我得到的错误是

您通过 POST 调用了此 URL,但该 URL 不以斜杠结尾,并且您设置了 APPEND_SLASH。Django 在维护 POST 数据时无法重定向到斜杠 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'),
)

我的观点是

# 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)

我知道它没有给 Json,但是当我在终端发出 POST 请求时遇到了上述问题

curl http://127.0.0.1:8000/add/ -d b=2 >> output.html

不过,我是 django 的新手。

4

8 回答 8

52

首先,确保您将请求发送到http://127.0.0.1/add/not http://127.0.0.1/add

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

于 2012-03-16T20:43:48.880 回答
43

为了 URL 的一致性,Django 有一个名为 的设置APPEND_SLASH,如果一开始没有以这种方式发送,它总是在 URL 的末尾附加一个斜杠。这可确保/my/awesome/url/始终从该 URL 提供,而不是同时提供/my/awesome/url /my/awesome/url/

但是,Django 通过自动将末尾不带斜线的版本重定向到末尾带斜线的版本来做到这一点。重定向不携带请求的状态,因此当发生这种情况时,您的 POST 数据将被删除。

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

于 2012-03-16T14:24:08.333 回答
1

FOR GET ==> http://127.0.0.1:8000/create?name=wpwqekhqw/

对于 POST ==> http://127.0.0.1:8000/create/?name=wpwqekhqw/

您应该在 POST ... 请求中创建后添加“/”

于 2019-03-04T10:10:18.820 回答
1

在 Html 中进行更改。它在我的情况下有效。

<form action="{% url 'add' %}" method="post">
    {% csrf_token %}
    ...
</form>
于 2020-05-04T11:09:51.947 回答
1

只需从 URL 中删除尾部斜杠

urlpatterns = [
    path('', views.home, name= 'home'),
    path('contact/', views.contact, name= 'contact'),
    path('about/', views.about, name= 'about')
]

改成

urlpatterns = [
    path('', views.home, name= 'home'),
    path('contact', views.contact, name= 'contact'),
    path('about', views.about, name= 'about')
]

或者

在 HTML 表单中添加斜杠以操作

 <form method="POST" action="/contact/">
    {% csrf_token %}

它对我有用

于 2020-10-07T13:36:11.500 回答
0

另一种情况可能会引发与 csrf 或 APPEND_SLASH 解决方案无关的确切错误,如下所示。

 def post(self, request, *args, **kwargs):
        data= request.data
        print(data['x'])

如果有效负载正文中不存在“x”,则 data['x'] 将引发错误,在我的情况下,此错误给出了与上述类似的错误消息。希望这将有助于其他开发人员。

于 2019-11-01T18:36:42.297 回答
0

删除 url.py 上的斜线

例如:来自:

url(r'^customer/json/set_person/$', views.json_set_person, name='fog.apps.views.json.set_person'),

到:

url(r'^customer/json/set_person$', views.json_set_person, name='fog.apps.views.json.set_person'),
于 2021-03-26T16:38:05.363 回答
0

它可以通过“/?”提供带有和不带有斜杠的网址:

在 django 3.X 中:

from django.urls import re_path
re_path(r'^query/?$', 'search.views.query'),
re_path(r'^add/?$','search.views.add'),
于 2021-04-29T10:38:58.143 回答