web-dev-qa-db-ja.com

Djangoは、POSTリクエストを送信するときに403エラーを返します

Pythonコードを使用してPOST私のDjangoウェブサイトにリクエストを送信しています403:禁止されたエラー。

url = 'http://www.sub.domain.com/'
values = { 'var': 'test' }

try:
    data = urllib.urlencode(values, doseq=True)
    req = urllib2.Request(url, data)
    response = urllib2.urlopen(req)
    the_page = response.read()
except:
    the_page = sys.exc_info()
    raise

他のWebサイトを開いているときは、正常に機能します。 domain.comはDjangoウェブサイトでもあり、適切に動作します。それはDjango configの問題だと思います。スクリプトへのアクセス?

34
Djent

あなたが投稿しているビューには、Django Formがありますか?そうであれば、csrfエラーが発生しているのではないかと思います。それは403として現れます。 {{csrf_token}}タグを追加する必要があります。

28
Joe J

こちらをご覧ください https://docs.djangoproject.com/en/dev/ref/csrf/#how-to-use-it .

@csrf_exemptでビューをマークしてみてください。そのようにして、DjangoのCSRFミドルウェアはCSRF保護を無視します。 from Django.views.decorators.csrf import csrf_exemptも使用する必要があります。参照: https://docs.djangoproject.com/en/dev/ref/csrf/#utilities

ビューでCSRF保護を無効にすると、CSRF攻撃のゲートが開かれることに注意してください。

セキュリティが重要な場合は、@csrf_exemptの後に@requires_csrf_tokenを使用することを検討してください(参照: https://docs.djangoproject.com/en/dev/ref/csrf/#unprotected-view -needs-the-csrf-token )。次に、スクリプトでこのトークンを渡し、それで終わりです。

45
bx2

Django=は、投稿データに含まれるcsrfトークンを必要とするすべてのPOSTリクエスト。

これを行うには、次のようなさまざまな方法があります。

Cookieからトークンを取得する方法は、こちらのリンクの説明を入力する記事で説明されています。

または

テンプレートにある{{csrf_token}}を使用してDOMからアクセスできます。

したがって、2番目の方法を使用します。

var post_data = {
  ...
  'csrfmiddlewaretoken':"{{ csrf_token }}"
  ...
}

$.ajax({
  url:'url',
  type:'POST'
  data:post_data,
  success:function(data){
    console.log(data);
  },
  error:function(error){
    console.log(error);
  }
});
3
Hiro

認証トークンの有効期限が切れたとき、またはリクエストでトークンが送信されなかったときに、このエラーが発生しました。更新されたトークンを使用すると、問題が修正されました。

curl -X POST -H "Authorization: Token mytoken" -d "name=myname&age=0" 127.0.0.1:8000/myapi/

または

curl -X POST -H "Authorization: JWT mytoken" -d "name=myname&age=0" 127.0.0.1:8000/myapi/

トークンの種類によって異なります。

0
DevB2F

Djangoのドキュメントには、CSRFトークンが含まれていることを確認するいくつかの方法が用意されています。詳細については、 https://docs.djangoproject.com/en/1.11/ref/csrf/ を参照してください。

0
polarise

または、この投稿リクエストを行う許可を許可することができます。

注:新しいユーザーが初めて登録するときなど、サーバーに何かを投稿するためにユーザーを認証する必要がない場合に使用する必要があります

from rest_framework.permissions import AllowAny

class CreateUser(APIView):
    permission_classes = (AllowAny,)
    def post(self, request, format=None):
        return(Response("hi"))

さらに、その投稿リクエストを別のドメインから作成したい場合(アプリケーションの前面がReactまたはangularとバックエンドはDjangoにあります)、設定ファイルで以下を追加してください:

  1. 「coreHeaders」を使用するようにINSTALLED_APPSを更新します。

    INSTALLED_APPS = [
    'corsheaders'、

  2. 設定ファイルに以下を再度追加して、フロントエンドドメインをホワイトリストに追加します。

    CORS_Origin_WHITELIST =( 'localhost:8080'、)

0
Santosh Pillai