Django POST URL错误

时间:2012-03-16 14:11:29

标签: python django restful-architecture

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

  

您通过POST调用了此URL,但该URL并未以斜杠结尾   你有APPEND_SLASH设置。 Django无法重定向到斜杠网址   同时保持POST数据。将表单更改为指向   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的新手。

8 个答案:

答案 0 :(得分:27)

首先,请务必将请求发送至http://127.0.0.1/add/而不是http://127.0.0.1/add

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

答案 1 :(得分:20)

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

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

您需要做的就是确保在发送POST时,将其发送到最后带斜杠的版本。

答案 2 :(得分:1)

以HTML方式更改操作。 就我而言,它是有效的。

unsigned

答案 3 :(得分:1)

只需从网址中删除斜杠

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

OR

在HTML表单中添加斜杠到动作

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

对我有用

答案 4 :(得分:0)

获取==> http://127.0.0.1:8000/create?name=wpwqekhqw/

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

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

答案 5 :(得分:0)

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

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

如果有效载荷主体中不存在“ x”,则data ['x']将引发错误,在我的情况下,该错误给出了类似于上述错误消息。 希望这会对其他开发人员有所帮助。

答案 6 :(得分: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'),

答案 7 :(得分:0)

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

在 Django 3.X 中:

from django.urls import re_path
re_path(r'^query/?$', 'search.views.query'),
re_path(r'^add/?$','search.views.add'),