Django POST 提交问题解决.doc_第1页
Django POST 提交问题解决.doc_第2页
Django POST 提交问题解决.doc_第3页
Django POST 提交问题解决.doc_第4页
Django POST 提交问题解决.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

问题在使用Django搭建好测试环境后,写了一个提交POST表单提交留言的测试页面。如图:填写表单,点击“提交留言”按钮提交到服务器,却出现Forbidden (403)CSRF verification failed. Request aborted.由于之前使用GET方式提交表单内容测试均正常,就以为这个问题估计是配置问题没细看后边的帮助提示直接在网上搜索解决方案。一搜索发现相关网页很多,看来大家都遇到过这个问题,想着应该很快能解决。解决方案1:失败在settings.py的MIDDLEWARE_CLASSES加入django.middleware.csrf.CsrfResponseMiddleware,最终settings.pyMIDDLEWARE_CLASSES 配置部分的代码如下:123456789101112MIDDLEWARE_CLASSES = (mon.CommonMiddleware,django.contrib.sessions.middleware.SessionMiddleware,django.middleware.csrf.CsrfViewMiddleware,# adddjango.middleware.csrf.CsrfResponseMiddleware,# add enddjango.contrib.auth.middleware.AuthenticationMiddleware,django.contrib.messages.middleware.MessageMiddleware,# Uncomment the next line for simple clickjacking protection:# django.middleware.clickjacking.XFrameOptionsMiddleware,)保存,重新加载/comment/add页面提交留言测试。但在打开页面时出现500错误赶紧看了一下控制台,发现如下错误12345678910111213141516Traceback (most recent call last):File D:Python27libwsgirefhandlers.py, line 85, in runself.result = application(self.environ, self.start_response)File D:Python27libsite-packagesdjangocontribstaticfileshandlers.py, line 67, in _call_return self.application(environ, start_response)File D:Python27libsite-packagesdjangocorehandlerswsgi.py, line 219, in _call_self.load_middleware()File D:Python27libsite-packagesdjangocorehandlersbase.py, line 51, inload_middlewareraise exceptions.ImproperlyConfigured(Middleware module %s does not define a %s class % (mw_module, mw_classname)ImproperlyConfigured: Middleware module django.middleware.csrf does not definea CsrfResponseMiddleware class12/Sep/2012 11:00:35 GET /comment/add/ HTTP/1.1 500 59大致的意思是我刚才在settings.py的MIDDLEWARE_CLASSES内添加的django.middleware.csrf.CsrfResponseMiddleware,这个模块找不到,当时就有点郁闷了。网上一大堆都说是添加这个模块解决问题的,现在我本机上添加这个模块以后却提示没有找到模块?为此,我重新把Django重新安装了一遍还是提示找不到模块。我只好到官网去看看手册,才发现Django新版已去掉这个模块。而我的Django正好是最新版本1.4只好放弃这个方案!解决方案2:失败在视图里使用csrf_protect修饰于是我在views.py文件里的add函数前加了csrf_protect修饰符,如下代码:1234567891011121314# Create your views here.# coding=utf-8from django.shortcuts import render_to_responseimport datetimecsrf_protectdef add(request):dict=if request.method=POST:comment=request.POST.get(comment,)submit_time=datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)dict.setdefault(comment,comment)dict.setdefault(submit_time,submit_time)return render_to_response(comment/add.html,dict)打开留言页面发现又有一个错误提示NameError at /comment/add/name csrf_protect is not defined提示找不到我刚才添加的修饰符csrf_protect,应该是没有导入相关模块的问题,于是在我的视图views.py头部添加了一句代码导入相关模块from django.views.decorators.csrf import csrf_protect保存文件,重新打开网页,错误已清除。心中一阵大喜,以为OK了。谁知提交留言以后还是提示Forbidden (403)CSRF verification failed. Request aborted.有点急了,只好继续搜索其它解决方案解决方案3:失败在模板页的from表单标签内添加% csrf_token %添加以后的代码如下重新打开页面测试,依旧提示:Forbidden (403)CSRF verification failed. Request aborted.有点火大了!解决方案4:成功一番折腾不能解决问题,于是只好冷静的查看错误页面的提示帮助。第一个提示表示浏览器要开启cookie,我的是IE9浏览器,毋庸置疑默认是开启的。第三个与第四个方案我都已测试过,唯独第二个方案我没有仔细研究。问题会不会在哪里呢?于是到官网文档寻找The view function uses RequestContext for the template, instead of Context.这句英文大致的意思是要在视图里使用RequestContext这个方法,最终在官网文档找到了以下解决方案在return render_to_response函数里加入context_instance=RequestContext(request),代码如下:return render_to_response(comment/add.html,dict,context_instance=RequestContext(request)重新运行网页,又提示新的错误NameError at /comment/add/global name RequestContext is not defined提示找不到RequestContext,估计是我没有导入RequestContext模块,于是在把from django.shortcuts import render_to_response改写成from django.shortcuts import render_to_response,RequestContext视图整体代码如下:123456789101112131415# Create your views here.# coding=utf-8from django.shortcuts import render_to_response, RequestContextimport datetimefrom django.views.decorators.csrf import csrf_protectcsrf_protectdef add(request):dict=if request.method=POST:comment=request.POST.get(comment,)submit_time=datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)dict.setdefault(comment,comment)dict.setdefault(submit_time,submit_time)return render_to_response(comment/add.html,dict,context_instance=RequestContext(request)重新运行网页正常,提交留言终于成功了回顾优化虽然折腾了半天才解决,但还是感觉有点糊里糊涂的。根据之前报错最后一条提示信息If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data.大致意思是如果settings.py的MIDDLEWARE_CLASSES里不开启CsrfViewMiddleware那么就必须要在视图里使用csrf_protect模块修饰方法。我看看MIDDLEWARE_CLASSES里的设置,代码如下:123456789MIDDLEWARE_CLASSES = (mon.CommonMiddleware,django.contrib.sessions.middleware.SessionMiddleware,django.middleware.csrf.CsrfViewMiddleware,django.contrib.auth.middleware.AuthenticationMiddleware,django.contrib.messages.middleware.MessageMiddleware,# Uncomment the next line for simple clickjacking protection:# django.middleware.clickjacking.XFrameOptionsMiddleware,)默认我的MIDDLEWARE_CLASSES已经给我开启了CsrfViewMiddleware这个模块。按照提示帮助,我可以把视图views.py里的修饰模块去掉应该也可以,于是注释了csrf_protect修饰符与包含模块语句,最终代码如下:123456789101112131415# Create your views here.# coding=utf-8from django.shortcuts import render_to_response, RequestContextimport datetime# from django.views.decorators.csrf import csrf_protect# csrf_protectdef add(request):dict=if request.method=POST:comment=request.POST.get(comment,)submit_time=datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)dict.setdefault(comment,comment)dict.setdefault(submit_time,submit_time)return render_to_response(comment/add.html,dict,context_instance=RequestContext(request)测试成功!什么是CSRF问题是解决了,但我不禁回想为什么在Django里提交POST表单要配置那么麻烦(其实也不麻烦,但对新手来说就不一样了),于是搜索关键字看看,得知它是一种跨站请求伪造,黑客可以利用这个攻击站点。而Django里的使用这个机制就是防止CSRF模式攻击,原理大致是当你打开页面的时候产生一个csrftokey种下cookie,然后当你提交表单时会把本地cookie里的csrftokey值给提交服务器,服务器判断只有有效的csrf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论