2016-12-28 21 views
0

Новичок пользователя Django здесь. Я пытаюсь использовать CSRF для моей формы, потому что, если я не получаю сообщение: (и, конечно, защита от подделок)Django 1.10 Использование csrf Token

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) 

Так Джанго 1,9 и старше было что-то вроде этого:

from django.core.context_processors import csrf 

Но я получаю следующее сообщение об ошибке:

'module' object is not callable 

Любая помощь? Благодаря

EDIT: Полный трек-обратно:

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> 
+0

Да, я был там, но все еще не работал. – anderish

+0

Вы должны использовать формы django. Они удивительны. –

0

Oops , понял мою ошибку. Удалить эту строку:

c.update(csrf(request)) 

и все работает!

праздниками :)

+0

Вы также должны посмотреть на использование Django Forms https://docs.djangoproject.com/en/1.10/topics/forms/ –

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

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():

This function preceded the introduction of render() and works similarly except that it doesn’t make the request available in the response. It’s not recommended and is likely to be deprecated in the future.