Form验证

django中的Form一般有两种功能:

  • 输入html
  • 验证用户输入

django使用内置form方法验证表单提交的数据

  • html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
.error-msg {
color: red;
}
</style>
</head>
<body>
<div>
<div>
用户名:<input type="text" name="user" />
</div>
<div>
密码:<input type="password" name="pwd" />
</div>
<div>
数字 <input type="text" name="num" />
</div>
<div>
手机号<input type="text" name="phone" />
</div>
<div>
邮箱<input type="text" name="email" />
</div>
<input type="button" value="提交" onclick="DoSubmit();" />
</div>
<script src="/static/js/jquery-1.12.4.js"></script>
<script>
function DoSubmit(){
var input_dict = {};
$('input').each(function(){
var v = $(this).val();
var n = $(this).attr('name');
input_dict[n] = v;
});
$.ajax({
url: '/login/',
type: 'POST',
data: input_dict,
dataType:'json',
success: function (result) {
if (result.status) {
location.href = 'www.baidu.com';
} else {
$.each(result.message, function (k,v) {
var tag = document.createElement('span');
tag.className = 'error-msg';
tag.innerText = v[0].message;
$('input[name="' + k + '"]').siblings('span').remove();
$('input[name="' + k + '"]').after(tag);
})
}
}
})
}
</script>
</body>
</html>
  • views函数
from  django import forms
import json
from django.core.exceptions import ValidationError
import re #自定义验证规则
def mobile_validate(value):
mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
if not mobile_re.match(value):
raise ValidationError('手机号码格式错误') #定义验证规则
class MyForm(forms.Form):
user = forms.CharField(required=True, error_messages={'required': '用户名不能为空.'})
pwd = forms.CharField(required=True,
min_length=6, #最少长度
max_length=10, #最大长度
error_messages={'required': '密码不能为空.', 'min_length': "至少6位"}, #不合法提示信息
widget=forms.PasswordInput) #输入类型 num = forms.IntegerField(error_messages={'required': '数字不能空.', 'invalid': '必须输入数字'})
email = forms.EmailField(required=True,error_messages={'required': '邮箱不能空.', 'invalid': '邮箱格式错误'})
#应用自定义验证规则
phone = forms.CharField(required=True,validators=[mobile_validate,],error_messages={'required':'请填写手机号'} ) def login(request):
if request.method == 'POST':
result = {'status':False,'message':None}
obj = MyForm(request.POST)
ret = obj.is_valid()
if ret:
msg = obj.clean()
result['status'] = True
result['message'] = msg
else:
msg = obj.errors.as_json() #将异常信息以json格式输出
result['status'] = False
result['message'] = json.loads(msg)
print(result)
return HttpResponse(json.dumps(result))
else:
return render(request,'login.html')
  • url 配置略
  • 效果:

  • 涉及的知识点:

    • 1.html中form表单name的值需要和自己定义的类中的值必须一样,如input中name=user,那么,在class中对应的就是user=**的规则
    • 2.obj = MyForm(request.POST) 创建完对象之后,对象obj常用的方法有:
      • is_valid() 判断是否验证合法
      • clean() 取出request中验证通过的正确信息
      • errors 输出request中验证不通过的提示信息,子方法有 as_json() 以json格式输出、as_ul()以列表形式输出、 as_text()以字符串形式输出
    • 3.ajax拿到服务器返回的信息之后,判断message中status是否为True,为True则执行下一步操作,为false,则创建span标签,提示错误信息
    • 4.自定义验证规则:
      • 1)导入from django.core.exceptions import ValidationError
      • 2)定义验证函数,如果验证不通过,则使用raise主动抛出ValidationError错误信息
      • 3)在类中使用validators=[mobile_validate,]应用规则

django使用form生成表单,并做提交数据验证

上面的例子是在html中直接使用form表单,然后利用ajax提交数据到后台进行验证,下面的例子使用django生成form表单里的元素,然后进行提交验证

  • html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
