内容目录:

  • Django后台表单验证
  • CSRF加密传输
  • session、cookie
  • model数据库操作

Django后台Form表单验证

Django中Form一般有2种功能:

1、用于做用户提交数据的验证

  1. from django import forms
  2. class LoginForm(forms.Form):

基本验证demo

  1. from django.shortcuts import render,HttpResponse
  2. from django import forms
  3. import json
  4.  
  5. # Create your views here.
  6. class LoginForm(forms.Form):
  7. user = forms.CharField(required=True)
  8. pwd = forms.CharField(required=True)
  9.  
  10. def login(request):
  11. if request.method == 'POST':
  12. resault = {'status':False,'message':None}
  13. obj = LoginForm(request.POST)
  14. ret = obj.is_valid() #做Form的验证,如果填写正确返回为true否则返回false
  15. if ret:
  16. print(obj.clean())#正确时返回正确的值
  17. resault['status'] = True
  18. else:
  19. # print(type(obj.errors))#2通过Form方式来提交验证,错误时候打印错误信息类型,可以找到,
  20. # 通过错误类型导入ErrorDict模块,通过查看帮助信息,as_json方法,默认为as_ul方法
  21. from django.forms.utils import ErrorDict
  22. print(obj.errors.as_json())
  23. error_str = obj.errors.as_json()
  24. resault['message'] = json.loads(error_str)#这里由于上面的是一个字典格式需要先转换为字符串方式loads一下
  25. # return HttpResponse(error_str)#测试时候返回错误信息
  26. return HttpResponse(json.dumps(resault))
  27. # u = request.POST.get('user')#1正常情况ajax提交请求验证
  28. # p = request.POST.get('pwd')
  29. # print(u,p)
  30. return render(request,'login.html')

