web-dev-qa-db-ja.com

Django:禁止(CSRF Coo​​kieが設定されていません)

「CSRFCookieが設定されていません」という問題が発生しています。必要なのは、外部課金プラットフォームが更新をDjangoサーバーに送信することです。ローカルではPostmanで動作しますが、デモサーバーでは動作しません...

コード

# views.py
from Django.views.decorators.csrf import csrf_exempt
from Django.http import JsonResponse

@csrf_exempt
def postback(request):
    print(request.POST)
    return JsonResponse({'ok': 'hoooh!'})

# urls.py
from Django.conf.urls import url
from billing import views

urlpatterns = [
   url(r'^postback/$', views.postback),
]

エラー

Forbidden (CSRF cookie not set.): /billing/postback/
[21/Jul/2016 10:49:21] "POST /billing/postback/ HTTP/1.1" 403 2682

Requestbサーバーへのポストバックの結果

https://requestb.in/p0rihap0?inspect#t67d6c

環境

  • Python 3.5.1+
  • Django 1.10rc1
3
Calzzetta

設定ファイルでCSRF_COOKIE_SECURETrueに設定した場合、Cookieは「安全」とマークされるため、HTTPS接続が必要になります。

そのため、このエラーが発生します。

詳細については ここ

7
Rafael

私はここで解決策を見つけました: Django Rest Frameworkはcsrfを削除します

システムの一部でDRFを使用していますが、CSRFエラーが生成され、csrf_exemptデコレータが無視されていた可能性があります。

助けてくれてありがとう!

3
Calzzetta

Urls.pyを変更します

Urls.pyでルートを管理している場合は、目的のルートをcsrf_exempt()でラップして、CSRF検証ミドルウェアから除外できます。

from Django.conf.urls import patterns, url
from Django.views.decorators.csrf import csrf_exempt
from . import views

urlpatterns = patterns('',
    url(r'^object/$', csrf_exempt(views.ObjectView.as_view())),
    ...
)

Views.pyで

class ObjectView(CreateView):

    def post(self, request):
        if request.method == 'POST':
             #enter you view
1
jincy mariam