.error-msg {
color: red;
}
</style>
</head>
<body>
<form>
<div>
<div>
用户名: {{ obj.user }}
{% if obj.errors.user %}
<span class="error-msg"> {{ obj.errors.user.0 }}</span>
{% endif %}
</div>
<div>
密码:{{ obj.pwd }}
{% if obj.errors.pwd %}
<span class="error-msg"> {{ obj.errors.pwd.0 }}</span>
{% endif %}
</div>
<div>
数字:{{ obj.num }}
{% if obj.errors.num %}
<span class="error-msg"> {{ obj.errors.num.0 }}</span>
{% endif %}
</div>
<div>
手机号: {{ obj.phone }}
{% if obj.errors.phone %}
<span class="error-msg"> {{ obj.errors.phone.0 }}</span>
{% endif %}
</div>
<div>
邮箱: {{ obj.email }}
{% if obj.errors.email %}
<span class="error-msg"> {{ obj.errors.email.0 }}</span>
{% endif %}
</div>
<input type="submit" value="提交" />
</div>
</form> </body>
</html>
  • view
def login2(request):
if request.POST:
objPost = MyForm(request.POST)
ret = objPost.is_valid()
if ret:
print(objPost.clean())
else:
from django.forms.utils import ErrorDict
#print(type(obj.errors),obj.errors.as_json())
# obj1.errors
pass
return render(request, 'login2.html',{'obj': objPost})
else:
objGet = MyForm()
return render(request, 'login2.html',{'obj': objGet})
  • url略
  • 涉及知识点
    • 1. 给django生成的标签应用样式和类型 widget 指定生成的标签类型 attr={'k1':'123'} 指定属性 完整配置: pwd=forms.CharField(widget=forms.PasswordInput(attr={'k1':'123'}))
    • 2.生成select标签

 

test_choices = (
(0, '上海'),
(1, '背景'),
)
test = forms.IntegerField(widget=forms.Select(choices=test_choices))


跨站伪造csrf

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

  • 全局:

  中间件 django.middleware.csrf.CsrfViewMiddleware

  • 局部:

    • @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
    • @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
      注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

CSRF实现原理

  • 1.django在打开这个页面时就会给页面一个授权token,会分别在插入在cookie和给当前页面表单中插入一个input标签,所以浏览器必须开启cookie,或者表单中必须使用模版语言承接token
  • 2.对于普通表单,当点击submit之后,token会跟其他表单数据提交到后台,csrf拿到token之后,验证通过,否则返回403;对于ajax请求,则需要获取cookie中的token,然后特殊处理,进行提交
    ##实现过程
    ###普通表单
  • views配置
def csrf(request):
return render(request,'csrf.html')
  • html配置
<form action="csrf.html" method="post">
<input type="text">
<input type="submit" value="form提交">
{% csrf_token%} //承接csrf的token
</form>

打开html之后,发现,在html form表单中已经得道token

cookie中也得道了token

ajax使用token

  • html配置

需加入jquery.cookie插件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="csrf.html" method="post">
<input type="text">
<input type="submit" value="form提交">
<!--{% csrf_token%}-->
</form>
<input type="button" value="Ajax提交" onclick="ajaxpost();"> <script src="/static/js/jquery-1.12.4.js"></script>
<script src="/static/js/jquery.cookie.js"></script> <script>
var csrftoken = $.cookie('csrftoken');
function csrfSafeMethod(method) {
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function (xhr,settings) {
if (!csrfSafeMethod(settings.type) && (!this.crossDomain)) {
xhr.setRequestHeader("X-CSRFToken",csrftoken);
}
}
});
function ajaxpost() {
$.ajax({
url:'/csrf/',
type:'post',
data:{'k1':'v1'},
success: function (data) {
console.log(data)
} });
}
</script> </body>
</html>

