2013-04-23 154 views
1

這是一個非常古老的問題以及與此相關的許多類似結果,但我無法找到正確的解決方法。Django CSRF驗證CSRF驗證失敗。請求異常終止

我使用Django 1.5的工作,我有一個非常簡單的嘗試嘗試使用 「郵報」的形式與Django的:我創建了一個「注意」應用程序在Django項目「webnote」, 當URL是「/注/「它會簡單地顯示錶格和一個簡單的歡迎信息當我點擊提交時,我預計它會顯示另一個簡單的 welcome1信息。

下面是相關文件

注/ models.py

from django.db import models 
from datetime import datetime, date,time 
from django.utils import timezone 



class Title(models.Model): 
    title =models.CharField(max_length=2000) 
    def __unicode__(self): 
     return self.title 

注/ views.py

from django.template import Context, loader 
from django.shortcuts import get_object_or_404, render 
from django.http import HttpResponseRedirect, HttpResponse, Http404 
from django.core.urlresolvers import reverse 
from note.models import Title 
from django.core.context_processors import csrf 

def index(request): 
    template = loader.get_template('note/index.html') 
    context = Context({ 
        'Name':"Guys", 
        }) 
    return HttpResponse(template.render(context)) 


def insert(request): 
    #return HttpResponse("Hello World, This is the Index Page") 
    return render(request, 'note/index.html', {'Name':"NewGuy"}) 

模板/ NOTE/index.html的

<html> 
<body> 
    Hello {{ Name }}, Welcome! 
    <form action="insert/" method="post"> 

     {% csrf_token %} 

     <h6>Title</h6> 
     <input type="text" name="title_input" value="Please Input Title"> 
     <input type="submit" name="SB" value="insert"> 
    </form> 

</body> 
</html> 

一個可能不是那個相關文件是

setting.py

DEBUG = True 
TEMPLATE_DEBUG = DEBUG 

ADMINS = (

) 

MANAGERS = ADMINS 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'webnote',      
     'USER': 'root', 
     'PASSWORD': '', 
     'HOST': '',      
     'PORT': '3306',      
    } 
} 

ALLOWED_HOSTS = [] 

TIME_ZONE = 'America/New_York' 

LANGUAGE_CODE = 'en-us' 

SITE_ID = 1 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 

MEDIA_ROOT = '' 

MEDIA_URL = '' 

STATIC_ROOT = '' 

STATIC_URL = '/static/' 

STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
) 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
# 'django.contrib.staticfiles.finders.DefaultStorageFinder', 
) 

SECRET_KEY = '[email protected]_0([email protected]$wlbgo2+y30*98ab*ne^)@98!zpq_w-' 

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 

) 

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
) 

ROOT_URLCONF = 'webnote.urls' 

WSGI_APPLICATION = 'webnote.wsgi.application' 

TEMPLATE_DIRS = (

    '/www/webnote/note/templates/note' 
) 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'note' 
) 


LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse' 
     } 
    }, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler' 
     } 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
     }, 
    } 
} 

我想在這個論壇上類似的(相同的)問題中提及的幾個方法。 喜歡:

1.使用選擇render_to_response

2.Explicitly使用RequestContext的更換背景

+0

難道您發佈'urls.py'藏漢? – 2013-04-23 06:42:13

+0

你應該嘗試使用相反的功能而不是相對的'insert /'路徑,你的視圖似乎也沒有提供任何形式的處理方式。你有沒有嘗試'render_to_response('app_name/template_name.html',{},context_instance = RequestContext(request))' – 2013-04-23 07:24:42

回答

2

您需要使用CSRF上正在生成擺在首位的形式以及視圖。大多數情況下,人們使用相同的視圖來處理POST:出於某種原因,你已經將它們分成了兩個,如果你真的想要,但是你必須使用render(或者RequestContext或者其他) GET視圖也是如此,因爲它負責生成並輸出在POST中檢查過的令牌。

所以,你index視圖應該僅僅是:

def index(request): 
    return render(request, 'note/index.html', {'Name':"Guys"}) 
+0

非常感謝。我將所有的視圖功能都改成了這種格式,並且它可以工作。 – mitweyl 2013-04-24 05:46:26

+0

我使用''render''並將''{%csrf_token%}''放在窗體中,但我仍然收到這個失敗的錯誤,有什麼想法嗎? – doniyor 2014-03-29 07:33:16

相關問題