我在这行中的问题:
args.update(csrf(request))
我在vews.py中的功能:
def Login(request):
args = {}
args.update(csrf(request))
if request.POST:
username = request.POST.get('username', '')
password = request.POST.get('password', '')
user = authenticate(username = username, password = password)
print(user, username, password)
if user is not None:
auth.login(request, user)
return redirect('/')
else:
args['login_error'] = "Пользователь не найден"
return render(request, 'HiPage/Login.html', args)
else:
return render(request, 'HiPage/Login.html', args)
这里的模块是什么,为什么它不能调用? (我进口了csrf)
File "C:\Users\Dmitry\Desktop\Shop-master\HiPage\views.py", line 51, in Login
args.update(csrf(request))
TypeError: 'module' object is not callable
答案 0 :(得分:1)
基于comments,您对Django中CSRF的实现方式有误解。
有必要为模板提供csrf。我尝试不使用此字符串来执行此操作,但是出现了csrf错误。
是正确的。但是您无需将此添加到上下文变量。如果您使用Camera
作为中间件,则CSRF令牌的检查会自动进行。
您需要做的是在模板中定义{% csrf_token %}
template tag [Django-doc],例如:
'django.middleware.csrf.CsrfViewMiddleware'
在该视图中,无需生成或检查CSRF令牌。
在您看来,您应该检查<form method="post" action="...">
{% csrf_token %}
<!-- ... -->
</form>
而不是request.method == 'POST'
,因为可以在没有数据的情况下发出POST请求。
根据PEP-8,建议使用带下划线的小写字母编写函数。
最后,如果您创建一个redirect(..)
,则最好使用视图名称。如果您稍后更改该视图的路径,则重定向到的URL也将更改。
if request.POST