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の問題だと思います。スクリプトへのアクセス?
あなたが投稿しているビューには、Django Formがありますか?そうであれば、csrfエラーが発生しているのではないかと思います。それは403として現れます。 {{csrf_token}}タグを追加する必要があります。
こちらをご覧ください 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 )。次に、スクリプトでこのトークンを渡し、それで終わりです。
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);
}
});
認証トークンの有効期限が切れたとき、またはリクエストでトークンが送信されなかったときに、このエラーが発生しました。更新されたトークンを使用すると、問題が修正されました。
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/
トークンの種類によって異なります。
Djangoのドキュメントには、CSRFトークンが含まれていることを確認するいくつかの方法が用意されています。詳細については、 https://docs.djangoproject.com/en/1.11/ref/csrf/ を参照してください。
または、この投稿リクエストを行う許可を許可することができます。
注:新しいユーザーが初めて登録するときなど、サーバーに何かを投稿するためにユーザーを認証する必要がない場合に使用する必要があります。
from rest_framework.permissions import AllowAny
class CreateUser(APIView):
permission_classes = (AllowAny,)
def post(self, request, format=None):
return(Response("hi"))
さらに、その投稿リクエストを別のドメインから作成したい場合(アプリケーションの前面がReactまたはangularとバックエンドはDjangoにあります)、設定ファイルで以下を追加してください:
「coreHeaders」を使用するようにINSTALLED_APPSを更新します。
INSTALLED_APPS = [
'corsheaders'、
設定ファイルに以下を再度追加して、フロントエンドドメインをホワイトリストに追加します。
CORS_Origin_WHITELIST =( 'localhost:8080'、)