新手Django用户在这里。我正在尝试将csrf用于我的表单,因为如果我没有收到此消息:(当然还可以防止伪造)
CSRF verification failed. Request aborted.
这是我的代码:
from django.views.decorators.csrf import csrf
def login(request):
c = {}
c.update(csrf(request))
return render_to_response('login.html', c)
所以在django 1.9及更早版本中有类似的东西:
from django.core.context_processors import csrf
但是我收到以下错误:
'module' object is not callable
有任何帮助吗?感谢
编辑:全程追踪:
Environment:
Request Method: GET
Request URL: http://localhost:8000/accounts/login/
Django Version: 1.10.3
Python Version: 2.7.12
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'matchalgorithm',
'main',
'fullcalendar',
'django_extensions',
'capstone']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Python27\lib\site-packages\django\core\handlers\exception.py" in inner
39. response = get_response(request)
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Andy\Documents\ece496-web\capstone\views.py" in login
9. c.update(csrf(request))
Exception Type: TypeError at /accounts/login/
Exception Value: 'module' object is not callable
答案 0 :(得分:1)
只需确保在您的模板中将{%csrf_token%}包含在您的表单中即可,例如:
<form action="." method="post" class="login-form">
{% csrf_token %}
<input type="submit" value="Log in" />
</form>
答案 1 :(得分:0)
import java.beans.ConstructorProperties;
import java.beans.Transient;
import java.nio.file.Path;
它有效!
节日快乐:)
答案 2 :(得分:0)
视图装饰器requires_csrf_token
可用于确保模板标记确实有效。
from django.views.decorators.csrf import requires_csrf_token
from django.shortcuts import render
@requires_csrf_token
def login(request):
c = {}
return render_to_response('login.html', c)
参考文件: https://docs.djangoproject.com/en/1.10/ref/csrf/#django.views.decorators.csrf.requires_csrf_token
答案 3 :(得分:0)
您应该使用render()
代替render_to_response()
。 render()
将调用您的上下文处理器,包括将csrf标记添加到上下文的处理器:
from django.shortcuts import render
def login(request):
return render(request, 'login.html', c)
然后,您只需在模板中的表单中使用{% csrf_token %}
即可。
通常建议您使用render()
而不是render_to_response()
:
此函数在引入render()之前,其工作方式类似,但它不会使响应中的请求可用。不建议这样做,将来可能会被弃用。