REST Api in Django Jsonを出力することで作成しようとしています。POSTを作成すると問題が発生します端末でcurlを使用してリクエストします。私が得るエラーは
このURLをPOST経由で呼び出しましたが、URLの末尾がスラッシュではなく、APPEND_SLASHが設定されています。 Djangoは、スラッシュURLにリダイレクトできません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は初めてですが。
まず、リクエストをhttp://127.0.0.1/add/
ではなくhttp://127.0.0.1/add
に送信してください。
次に、@csrf_exempt
デコレータを追加して、ビューをcsrf処理から除外することもできます。これは、cURLから適切なトークンを送信していないためです。
URLの一貫性のために、DjangoにはAPPEND_SLASH
と呼ばれる設定があり、URLが最初に送信されなかった場合は常にスラッシュをURLの末尾に追加します。これにより、 /my/awesome/url/
は、両方の/my/awesome/url
and/my/awesome/url/
ではなく、常にそのURLから提供されます。
ただし、Djangoは、末尾にスラッシュがないバージョンを、末尾にスラッシュがあるバージョンに自動的にリダイレクトすることでこれを行います。リダイレクトは、リクエストの状態を伝えないため、あなたのPOSTデータは削除されます。
POSTを送信するときに、最後にスラッシュを付けたバージョンに送信する必要があります。
取得==> http://127.0.0.1:8000/create?name=wpwqekhqw/
POST ==> http://127.0.0.1:8000/create/?name=wpwqekhqw/ の場合
POST ...リクエストの作成後に「/」を追加する必要があります
別のシナリオでは、例の下で、csrfまたはAPPEND_SLASHソリューションに関連しない正確なエラーが発生する可能性があります。
def post(self, request, *args, **kwargs):
data= request.data
print(data['x'])
'x'がペイロード本体に存在しない場合、data ['x']はエラーを発生させます。この場合、このエラーは上記のような誤ったメッセージを出しました。うまくいけば、これは他の開発者を助けるでしょう。