现象

表单界面例如以下:

在点击提交之后,出现例如以下错误页面:

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验证失败 ) 的两种解决方式相关推荐

  1. django种表单post出现CSRF verification failed( CSRF验证失败 ) 的两种解决方案

    现象 表单界面如下: 在点击提交之后,出现如下错误页面: HTML的代码如下: contact_form.html <!DOCTYPE HTML PUBLIC ><html> ...

  2. php ajax jquery 表单重复提交,jQuery的 $.ajax防止重复提交的两种方法(推荐)

    下面给大家带来两种关于jquery 的ajax防止重复提交的解决方法,具体介绍如下所示: 1.第一种,对于onclick事件触发的的ajax 可以采用如下方法: 即在beforeSend中使点击按钮不 ...

  3. Python Django提交表单时报错:Forbidden (403) CSRF verification failed. Request aborted.

    报错截图: 解决方法: 把settings里面一个叫csrf的安全机制的注释掉即可. MIDDLEWARE = ['django.middleware.security.SecurityMiddlew ...

  4. Django提交表单报错:CSRF token missing or incorrect.

    1.在Django提交表单时报错:Django提交表单报错: CSRF token missing or incorrect 具体报错页面如下: 2.有道词典翻译后如下: 通常,当存在真正的跨站点请求 ...

  5. Django POST CSRF verification failed. Request abor

    问题 在使用Django搭建好测试环境后,写了一个提交POST表单提交留言的测试页面. 如图: 填写表单,点击"提交留言"按钮提交到服务器,却出现 Forbidden (403) ...

  6. Django web : CSRF verification failed. Request aborted.

    错误标题:CSRF verification failed. Request aborted. 错误描述: HelpReason given for failure:CSRF cookie not s ...

  7. Django 3.1.5, CSRF verification failed. Request aborted.

    post请求django的时候出现:CSRF verification failed. Request aborted 问题翻译: 一般而言,这可以发生时,有一个真正的跨站请求伪造,或当Django的 ...

  8. django的表单系统

    1.概述: django表单系统中,自定义表单类都是以django.forms.Form为父类进行创建: django中的Form一般有两种功能: 生成特定的HTML标签 后台验证用户提交的数据 2. ...

  9. c语言实现用户注册,Django HTML表单实现用户注册

    在本节我们将进入逻辑性较强的代码环节,主要以实现项目中功能为主,并且会穿插介绍一些知识点,带领大家对之前讲过的知识进行重点复习,做到温故而知新.在以下几节中我们将重点介绍如何实现 Django 的注册 ...

  10. post 表单中常见的四种表单请求方式

    //post 表单中常见的四种表单请求方式 typedef enum {     postformURLEncoded,                 /*对应Content-Type: appli ...

最新文章

  1. 值得推荐的8个超强工具,让你万事无忧!
  2. openssl生成证书linux,linux中openssl生成证书和自签证书linux操作系统 -电脑资料
  3. Java设计模式思维导图
  4. WebService到底是什?
  5. 病毒式营销案例:多芬让“病毒”的诱惑自发传递
  6. 更改整个目录文件的所有权限
  7. Android ContentProvider实现两个程序间数据共享demo,跨进程通讯
  8. 《TensorFlow 2.0深度学习算法实战教材》学习笔记(二、回归问题和分类问题)
  9. Atitit 软件程序的定义 软件广义定义 程序代码,文档 ,数据 方法,规则, 狭义定义 软件=程序+数据+文档 软件(英文:Software)是一系列按照特定顺序组织的计算机数据和指
  10. C#做小工具的时候碰到的问题
  11. 本科专业计算机课程,本科计算机专业有哪些课程
  12. 基于SSH的医药管理系统
  13. Auto Layout 使用心得—— 实现三等分
  14. 三种设计满足需求 网吧网络解决方案(转)
  15. dataframe排序 pd.rank()
  16. xilinx ku115上pciex1 的眼图
  17. css画三角形、梯形
  18. OTTO机器人之APP蓝牙控制
  19. 【Python123】 存款买房(B)
  20. java 垃圾回收题目_Java垃圾收集题目分析

热门文章

  1. 用python进行人脸识别
  2. Outlook验证服务器证书,OUTLOOK2019 解决 无法验证您连接到的服务器使用的安全证书...
  3. FISCO BCOS源码(3)线程交互和交易的生命周期
  4. consul mysql 检查_MySQL在Consul服务中的健康检查逻辑
  5. SpringMVC学习(三)RestFul风格
  6. 数据结构和算法——堆排序
  7. 鸿蒙系统自主研发,华为鸿蒙OS系统规划曝光,原来国产自主研发系统已经如此强大...
  8. Unity3D(二)游戏对象及组件
  9. 9)Thymeleaf ⼯具类对象表达式
  10. mysql limit报错_mysql limit 附近老是报错,求帮助!