Django 1.10使用csrf令牌

时间:2016-12-28 00:38:17

标签: python django csrf

新手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

4 个答案:

答案 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()之前,其工作方式类似,但它不会使响应中的请求可用。不建议这样做,将来可能会被弃用。