3

我正在开发一个与我的 Django 应用程序交互的刚刚学习的 iOS 应用程序。

我在登录部分:由于 csrf 保护,我的客户端无法登录 Django 应用程序。

对于其他视图,我只是添加csrf_exempt装饰器以禁用它,但对于内置django.contrib.auth.views.login

4

2 回答 2

6

在现代 Django(最后在 1.11 上测试)中,禁用 CSRF 检查的一种方法是继承LoginView并覆盖其dispatch方法,该方法显式装饰有csrf_protect(如此处所示)。

生成的 CBV 大致如下:

from django.contrib.auth.views import LoginView
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponseRedirect


class DangerousLoginView(LoginView):
    '''A LoginView with no CSRF protection.'''

    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        if self.redirect_authenticated_user and self.request.user.is_authenticated:
            redirect_to = self.get_success_url()
            return HttpResponseRedirect(redirect_to)
        return super(LoginView, self).dispatch(request, *args, **kwargs)

在此处查看整个urls.py文件。

这个想法是复制完全相同的方法,同时替换csrf_protectcsrf_exempt. 可能有一种更简洁的方法可以做到这一点,例如,使用undecorated

于 2011-08-14T16:09:47.470 回答
0

在您的模板中: users/login.html 您需要修改 POST 行以包括:

{% csrf_token %}

IE:

<form action="{{ app_path }}" method="post" id="login-form">{% csrf_token %}
于 2012-08-30T16:22:40.090 回答