day74
一.昨日回顾二.今日内容0.form组件校验源码1.django中cookie的使用2.cookie版登陆校验路由视图函数模板
3.django中session的使用4.django中 session的配置5.cbv加装饰器6.中间件简介
一.昨日回顾
1 form组件
:写一个类继承Form
,写字段
2 做数据校验
(一直有用
)
3 模板渲染
(混合开发会用到
,前后端分离用不到
)
4 校验数据
:form
=Myform
(data
=字典
)
5 字段参数
:error_messages
,widget
,required
,max_length
,min_length
,label
6 错误信息
:err
=form
.errors
.get
('__all__')
7 局部和全局钩子
-def clean_字段名
(self
):
-校验通过返回该字段的数据部分
-校验失败抛出异常ValidationError
-def clean
(self
)
-校验通过返回cleand_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''
)
urls.py
from app01
import views
urlpatterns
= [
url
(r
'^admin/', admin
.site
.urls
),
url
(r
'^set_cookie/', views
.set_cookie
),
url
(r
'^get_cookie/', views
.get_cookie
),
]
views.py
def set_cookie(request
):
obj
=render
(request
,'index.html')
obj
.set_signed_cookie
('name','lqz','123')
return obj
def get_cookie(request
):
print(request
.COOKIES
.get
('name'))
print(request
.get_signed_cookie
('name',salt
='123'))
return HttpResponse
('获取成功')
lqz
:1kVWbr
:rE9c0yhjIAqapE1CDJRAunK00Hc
lqz
lqz
:1kVWbr
:rE9c0yhjIAqapE1CDJRAunK00Hc
lqz
index.html
<body
>
<h1
>测试页面
</h1
>
</body
>
</html
>
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.html
<!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)
---了解
http
://127.0.0.1:8000/lqz
/dfd
1 数据库
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',