view--demo

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .error_msg{
  8. color: red;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13.  
  14. <div>
  15. <div>
  16. <p>用户名:<input type="text" name="user"/></p>
  17.  
  18. </div>
  19. <div>
  20. <p>密 码 :<input type="password" name="pwd"/></p>
  21. </div>
  22. <input type="button" value="提交" onclick="DoSubmit();" />
  23. </div>
  24. <script src="/static/jquery-1.8.2.min.js"></script>
  25. <script>
  26. function DoSubmit() {
  27. var input_dict = {};
  28. $('input').each(function () {
  29. var v = $(this).val();
  30. var n = $(this).attr('name');
  31. input_dict[n] = v;
  32. });
  33. console.log(input_dict);
  34. $('.error_msg').remove();
  35. $.ajax({
  36. url:'/login/',
  37. type:'POST',
  38. data:input_dict,
  39. dataType:'json',//默认返回过来的值为str字符串,可以通过转换为json,打印data为一个对象
  40. success:function (resault) {
  41. {# console.log(data);#}//打印data的值
  42. if (resault.status){
  43. location.href = '/index/'
  44. }else {
  45. $.each(resault.message,function (k,v) {//json方式转换为对象格式所以循环这个对象,因为这个对象为字典方式所以定义k和v
  46. {# console.log(k,v);#}
  47. console.log(k,v[0].message);//打印input的name和错误信息
  48. {# <span class="error_msg">错误信息</span>#}
  49. //将错误信息添加一个span标签到input后面
  50. var tag = document.createElement('span');
  51. tag.className = 'error_msg';
  52. tag.innerText = v[0].message;
  53. //input[name="user"]
  54. $('input[name="' +k +'"]').after(tag)
  55. })}
  56. }
  57. })
  58. }
  59.  
  60. </script>
  61.  
  62. </body>
  63. </html>

login.html

上面的提示中都是英文我们可以自定义自己的报错中文提示方式

只需要更改上面的views代码中LoginForm的类

  1. class LoginForm(forms.Form):
  2. user = forms.CharField(required=True,error_messages={'required':'用户名不能为空'})#中文提示
  3. pwd = forms.CharField(required=True,
  4. min_length=6,#最小长度为6
  5. #(默认提示Ensure this value has at least 6 characters (it has 3).)
  6. max_length=10,
  7. error_messages={'required': '密码不能为空',
  8. 'min_length':'最少6位',
  9. 'max_length':'最多10位'}
  10. )

上面的中我们使用的只是CharField字符类型,在实际的环境中我们可能会遇到数字的验证IntegerField

例如我们在上面的demo中添加一个num的文本框做数字的验证

  1. #required 默认为True,不填写该参数时候是treu
  2. num = forms.IntegerField(error_messages={'required': '数字不能为空',
  3. 'invalid':'输入的必须为数字',
  4. })

前端在密码后面添加上num的input文本框

  1. <div>
  2. <p>数 字 :<input type="text" name="num"/></p>
  3. </div>

效果展示

除了上面的两种类型外还有其他的我们常用的类型验证

CharField 字符类型验证
IntegerField 数字类型验证
URLField URL验证
EmailField 邮箱小地址验证

如果django不能满足我们需要的验证的话,我们还可以自定义的数字验证

  1. from django.core.exceptions import ValidationError
  2.  
  3. def mobile_validate(value):
  4. mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  5. if not mobile_re.match(value):
  6. raise ValidationError('手机号码格式错误')
  7. class LoginForm(forms.Form):
  8. phone = forms.CharField(validators=[mobile_validate,],)

效果展示

2、用于做用户提交数据的验证 + 生成HTML标签

  1. from django.shortcuts import render,HttpResponse
  2. from django import forms
  3. import json,re
  4. from django.core.exceptions import ValidationError
  5.  
  6. def mobile_validate(value):
  7. mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  8. if not mobile_re.match(value):
  9. raise ValidationError('手机号码格式错误')
  10.  
  11. # Create your views here.
  12. class LoginForm(forms.Form):
  13. user = forms.CharField(required=True,error_messages={'required':'用户名不能为空'})#中文提示
  14. pwd = forms.CharField(required=True,
  15. min_length=6,#最小长度为6(默认提示Ensure this value has at least 6 characters (it has 3).)
  16. max_length=10,
  17. error_messages={'required': '密码不能为空',
  18. 'min_length':'最少6位',
  19. 'max_length':'最多10位'}
  20. )
  21. #required 默认为True,不填写该参数时候是treu
  22. num = forms.IntegerField(error_messages={'required': '数字不能为空',
  23. 'invalid':'输入的必须为数字',
  24. })
  25. phone = forms.CharField(validators=[mobile_validate,],)
  26.  
  27. def login(request):
  28. if request.POST:
  29. objPost = LoginForm(request.POST)
  30. ret = objPost.is_valid() # 做Form的验证,如果填写正确返回为true否则返回false
  31. if ret:
  32. print(objPost.clean()) # 正确时返回正确的值
  33. else:
  34. from django.forms.utils import ErrorDict
  35. error_str = objPost.errors.as_json()
  36. # for k,v in objPost.errors.items():
  37. # print(k,v)
  38. # print(objPost.errors['user'][0])
  39. # print(objPost.errors['pwd'][0])
  40. # print(objPost.errors['num'][0])
  41. # print(objPost.errors['phone'][0])
  42. pass
  43. return render(request,'login.html',{'obj1':objPost})
  44. else:
  45. objGet = LoginForm()
  46. return render(request,'login.html',{'obj1':objGet})

views-demo

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .error_msg{
  8. color: red;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <form action="/login/" method="POST">
  14. <div>
  15. <div>
  16. <p>用户名:{{ obj1.user }}
  17. {% if obj1.errors.user %}
  18. <span class="error_msg">{{ obj1.errors.user.0 }}</span>
  19. {% endif %}
  20. </p>
  21.  
  22. </div>
  23. <div>
  24. <p>密 码 :{{ obj1.pwd }}
  25. {% if obj1.errors.pwd %}
  26. <span class="error_msg">{{ obj1.errors.pwd.0 }}</span>
  27. {% endif %}
  28. </p>
  29. </div>
  30. <div>
  31. <p>数 字 :{{ obj1.num }}
  32. {% if obj1.errors.num %}
  33. <span class="error_msg">{{ obj1.errors.num.0 }}</span>
  34. {% endif %}
  35. </p>
  36. </div>
  37. <div>
  38. <p>手 机 :{{ obj1.phone }}
  39. {% if obj1.errors.phone %}
  40. <span class="error_msg">{{ obj1.errors.phone.0 }}</span>
  41. {% endif %}
  42. </p>
  43.  
  44. </div>
  45. <input type="submit" value="提交" />
  46. </div>
  47. </form>
  48. </body>
  49. </html>

HTML-前端代码

通过后端来生成后端标签时候我们还可以定义自己的属性

  1. # test = forms.CharField(widget=forms.Textarea(attrs={'name': 'test'}))
  2. test_choices = (
  3. (0, '上海'),
  4. (1, '背景'),
  5. )
  6. test = forms.IntegerField(widget=forms.Select(choices=test_choices))

html代码

  1. <div>
  2. <p>测 试 :{{ obj1.test }}
  3. {% if obj1.errors.test %}
  4. <span class="error_msg">{{ obj1.errors.test.0 }}</span>
  5. {% endif %}
  6. </p>
  7. </div>

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

1、普通表单提交应用

  1. #setting中配置
  2. MIDDLEWARE_CLASSES = [
  3. 'django.middleware.csrf.CsrfViewMiddleware',
  4. ]
  5. #urls配置
  6. url(r'^csrf/', views.csrf),
  7.  
  8. #views配置
  9. def csrf(request):
  10. return render(request,'csrf.html')
  11.  
  12. #前端添加导入csrf_token配置
  13. <!DOCTYPE html>
  14. <html lang="en">
  15. <head>
  16. <meta charset="UTF-8">
  17. <title>Title</title>
  18. </head>
  19. <body>
  20. <form action="/csrf/" method="post">
  21. {% csrf_token %}
  22. <input type="text" name="v"/>
  23. <input type="submit" value="form提交" />
  24. </form>
  25. <input type="button" value="Ajax提交" onclick="DoAjax();" />
  26. </body>
  27. </html>

打开网页后调试模式我们能看到提交过来的一个字符串

2、Ajax提交应用

js脚本

  1. <script>
  2. var csrftoken = $.cookie('csrftoken');//从cookie获取值
  3. function csrfMethod(method) {
  4. return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  5. }
  6. //所有ajax发送请求之前执行该ajaxSetup配置
  7. $.ajaxSetup({
  8. beforeSend:function (xhr,settings) {
  9. if (!csrfMethod(settings.type) && !this.crossDomain){
  10. xhr.setRequestHeader("X-CSRFToken",csrftoken);
  11. }
  12. }
  13. });
  14. function DoAjax() {
  15. $.ajax({
  16. url:'/csrf/',
  17. type:'POST',
  18. data:{'k1':'v1'},
  19. success:function (data) {
  20. console.log(data);
  21. }
  22.  
  23. })
  24. }
  25. </script>

cookie、Session缓存

一、cookie

Cookie是保存在客户端浏览器上的一个容器

1、获取cookie

  1. request.COOKIES['key']
  2. request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
  3. 参数:
  4. default: 默认值
  5. salt: 加密盐
  6. max_age: 后台控制过期时间

2、设置cookie

  1. rep = HttpResponse(...) rep render(request, ...)
  2.  
  3. rep.set_cookie(key,value,...)
  4. rep.set_signed_cookie(key,value,salt='加密盐',...)
  5. 参数:
  6. key,
  7. value='',
  8. max_age=None, 超时时间
  9. expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
  10. path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
  11. domain=None, Cookie生效的域名
  12. secure=False, https传输
  13. httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

由于cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。

  1. <script src='/static/js/jquery.cookie.js'></script>
  2. $.cookie("list_pager_num", 30,{ path: '/' });

二、Session

一般Session依赖于cookie,Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

  • 数据库(默认)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

1、数据库Session

  1. Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
  2.  
  3. a. 配置 settings.py
  4.  
  5. SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
  6.  
  7. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
  8. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径(默认)
  9. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
  10. SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
  11. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
  12. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
  13. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
  14. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
  15.  
  16. b. 使用
  17.  
  18. def index(request):
  19. # 获取、设置、删除Session中数据
  20. request.session['k1']
  21. request.session.get('k1',None)
  22. request.session['k1'] = 123
  23. request.session.setdefault('k1',123) # 存在则不设置
  24. del request.session['k1']
  25.  
  26. # 所有 键、值、键值对
  27. request.session.keys()
  28. request.session.values()
  29. request.session.items()
  30. request.session.iterkeys()
  31. request.session.itervalues()
  32. request.session.iteritems()
  33.  
  34. # 用户session的随机字符串
  35. request.session.session_key
  36.  
  37. # 将所有Session失效日期小于当前日期的数据删除
  38. request.session.clear_expired()
  39.  
  40. # 检查 用户session的随机字符串 在数据库中是否
  41. request.session.exists("session_key")
  42.  
  43. # 删除当前用户的所有Session数据
  44. request.session.delete("session_key")

数据库session

2、缓存Session

  1. a. 配置 settings.py
  2.  
  3. SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
  4. SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
  5.  
  6. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
  7. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径
  8. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
  9. SESSION_COOKIE_SECURE = False # 是否Https传输cookie
  10. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
  11. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
  12. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
  13. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
  14.  
  15. b. 使用
  16.  
  17. 同上

Session缓存

3、文件Session

  1. a. 配置 settings.py
  2.  
  3. SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
  4. SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
  5.  
  6. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
  7. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径
  8. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
  9. SESSION_COOKIE_SECURE = False # 是否Https传输cookie
  10. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
  11. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
  12. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
  13. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
  14.  
  15. b. 使用
  16.  
  17. 同上

文件session

4、缓存+数据库Session

  1. 数据库用于做持久化,缓存用于提高效率
  2.  
  3. a. 配置 settings.py
  4.  
  5. SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
  6.  
  7. b. 使用
  8.  
  9. 同上

缓存+数据库

5、加密cookie Session

  1. a. 配置 settings.py
  2.  
  3. SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
  4.  
  5. b. 使用
  6.  
  7. 同上

Session+cookie

models数据库操作

基本操作

进阶

双下划线

  __ 大小于操作

__ 可以跨表

查询

1、一对多,查询所有用户类型等于 普通用户 的所有用户名和密码

2、三张表跨表操作

3、多对多

  创建

  操作_set

python运维开发(十九)----Django后台表单验证、session、cookie、model操作的更多相关文章

  1. python运维开发(十八)----Django(二)

    内容目录 路由系统 模版 Ajax model数据库操作,ORM 路由系统 django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对 ...

  2. python运维开发(十六)----Dom&&jQuery

    内容目录: Dom 查找 操作 事件 jQuery 查找 筛选 操作 事件 扩展 Dom 文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它 ...

  3. python运维开发(十四)----HTML基本操作

    内容目录: HTML概述 head标签 body中常用标签 css选择器 css常用属性 HTML HTML概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言) ...

  4. python运维开发(二十一)----文件上传和验证码+session

    内容目录: 文件上传 验证码+session 文件和图片的上传功能 HTML Form表单提交,实例展示 views 代码 HTML ajax提交 原生ajax提交,XMLHttpRequest方式上 ...

  5. python运维开发(十五)----JavaScript

    内容目录: HTML补充 javascript HTML补充 1.display标签 display的inline-block 属性会自动带3px的宽度 <span style="di ...

  6. python运维开发(十)----IO多路复用线程基本使用

    内容目录: python作用域 python2.7和python3.5的多继承区别 IO多路复用 socketserver模块源分析 多线程.进程.协程 python作用域  python中无块级作用 ...

  7. python运维开发(十二)----rabbitMQ、pymysql、SQLAlchemy

    内容目录: rabbitMQ python操作mysql,pymysql模块 Python ORM框架,SQLAchemy模块 Paramiko 其他with上下文切换 rabbitMQ Rabbit ...

  8. 运维开发笔记整理-django日志配置

    运维开发笔记整理-django日志配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Django日志 Django使用python内建的logging模块打印日志,Pytho ...

  9. 来不及说什么了,Python 运维开发剁手价仅剩最后 2 天

    51reboot 运维开发又双叒叕的搞活动了—— Python 运维开发 18 天训练营课程, 剁手价1299 最后2天 上课方式:网络直播/面授(仅限北京) DAY1 - DAY4 Python3 ...

随机推荐

  1. php中的MVC模式运用

    [size=5][color=Red]php中的MVC模式运用[/color][/size] 首先我来举个例子: 一个简单的文章显示系统 简单期间,我们假定这个文章系统是只读的,也就是说这个例子将不涉 ...

  2. block(四)揭开神秘面纱(下)

    看此篇时,请大家同时打开两个网址(或者下载它们到本地然后打开): http://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/BlocksRuntim ...

  3. 必须得是一万小时的 刻意训练(deliberate practice)

    成功素质1:一万小时与格物致知 “格物致知14”的概念,我是从张银奎11老师那里了解到的.它的意思是“推究事物的原理,从而获得知识”,跟我在<透过现象看本质 - 写在观看WWDC 2016 Ke ...

  4. SSL和SSH和OpenSSH,OpenSSL有什么区别

    ssl是通讯链路的附加层.可以包含很多协议.https, ftps, ..... ssh只是加密的shell,最初是用来替代telnet的.通过port forward,也可以让其他协议通过ssh的隧 ...

  5. 【转】 ubuntu下fastboot找不到devices

    原文网址:http://memory.blog.51cto.com/6054201/1202420 转载补充: 1.首先,手机必须先进入bootloader状态,fastboot devices才能有 ...

  6. 《UNIX环境高级编程》笔记--chown,fchown和lchown函数

    这三个函数都是用来更改文件的用户ID和组ID的,函数的定义如下: #include <unistd.h> int chown(const char *pathname, uid_t own ...

  7. mount命令汇总(转载)

    (一)挂接命令(mount) 首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式: mount [-t vfstype] [-o op ...

  8. IO之流程与buffer概览

    为了说明这个流程,还是用图来描述一下比较直观. 中间过程请参考 <IO之内核buffer----"buffer cache"> <IO之标准C库buffer> ...

  9. Hadoop 写SequenceFile文件 源代码

    package com.tdxx.hadoop.sequencefile; import java.io.IOException; import org.apache.hadoop.conf.Conf ...

  10. OCP-1Z0-051-题目解析-第6题

    6. Examine the structure of the SHIPMENTS table: name                    Null        Type PO_ID      ...