尝试将POST发送到Django中的set_language视图时获取403(禁止)

时间:2016-09-23 18:48:26

标签: python django internationalization django-i18n

我是Django的新手,我正在尝试创建一个小网站,点击一个标志,语言也会发生变化。我正在使用django i18n:

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。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

django中的任何POST请求都要求您默认发送CSRF-Cookie。您可以选择:

  • 不要使用POST请求。请改用GET。
  • 发送带有请求的CSRF令牌。 https://docs.djangoproject.com/en/1.9/ref/csrf/
  • 使用装饰器@csrf_exempt从视图中移除任何csrf保护(在您的情况下为http://localhost:8000/i18n/setlang/的视图)
  • 不要向您自己的应用发送请求。使用链接供用户单击。可能是你最好的选择。
  

注意:   如果你想使用带有基于类的视图的装饰器,请修饰该视图的dispatch()函数