如何在Django 1.11中导入并使用CSRF令牌?

3

请帮助我们在Django 1.11中使用CSRF令牌

在view.py中,我使用以下代码:

from django.shortcuts import render_to_response, redirect
from django.contrib import auth
from django.views.decorators.csrf import csrf

def login(request):
    args = {}
    args.update(csrf(request))
    if request.POST:
            username = request.POST.get('username', '')
            password = request.POST.get('password', '')
            user = auth.authenticate(username=username, password=password)
            if user is not None:
                    auth.login(request, user)
                    return redirect('/')
            else:
                    args['login_error'] = 'Пользователь не найден';
                    return render_to_response('login.html', args)
    else:
            return render_to_response('login.html', args)

但控制台显示以下错误消息:

文件“/home/kalinin/django/login/views.py”,第 3 行,来自 django.views.decorators.csrf 导入 csrf ImportError: 无法导入名称 'csrf'

在 Django 1.8 中,我使用类似的代码,但是导入了 csrf:

from django.core.context_processors import csrf

应用程序正常运行

请帮助我运行django 1.11的应用程序


Django自带身份验证视图和表单。我建议您使用这些,而不是编写自己的。 - Alasdair
1个回答

6
在Django 1.8中,模板上下文处理器被移动到django.template.context_processors.csrf,因此导入应该是这样的:
from django.template.context_processors import csrf

然而,你完全不需要导入它。停止使用render_to_response,因为已经过时了。请使用render简写方式。

from django.shortcuts import render

return render(request, 'login.html', args)

当您使用render快捷方式时,您无需担心视图中的csrf令牌,您可以删除此行。

args.update(csrf(request))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接