我正在为移动应用程序制作后端,并使用Django和Userena进行用户管理.我使用Django REST框架进行登录并注册,一切正常.我现在唯一需要做的就是实现"忘记密码"功能.我想使用已经实现的Userena,但是即使在使用csrf_exempt
dectorator 之后我也无法摆脱"CSRF令牌丢失或错误"的错误.我在做什么?
urls.py
from django.contrib.auth.views import password_reset from django.views.decorators.csrf import csrf_exempt ... urlpatterns = patterns( '', url(r'^password/mobile/reset/$', csrf_exempt(password_reset), {'template_name': 'userena/password_reset_form.html', 'email_template_name': 'userena/emails/password_reset_message.txt', 'extra_context': {'without_usernames': userena_settings.USERENA_WITHOUT_USERNAMES} }, name='userena_password_mobile_reset'), )
passowrd_reset_form.html
{% extends 'userena/base_userena.html' %} {% load i18n %} {% block title %}{% trans "Reset password" %}{% endblock %} {% block content %}{% endblock %}
sk1p.. 7
如果在POST到密码重置视图之前执行GET请求,则会在cookie中获取CSRF令牌,然后您可以在POST请求中发送该令牌.
如果您坚持豁免视图:我认为问题在于CSRF保护应用于password_reset
视图的方式.它由明确装饰csrf_protect
.
有这个问题仔细一看,让我们假设original_password_reset_view
是password_reset
没有的csrf_protect
.基本上,你这样做:
csrf_exempt(csrf_protect(original_password_reset_view)) # ^^ your code # ^^ the decorator in django.contrib.auth.views
并且添加了效果CsrfViewMiddleware
,我们得到相当于
csrf_protect(csrf_exempt(csrf_protect(original_password_reset_view)))
csrf_protect
只是一个来自中间件的装饰者CsrfViewMiddleware
.csrf_exempt
另一方面,只是简单地csrf_exempt=True
论证其论点.因此,由外部代表的中间件csrf_protect
可以看到csrf_exempt=True
视图上的值并禁用其CSRF投影.它否定了外在 csrf_protect
.所以我们有:
csrf_protect(original_password_reset_view)
视图仍受保护.基本上,没有理智的方式.(一种疯狂的方式:编写一个request.csrf_processing_done = True
为特定URL 设置的中间件.不要这样做......)
如果在POST到密码重置视图之前执行GET请求,则会在cookie中获取CSRF令牌,然后您可以在POST请求中发送该令牌.
如果您坚持豁免视图:我认为问题在于CSRF保护应用于password_reset
视图的方式.它由明确装饰csrf_protect
.
有这个问题仔细一看,让我们假设original_password_reset_view
是password_reset
没有的csrf_protect
.基本上,你这样做:
csrf_exempt(csrf_protect(original_password_reset_view)) # ^^ your code # ^^ the decorator in django.contrib.auth.views
并且添加了效果CsrfViewMiddleware
,我们得到相当于
csrf_protect(csrf_exempt(csrf_protect(original_password_reset_view)))
csrf_protect
只是一个来自中间件的装饰者CsrfViewMiddleware
.csrf_exempt
另一方面,只是简单地csrf_exempt=True
论证其论点.因此,由外部代表的中间件csrf_protect
可以看到csrf_exempt=True
视图上的值并禁用其CSRF投影.它否定了外在 csrf_protect
.所以我们有:
csrf_protect(original_password_reset_view)
视图仍受保护.基本上,没有理智的方式.(一种疯狂的方式:编写一个request.csrf_processing_done = True
为特定URL 设置的中间件.不要这样做......)