django种表单post出现CSRF verification failed( CSRF验证失败 ) 的两种解决方式
现象
表单界面例如以下:
在点击提交之后,出现例如以下错误页面:
HTML的代码例如以下:
contact_form.html
<!DOCTYPE HTML PUBLIC ><html>
<head><title>Contact us</title>
</head><body><h1>Contact us</h1>{% if errors %}<ul>{% for error in errors %}<li>{{ error }}</li>{% endfor %}</ul>{% endif %}<form action="/contact/" method="post"><p>Subject: <input type="text" name="subject" value="{{ subject }}"></p><p>Your e-mail (optional): <input type="text" name="email" value="{{ email }}"></p><p>Message: <textarea name="message" rows="10" cols="50">{{ message }}</textarea></p><input type="submit" value="Submit"></form>
</body>
</html>
view代码例如以下:
view.py
# -*- coding: utf-8 -*-from django.core.mail import send_mail
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_responsedef contact(request):errors = []if request.method == 'POST':if not request.POST.get('subject', ''):errors.append('Enter a subject.')if not request.POST.get('message', ''):errors.append('Enter a message.')if request.POST.get('email') and '@' not in request.POST['email']:errors.append('Enter a valid e‐mail address.')if not errors:send_mail(request.POST['subject'],request.POST['message'],request.POST.get('email', 'noreply@example.com'),['siteowner@example.com'],)return HttpResponseRedirect('/contact/thanks/')return render_to_response('contact_form.html', {'errors': errors,'subject': request.POST.get('subject', ''),'message': request.POST.get('message', ''),'email': request.POST.get('email', ''),})
一般浏览器都是开启了cookies的,所以在上面图中的错误信息中。我们主要关注后三点,依据提示进行更改:
解决方式一:CSRF验证设置
1. 在 view.py 中的 render_to_response 中,使用 RequestContext 来取代默认的 Context 。
view.py
# -*- coding: utf-8 -*-from django.core.mail import send_mail
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContextdef contact(request):errors = []if request.method == 'POST':if not request.POST.get('subject', ''):errors.append('Enter a subject.')if not request.POST.get('message', ''):errors.append('Enter a message.')if request.POST.get('email') and '@' not in request.POST['email']:errors.append('Enter a valid e‐mail address.')if not errors:send_mail(request.POST['subject'],request.POST['message'],request.POST.get('email', 'noreply@example.com'),['siteowner@example.com'],)return HttpResponseRedirect('/contact/thanks/')return render_to_response('contact_form.html', {'errors': errors,'subject': request.POST.get('subject', ''),'message': request.POST.get('message', ''),'email': request.POST.get('email', ''),},context_instance=RequestContext(request))
2. 在模板文件里的 form 表单内加入 {% csrf_token %} 。
contact_form.html
<!DOCTYPE HTML PUBLIC ><html>
<head><title>Contact us</title>
</head><body><h1>Contact us</h1>{% if errors %}<ul>{% for error in errors %}<li>{{ error }}</li>{% endfor %}</ul>{% endif %}<form action="/contact/" method="post"><br />{% csrf_token %}<br /><p>Subject: <input type="text" name="subject" value="{{ subject }}"></p><p>Your e-mail (optional): <input type="text" name="email" value="{{ email }}"></p><p>Message: <textarea name="message" rows="10" cols="50">{{ message }}</textarea></p><input type="submit" value="Submit"></form>
</body>
</html>
測试执行,成功!
PS:上文中图片中的错误信息第四条,在建立djangoproject的时候 setting.py 已经自己主动加入了 'django.middleware.csrf.CsrfViewMiddleware',
MIDDLEWARE_CLASSES = ('django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.auth.middleware.SessionAuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','django.middleware.security.SecurityMiddleware','django.middleware.locale.LocaleMiddleware',
)
解决方式二:不使用 CSRF 验证
1. 在 setting.py 文件里删除 'django.middleware.csrf.CsrfViewMiddleware', ,例如以下所看到的
MIDDLEWARE_CLASSES = ('django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',#'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.auth.middleware.SessionAuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','django.middleware.security.SecurityMiddleware','django.middleware.locale.LocaleMiddleware',
)
2. 移除 form 表单中的 {% csrf_token %} 标记。例如以下所看到的:
contact_form.html
<!DOCTYPE HTML PUBLIC ><html>
<head><title>Contact us</title>
</head><body><h1>Contact us</h1>{% if errors %}<ul>{% for error in errors %}<li>{{ error }}</li>{% endfor %}</ul>{% endif %}<form action="/contact/" method="post"><p>Subject: <input type="text" name="subject" value="{{ subject }}"></p><p>Your e-mail (optional): <input type="text" name="email" value="{{ email }}"></p><p>Message: <textarea name="message" rows="10" cols="50">{{ message }}</textarea></p><input type="submit" value="Submit"></form>
</body>
</html>
3. 在 view.py 中的 render_to_response 中,不使用 RequestContext 。例如以下所看到的:
view.py
# -*- coding: utf-8 -*-from django.core.mail import send_mail
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContextdef contact(request):errors = []if request.method == 'POST':if not request.POST.get('subject', ''):errors.append('Enter a subject.')if not request.POST.get('message', ''):errors.append('Enter a message.')if request.POST.get('email') and '@' not in request.POST['email']:errors.append('Enter a valid e‐mail address.')if not errors:send_mail(request.POST['subject'],request.POST['message'],request.POST.get('email', 'noreply@example.com'),['siteowner@example.com'],)return HttpResponseRedirect('/contact/thanks/')return render_to_response('contact_form.html', {'errors': errors,'subject': request.POST.get('subject', ''),'message': request.POST.get('message', ''),'email': request.POST.get('email', ''),})
又一次执行,測试成功!
转载于:https://www.cnblogs.com/bhlsheji/p/5331633.html
django种表单post出现CSRF verification failed( CSRF验证失败 ) 的两种解决方式相关推荐
- django种表单post出现CSRF verification failed( CSRF验证失败 ) 的两种解决方案
现象 表单界面如下: 在点击提交之后,出现如下错误页面: HTML的代码如下: contact_form.html <!DOCTYPE HTML PUBLIC ><html> ...
- php ajax jquery 表单重复提交,jQuery的 $.ajax防止重复提交的两种方法(推荐)
下面给大家带来两种关于jquery 的ajax防止重复提交的解决方法,具体介绍如下所示: 1.第一种,对于onclick事件触发的的ajax 可以采用如下方法: 即在beforeSend中使点击按钮不 ...
- Python Django提交表单时报错:Forbidden (403) CSRF verification failed. Request aborted.
报错截图: 解决方法: 把settings里面一个叫csrf的安全机制的注释掉即可. MIDDLEWARE = ['django.middleware.security.SecurityMiddlew ...
- Django提交表单报错:CSRF token missing or incorrect.
1.在Django提交表单时报错:Django提交表单报错: CSRF token missing or incorrect 具体报错页面如下: 2.有道词典翻译后如下: 通常,当存在真正的跨站点请求 ...
- Django POST CSRF verification failed. Request abor
问题 在使用Django搭建好测试环境后,写了一个提交POST表单提交留言的测试页面. 如图: 填写表单,点击"提交留言"按钮提交到服务器,却出现 Forbidden (403) ...
- Django web : CSRF verification failed. Request aborted.
错误标题:CSRF verification failed. Request aborted. 错误描述: HelpReason given for failure:CSRF cookie not s ...
- Django 3.1.5, CSRF verification failed. Request aborted.
post请求django的时候出现:CSRF verification failed. Request aborted 问题翻译: 一般而言,这可以发生时,有一个真正的跨站请求伪造,或当Django的 ...
- django的表单系统
1.概述: django表单系统中,自定义表单类都是以django.forms.Form为父类进行创建: django中的Form一般有两种功能: 生成特定的HTML标签 后台验证用户提交的数据 2. ...
- c语言实现用户注册,Django HTML表单实现用户注册
在本节我们将进入逻辑性较强的代码环节,主要以实现项目中功能为主,并且会穿插介绍一些知识点,带领大家对之前讲过的知识进行重点复习,做到温故而知新.在以下几节中我们将重点介绍如何实现 Django 的注册 ...
- post 表单中常见的四种表单请求方式
//post 表单中常见的四种表单请求方式 typedef enum { postformURLEncoded, /*对应Content-Type: appli ...
最新文章
- 值得推荐的8个超强工具,让你万事无忧!
- openssl生成证书linux,linux中openssl生成证书和自签证书linux操作系统 -电脑资料
- Java设计模式思维导图
- WebService到底是什?
- 病毒式营销案例:多芬让“病毒”的诱惑自发传递
- 更改整个目录文件的所有权限
- Android ContentProvider实现两个程序间数据共享demo,跨进程通讯
- 《TensorFlow 2.0深度学习算法实战教材》学习笔记(二、回归问题和分类问题)
- Atitit 软件程序的定义 软件广义定义 程序代码,文档 ,数据 方法,规则, 狭义定义 软件=程序+数据+文档 软件(英文:Software)是一系列按照特定顺序组织的计算机数据和指
- C#做小工具的时候碰到的问题
- 本科专业计算机课程,本科计算机专业有哪些课程
- 基于SSH的医药管理系统
- Auto Layout 使用心得—— 实现三等分
- 三种设计满足需求 网吧网络解决方案(转)
- dataframe排序 pd.rank()
- xilinx ku115上pciex1 的眼图
- css画三角形、梯形
- OTTO机器人之APP蓝牙控制
- 【Python123】 存款买房(B)
- java 垃圾回收题目_Java垃圾收集题目分析
热门文章
- 用python进行人脸识别
- Outlook验证服务器证书,OUTLOOK2019 解决 无法验证您连接到的服务器使用的安全证书...
- FISCO BCOS源码(3)线程交互和交易的生命周期
- consul mysql 检查_MySQL在Consul服务中的健康检查逻辑
- SpringMVC学习(三)RestFul风格
- 数据结构和算法——堆排序
- 鸿蒙系统自主研发,华为鸿蒙OS系统规划曝光,原来国产自主研发系统已经如此强大...
- Unity3D(二)游戏对象及组件
- 9)Thymeleaf ⼯具类对象表达式
- mysql limit报错_mysql limit 附近老是报错,求帮助!