我试图通过输出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的新手。
答案 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'),