web-dev-qa-db-ja.com

Django POST URLエラー

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は初めてですが。

19
Zabi

まず、リクエストをhttp://127.0.0.1/add/ではなくhttp://127.0.0.1/addに送信してください。

次に、@csrf_exemptデコレータを追加して、ビューをcsrf処理から除外することもできます。これは、cURLから適切なトークンを送信していないためです。

30
Burhan Khalid

URLの一貫性のために、DjangoにはAPPEND_SLASHと呼ばれる設定があり、URLが最初に送信されなかった場合は常にスラッシュをURLの末尾に追加します。これにより、 /my/awesome/url/は、両方の/my/awesome/urland/my/awesome/url/ではなく、常にそのURLから提供されます。

ただし、Djangoは、末尾にスラッシュがないバージョンを、末尾にスラッシュがあるバージョンに自動的にリダイレクトすることでこれを行います。リダイレクトは、リクエストの状態を伝えないため、あなたのPOSTデータは削除されます。

POSTを送信するときに、最後にスラッシュを付けたバージョンに送信する必要があります。

21
Chris Pratt

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

POST ==> http://127.0.0.1:8000/create/?name=wpwqekhqw/ の場合

POST ...リクエストの作成後に「/」を追加する必要があります

1

別のシナリオでは、例の下で、csrfまたはAPPEND_SLASHソリューションに関連しない正確なエラーが発生する可能性があります。

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

'x'がペイロード本体に存在しない場合、data ['x']はエラーを発生させます。この場合、このエラーは上記のような誤ったメッセージを出しました。うまくいけば、これは他の開発者を助けるでしょう。

0
Feras