2013-04-23 162 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

相关问题