2013-10-25 7 views
1

Я пытаюсь создать простой веб-сайт, на котором можно добавить данные в базу данных MySQL. У меня есть форма POST с двумя текстовыми вводами (имя пользователя, пароль). Я прочитал весь ответ и попытался его решить, но не смог добиться успеха.Django-CSRF: проверка CSRF не удалась. Запрос прерван при нажатии кнопки входа в систему

index.html

<form action="/login/" method="post">{% csrf_token %}<table border="0" cellspacing="15" width="345" align="center"> 
<tr> 
    <td width="100" >Username:</td> 
    <td><input type="text" class="text-box" value="{{ username }}" placeholder="Username"/></td>       
</tr> 
<tr> 
    <td class="align-left">Password:</td> 
    <td><input type="password" class="text-box" value="" placeholder="Password"/></td>       
</tr>      
<tr> 
    <td class="align-left"></td> 
    forget-link"><a href="#" >Forget Your Passowrd?</a></td>       
</tr>      

views.py

def login(request): 

    logout(request) 
    username = password = '' 
    if request.method : 
     username = request.POST['username'] 
     password = request.POST['password']  
     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect('/main/') 
    return render(request, 'index.html',{ 'username': username}) 

urls.py

urlpatterns = patterns('',  

    url(r'^login/', 'mysite.views.login', name='login'), 
) 

Я применил {% csrf_token%} после тега формы в index.html.

Когда я нажимаю на кнопку Login, я имею ошибку ниже:

CSRF verification failed. Request aborted.

+0

, на котором URL-адрес вы вызываете шаблон для входа. Это что/login/или любой другой? –

+2

показать нам шаблон – lalo

+0

Вы добавили промежуточное ПО? –

ответ

1

Я думаю, вам нужно применить CSRF в контекст, ваше мнение будет endout как это

from django.shortcuts import render_to_response 
from django.core.context_processors import csrf 

def login(request): 

    logout(request) # not sure what this function is, I guess must be on some part of your code 
    if request.method == "POST" : 
     username = request.POST['username'] or '' 
     password = request.POST['password'] or '' 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect('/main/') 
    context = { 'username': username, } 
    context.update(csrf(request)) 
    return render_to_response(request, 'index.html', context) 
+0

Извините за половину комментария, теперь вы видите, что я имел в виду – mcniac

+0

, вам это не понадобилось бы, если бы вы использовали форму django. – mcniac

+0

Я применил контекст, как вы сказали, но все равно получая ту же ошибку. В backend у меня есть: /usr/local/lib/python2.7/dist-packages/django/template/defaulttags.py:55: UserWarning: в шаблоне использовался {% csrf_token%}, но контекст не предоставил значение. Обычно это вызвано не использованием RequestContext. warnings.warn ("A {% csrf_token%} был использован в шаблоне, но контекст не предоставил значение. Обычно это вызвано не использованием RequestContext.») – user2833654

3

Проблема заключается в том, что вы используете тег {% csrf_token%} в своем шаблоне, но ранее вы не генерировали токен в представлении, чтобы шаблон ничего не знал об этом.

Следуя docs у вас есть два варианта:

Первое решение:

Use RequestContext, which always uses 'django.core.context_processors.csrf' (no matter what your TEMPLATE_CONTEXT_PROCESSORS setting). If you are using generic views or contrib apps, you are covered already, since these apps use RequestContext throughout.

Таким образом, вы должны изменить код на ваш взгляд, как это:

def login(request): 
    logout(request) 
    username = password = '' 
    if request.method : 
     username = request.POST.get('username', '') 
     password = request.POST.get('password', '') 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect('/main/') 

    template = loader.get_template('index.html') 
    context = RequestContext(request,{ 'username': username}) 
    return HttpResponse(template.render(context)) 

Второе решение :

Manually import and use the processor to generate the CSRF token and add it to the template context. e.g.:

И ваш код должен быть (как mcniac сказал вам):

def login(request): 
    logout(request) 
    username = password = '' 
    if request.method : 
     username = request.POST['username'] 
     password = request.POST['password']  
     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect('/main/') 
    context = { 'username': username} 
    context.update(csrf(request)) 
    return render(request, 'index.html',) 
+0

Я уже использовал {% csrf_token%} после формы. – user2833654

+0

Вы правильно закрыли и теги в вашем шаблоне Вы также можете попробовать использовать HttpResponse, а не просто визуализировать – Lucas

+0

Да, я закрыл все теги. Я также применил HttpResponse. Даже мысль об ошибке не решена :( – user2833654

Смежные вопросы