2016-09-23 9 views
-1

私はDjangoを初めて使い、フラグをクリックして言語を変更する小さなWebサイトを作成しようとしています。私はそのためDjangoの国際化を使用しています:Djangoのset_languageビューにPOSTを送信しようとしているときに403(禁止)を取得する

urls.py

from django.conf.urls import patterns, include, url 
from django.conf.urls.i18n import i18n_patterns 

urlpatterns = [url(r'^i18n/', include('django.conf.urls.i18n'))] 

urlpatterns += i18n_patterns(
    url(r'^$', views.home, name='home'), 
) 

問題がある、私は次のコードを実行すると:

templetatags.pyを

@register.simple_tag 
def test(): 
    r = requests.post('http://localhost:8000/i18n/setlang/', data = {'lang':'en', 'next' : '/'}) 
    print r.status_code 

home.html

<div id='country_flags'> 
    <a hreflang="en" href="{% test %}"><img id='en' src='{% static "mysyte/images/gb.png" %}'></a> 
</div> 

r.status_codeの結果は、403

私が間違って何をやっているのですか?

+0

が必要views.home'ビューを 'いポストデータを受け入れる際のCSRFトークン? –

+0

ああ、私の問題ですが、私はCSRFトークンを完全に忘れました。私の要求に沿ってトークンを渡す方法はありますか? – msTOM

+0

なぜあなたはこれをやっていますか?なぜ*テンプレートタグ*は投稿とあなた自身のアプリを引き起こすでしょうか? –

答えて

0

djangoのPOSTリクエストでは、デフォルトでCSRF-Cookieを送信する必要があります。この周辺のオプション:

  • POSTリクエストを使用しないでください。代わりにGETを使用してください。
  • 要求と共にCSRFトークンを送信します。 https://docs.djangoproject.com/en/1.9/ref/csrf/
  • は、独自のアプリケーションに要求を送信しない
  • http://localhost:8000/i18n/setlang/ためのあなたのケースでビュー)ビューから任意のCSRF保護を削除するためにデコレータ@csrf_exemptを使用しています。ユーザーがクリックするためのリンクを使用します。おそらくあなたの最高の選択肢。

注: あなたは、クラスベースのビュー/ wのデコレータを使用する場合は、そのビューの派遣()関数を飾る

+0

オプションありがとう、ht_! Djangoのドキュメントによると、ウェブサイトの言語を変更するビュー(set_language redirect view)はi18n/setlang URLへのPOST要求のみを受け付けるため、私がPOST要求を使用している唯一の理由があります。しかし、私は他のオプションを試してみます。 – msTOM