配置

from django.conf import settings

form组件

from django.forms import Form
from django.forms import fields
from django.forms import widgets

form自定义规则
from django.core.validators import RegexValidator

钩子函数
from django.core.exceptions import ValidationError

数据源无法实施更新,重写构造方法
方式一(推荐):
class ClassForm(Form):
caption = fields.CharField(error_messages={'required':'班级名称不能为空'})
# headmaster = fields.ChoiceField(choices=[(1,'娜娜',)])
headmaster_id = fields.ChoiceField(choices=[])

def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.fields['headmaster_id'].choices = models.UserInfo.objects.filter(ut_id=2).values_list('id','username')

方式二:

from django.forms.models import ModelChoiceField
class ClassForm(Form):
caption = fields.CharField(error_messages={'required':'班级名称不能为空'})
# headmaster = fields.ChoiceField(choices=[(1,'娜娜',)])
headmaster_id = ModelChoiceField(queryset=models.UserInfo.objects.filter(ut_id=2))

用户登录
- form的字段可以定义正则表达式
password = fields.CharField(
required=True,
min_length=3,
max_length=18,
error_messages={
'required': '密码不能为空',
'min_length': '密码长度不能小于3',
'max_length': '密码长度不能大于18',
'invalid': '密码格式错误',
},
validators=[RegexValidator('\d+','只能是数字') ]
)
- 主动向form中添加错误信息
# form.add_error('password','用户名或密码错误')
form.add_error('password',ValidationError('用户名或密码错误'))

钩子函数
- clean_字段名
注意:
必须有返回值
只能拿自己当前字段值
raise ValidationError('xxx')

  1. class LoginForm(Form):
  2. username = fields.CharField(
  3. required=True,
  4. min_length=,
  5. max_length=,
  6. error_messages={
  7. 'required': '用户不能为空',
  8. 'min_length': '用户长度不能小于3',
  9. 'max_length': '用户长度不能大于18',
  10. }
  11. )
  12. password = fields.CharField(
  13. required=True,
  14. min_length=,
  15. max_length=,
  16. error_messages={
  17. 'required': '密码不能为空',
  18. 'min_length': '密码长度不能小于3',
  19. 'max_length': '密码长度不能大于18',
  20. 'invalid': '密码格式错误',
  21. },
  22. validators=[RegexValidator('\d+','只能是数字') ]
  23. )
  24.  
  25. def clean_username(self):
  26. # ...
  27. user = self.cleaned_data['username']
  28. is_exsit = models.UserInfo.objects.filter(username=user).count()
  29. if not is_exsit:
  30. raise ValidationError('用户名不存在')
  31. return user
  32.  
  33. def clean_password(self):
  34. user = self.cleaned_data['username']
  35. return user

基于form组件的钩子函数登陆验证

  1. def login(request):
  2. if request.method == "GET":
  3. form = LoginForm()
  4. return render(request,'login.html',{'form':form})
  5. elif request.method =="POST":
  6. form = LoginForm(data=request.POST)
  7. if form.is_valid():
  8. # 验证成功
  9. user = models.UserInfo.objects.filter(**form.cleaned_data).first()
  10. if not user:
  11. # 用户名或密码错误
  12. # form.add_error('password','用户名或密码错误')
  13. form.add_error('password',ValidationError('用户名或密码错误'))
  14. return render(request, 'login.html', {'form': form})
  15. else:
  16. request.session[settings.SJF] = {'id':user.id, 'username':user.username}
  17. return redirect('/index/')
  18. else:
  19. # 验证失败
  20. return render(request, 'login.html',{'form':form})

登陆验证

django中间件

- 中间件是什么?
- 返回值注意
- 做过什么:
- 用户登录
- 日志记录
- csrf
- session
- 权限管理***