django表单验证和跨站伪造csrf的更多相关文章

  1. django 表单验证和字段验证

    表单验证和字段验证 表单验证发生在数据验证之后.如果你需要自定义这个过程,有几个不同的地方可以修改,每个地方的目的不一样.表单处理过程中要运行三种类别的验证方法.它们通常在你调用表单的is_valid ...

  2. Python菜鸟之路:Django 表单验证

    前言 Django中完成表单验证,常用的有两种方法: 一种是通过HTML + JS + Ajax实现. 另一种是通过Django自身的forms模块来生成相应个HTML标签来完成表单验证.这是本节着重 ...

  3. 17.Django表单验证

    Django提供了3中方式来验证表单 官网文档:https://docs.djangoproject.com/en/1.9/ref/validators 1.表单字段验证器 a.引入:from dja ...

  4. flask提交表单验证不通过,以及CSRF攻击原理

    学习表单的问题1. 提交表单时怎么都无法验证通过 记录一下,自己的学习bug,主要是因为在模板中书写渲染的语句时,把CSRF的字段名写错了. 因为在模板中书写一些语句是没有提示的,自己手动敲代码容易出 ...

  5. Django表单验证

    从前端提交的各种数据可能存缺少必要字段以及包含非法数据等问题, 并且通常需要进行类型转换后才可以交由业务逻辑处理. 我们当然可以在控制器(Django的views函数)中完成这些工作, 但是这样会使控 ...

  6. PHP防止跨站表单提交与同站跨页伪造表单的攻击

    在以前的防止跨站攻击的时候,使用了验证提交的页面是否是同一个站点,这样可以防止普通的攻击,ereg("blog.qita.in",$_SERVER['HTTP_REFERER']) ...

  7. python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)

    python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...

  8. Django实现表单验证、CSRF、cookie和session、缓存、数据库多表操作(双下划綫)

    通常验证用户输入是否合法的话,是前端js和后端共同验证的,这是因为前端js是可以被禁用的,假如被禁用了,那就没法用js实现验证合法与否了,也就是即使用户输入的不合法,但是也没提示,用户也不知道怎么输入 ...

  9. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

随机推荐

  1. 重新诠释的OSGi规范

    上周五部门开会讨论新一代产品(基于.net Winform)的设计规范,从设计规范慢慢讨论到体系结构等架构存在的问题,诸如菜单.工具条.状态条.界面布局等不能实现配置化和自动化,子系统之间拥有强依赖, ...

  2. wamp 服务器安装问题 及cmd常用命令 和 php mysql数据库常用cmd命令集

    1   官网下载wamp软件包,根据提示安装 2   目录结构:   wamp:   bin/为套件目录 包括mysql apache php log   日志记录 alias 配置 apps 数据库 ...

  3. arcgis 许可异常的解决

    异常现象: arcgis 许可服务管理器中无法重新读取许可,许可服务启动后立即停止.         解决方法: 1.卸载license:安装新的license!重新破解,替换license文件夹BI ...

  4. Log4j记录日志步骤

    记录日志对调试Bug很有帮助  亲身体会 个人习惯用Log4J,大家可以在apache网站:jakarta.apache.org/log4j 可以免费下载到Log4j最新版本的软件包. Log4j支持 ...

  5. 原创 C++之常量(一)

    1概述 一个C++程序就是一系列数据与操作的集合.当一个C++程序开始运行的时候,与该程序相关的数据就会被加载到内存中.当数据与内存发生关联的时候,这些数据就会具有如下的特性: 数据在内存中的地址.这 ...

  6. (八)map,filter,flatMap算子-Java&Python版Spark

    map,filter,flatMap算子 视频教程: 1.优酷 2.YouTube 1.map map是将源JavaRDD的一个一个元素的传入call方法,并经过算法后一个一个的返回从而生成一个新的J ...

  7. webform(八)——LinQ简单增、删、改、查

    一.简单介绍 1.LinQ to Sql类(NET Language Integrated Query (LINQ) ) LINQ定义了大约40个查询操作符,如select.from.in.where ...

  8. [AlwaysOn Availability Groups]使用Powershell监控AlwayOn健康

    使用Powershell监控AlwayOn健康 1.基本命令概述 AlwayOn Dashboard是很有用的查看整体AG健康状况的工具.但是这个工具不是用于7*24监控的.如果应用程序夜间发送严重的 ...

  9. 优化SQLServer--表和索引的分区(二)

    简介 之前一篇简单的介绍了语法和一些基本的概念,隔了一段时间,觉得有必要细致的通过实例来总结一下这部分内容.如之前所说,分区就是讲大型的对象(表)分成更小的块来管理,基本单位是行.这也就产生了很大优势 ...

  10. 《Note --- Unreal 4 --- behavior tree》

    Web: https://docs.unrealengine.com/latest/INT/Engine/AI/BehaviorTrees/index.html Test project: D:\En ...