昨日回顾
1 form组件: 写一个类继承Form, 写字段
2 做数据校验( 一直用)
3 模版渲染( 混合开发中使用, 前后端分离用不到)
4 校验数据: form= MyForm( data= 字典)
5 字段参数: error_messages, widget, required,
6 错误信息: error = form. errors. get( '__all__' )
7 局部/ 全局钩子
- def clean_字段名( self) :
- 校验通过返回该字段的数据部分
- 校验失败抛出异常ValidationError
- def clean( self) :
- 校验通过返回cleaned_data
- 校验失败抛出异常ValidationError
0 form组件校验源码
1 读的入口是:
form. is_valid( ) - - - > self. errors( BaseForm类) - - - 》self. full_clean( ) ( BaseForm类) - - 》
- self. _clean_fields( 局部数据校验) 和self. _clean_form( 全局数据校验)
2 self. _clean_fields(BaseForm类)
for name, field in self. fields. items( ) :
try :
value = field. clean( value)
self. cleaned_data[ name] = value
if hasattr ( self, 'clean_%s' % name) :
value = getattr ( self, 'clean_%s' % name) ( )
self. cleaned_data[ name] = value
except ValidationError as e:
self. add_error( name, e)
3 self. _clean_form(BaseForm类) 全局钩子
try :
cleaned_data = self. clean( )
except ValidationError as e:
self. add_error( None , e)
钩子函数的思想:
面向切面编程(AOP OOP:面向对象编程)
1 django中cookie中的使用
- 记住:当前网站在浏览器上cookie个数和大小有限制
- Cookie大小上限为4KB;
- 一个服务器最多在客户端浏览器上保存20 个Cookie;
- 一个浏览器最多保存300 个Cookie;
- 增:obj. set_cookie( 'key' , 'value' )
- 删: obj. delete_cookie( 'key' )
- 查: request. COOKIES. get( 'key' )
- 改: obj. set_cookie( 'key' , 'value1' )
- 增:obj. set_signed_cookie( 'name' , 'lqz' , '123' )
- 删: obj. delete_cookie( 'name' )
- 查: request. get_signed_cookie( 'name' , salt= '123' )
- 改: obj. set_signed_cookie( 'name' , 'lqz' , '123' )
2 cookie版登录校验
路由
path( 'login/' , views. login) ,
path( 'order/' , views. order) ,
path( 'logout/' , views. logout) ,
path( 'userinfo/' , views. userinfo) ,
视图函数
def login_auth ( func) :
def inner ( request, * args, ** kwargs) :
name = request. COOKIES. get( 'name' )
if name:
res = func( request, * args, ** kwargs)
return res
else :
path = request. get_full_path( )
return redirect( '/login/?returnUrl=%s' % path)
return inner
def login ( request) :
if request. method == 'GET' :
return render( request, 'login.html' )
else :
name = request. POST. get( 'name' )
password = request. POST. get( 'password' )
if name == 'lqz' and password == '123' :
path = request. GET. get( 'returnUrl' )
if path:
obj = redirect( path)
else :
obj = redirect( '/index/' )
obj. set_cookie( 'name' , name)
return obj
else :
return HttpResponse( '用户名或密码错误' )
@login_auth
def order ( request) :
return render( request, 'order.html' )
@login_auth
def userinfo ( request) :
return render( request, 'userinfo.html' )
def logout ( request) :
obj = HttpResponse( '退出登录成功' )
obj. delete_cookie( 'name' )
return obj
模板
login.html
< form action = " " method = " post" >
< p> 用户名:< input type = " text" name = " name" > </ p>
< p> 密码:< input type = " password" name = " password" > </ p>
< p> < input type = " submit" value = " 提交" > </ p>
</ form>
order
<!DOCTYPE html>
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< title> Title</ title>
</ head>
< body>
< a href = " /logout/" > 点我退出</ a>
</ body>
</ html>
userinfo.html
<!DOCTYPE html>
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< title> Title</ title>
</ head>
< body>
< h1> 用户信息页面</ h1>
</ body>
</ html>
3 django中session的使用
1 存在于服务端的键值对
2 同一个浏览器不允许登录多个账户,不同浏览器可以登录同一个账户
3 session的使用(必须迁移数据)
- 增:request. session[ 'name' ] = lqz
- 查:request. session[ 'name' ]
- 改:request. session[ 'name' ] = egon
- 删:del request. session[ 'name' ]
- 设置过期时间:request. session. set_expiry( 10 )
4 session的其它使用
- request. session. setdefault( 'k1' , 123 )
- request. session. get( 'name' , None )
- del request. session[ 'k1' ]
- request. session. keys( )
- request. session. values( )
- request. session. items( )
- request. session. session_key
- request. session. clear_expired( )
- request. session. exists( "session_key" )
- request. session. delete( )
- request. session. flush( )
4 django中session的配置
def set_cookie ( self, key, value= '' , max_age= None , expires= None , path= '/' ,
domain= None , secure= False , httponly= False )
- - - 了解
1 . 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
2 . 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
3 . 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = None
4 . 缓存+ 数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
5 . 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
其他公用设置项:
SESSION_COOKIE_AGE = 1209600
- - - 了解
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_COOKIE_NAME = "sessionid"
SESSION_COOKIE_PATH = "/"
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_SECURE = False
SESSION_COOKIE_HTTPONLY = True
SESSION_SAVE_EVERY_REQUEST = False
5 cbv加装饰器
from django. views import View
from django. utils. decorators import method_decorator
class UserInfo ( View) :
@method_decorator( login_auth)
def get ( self, request, * args, ** kwargs) :
return HttpResponse( 'userinfo get' )
- 加在类上:@method_decorator( login_auth, name= 'get' )
- 加载方法上:@method_decorator( login_auth)
6 中间件简介
'django.middleware.security.SecurityMiddleware' ,
'django.contrib.sessions.middleware.SessionMiddleware' ,
'django.middleware.common.CommonMiddleware' ,
'django.contrib.auth.middleware.AuthenticationMiddleware' ,
'django.contrib.messages.middleware.MessageMiddleware' ,
'django.middleware.clickjacking.XFrameOptionsMiddleware' ,
作业
1 整理django中cookie和session的使用
2 基于session写一个登录认证装饰器,四个视图(登录,退出,订单,用户信息)
- 必须登录才能访问订单和用户信息
- 没登录访问订单,会重定向到登录,登录成功后跳转到订单页面
4 如果第二个人再次再同一个浏览器上登录,django- session表会怎样(研究一下)
5 第二个作业使用cbv写用户信息视图类
6 (拓展)如何自定义中间件在request对象中放入某个参数data,setting中配置使用