settings中MIDDLEWARE配置路径,注意顺序

  1. class MiddlewareMixin(object):
  2. def __init__(self, get_response=None):
  3. self.get_response = get_response
  4. super(MiddlewareMixin, self).__init__()
  5.  
  6. def __call__(self, request):
  7. response = None
  8. if hasattr(self, 'process_request'):
  9. response = self.process_request(request)
  10. if not response:
  11. response = self.get_response(request)
  12. if hasattr(self, 'process_response'):
  13. response = self.process_response(request, response)
  14. return response

继承的类

先执行第一个中间件类的process_request方法,不阻止默认返回None,若阻止,不返回None,执行此中间件类的process_response方法,注意,process_response必须有返回值

django 补充和中间件的更多相关文章

  1. django 缓存、中间件、信号、CSRF 详解

    中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项 ...

  2. django 补充篇

    from验证 django中的Form一般有两种功能: 输入html-----------不能你自己写一些标签,而帮你自动生成 验证用户输入-------将用户验证信息保存起来,可以传到前端 # !/ ...

  3. Django中Middleware中间件

    Django中Middleware中间件 1 Middleware中间件概述 django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中间件相应的方法.实际上当 ...

  4. Django框架之中间件与Auth

    Django框架之中间件与Auth模块一 cbv加装饰器 -先导入:from django.utils.decorators import method_decorator -1 可以在方法上加装饰器 ...

  5. Django进阶之中间件

    中间件简介 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在djang ...

  6. Django多个中间件的执行顺序

    Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健 ...

  7. Django中的中间件(middleware)

    中间件: 在研究中间件的时候我们首先要知道 1 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Djang ...

  8. 第三百一十六节,Django框架,中间件

    第三百一十六节,Django框架,中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间 ...

  9. Python开发【Django】:中间件、CSRF

    CSRF 1.概述 CSRF(Cross Site Request Forgery)跨站点伪造请求,举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果某个用户已经登录到你的网站上了,那么当这个用 ...

随机推荐

  1. GDT临时分段

    GDT临时分段 GDT临时段说明 现在已经进入了保护模式, 目前的改变 可以访问1M以上的内存了 可以使用32位的指令操作 问题: 由于以前的是实式下段寄存器寻址方式无法使用了,我们必须切换到使用GD ...

  2. h5手机点击返回键,刷新页面

    在js中,加上一下代码: window.onpageshow = function(event) {if (event.persisted) {window.location.reload();}};

  3. VSTO:使用C#开发Excel、Word【14】

    操作workbooks集合可从Application对象的Workbooks属性中获取的Workbooks集合包含当前在应用程序中打开的Workbook对象的集合. 它还具有用于管理开放工作簿,创建新 ...

  4. Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单

    1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...

  5. C++取反交换两个数的值

    int a = 1; int b = 2; cout << "a: "<< a << endl; cout << "b: ...

  6. 真机*Appium

    一.真机连接电脑123 1.一般android手机的的USB调试模式在设置里的开发者选项中,找到开发者选项,打开USB调试 2.cmd命令→[adb devices]→回车,得到真机设备 可能存在问题 ...

  7. C# ComboBoxTree控件

    这个控件,百度.codeproject等,能查到更好的解答和代码.写这个,是因为,我在3个小时内,没有看懂接手项目,原有的TreeCombox自定义代码逻辑.而我觉得很有必要改动它.因为新弄得网页端很 ...

  8. Mysql 杀死sleep进程

    查询数据库当前设置的最大连接数:查看mysql数据库连接数.并发数相关信息  show global variables like '%max_connections%'; 查看mysql连接数:my ...

  9. AWS Redshift typical error and potential root cause:

    Full join issue: When use full join, the below join condition should not occur: 1, OR statement2, an ...

  10. 位运算 - a^b

    求 a 的 b 次方对 p 取模的值. 输入格式 三个整数 a,b,p ,在同一行用空格隔开. 输出格式 输出一个整数,表示a^b mod p的值. 数据范围 1≤a,b,p≤109 输入样例: 3 ...