目录
昨日回顾今日内容1 form组件校验源码2 django中cookie的使用2.1 cookie规范2.2 django中操作cookie2.3 带签名的cookie(加盐,加密)
2 cookie版登陆校验路由视图函数模板login.htmlorderuserinfo.html
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
今日内容
1 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:面向对象编程)
2 django中cookie的使用
2.1 cookie规范
记住:当前网站在浏览器上cookie个数和大小有限制
-Cookie大小上限为4KB;
-一个服务器最多在客户端浏览器上保存
20个Cookie;
-一个浏览器最多保存
300个Cookie;
2.2 django中操作cookie
增:obj
.set_cookie
('key','value')
删
: obj
.delete_cookie
('key')
查
: request
.COOKIES
.get
('key')
改
: obj
.set_cookie
('key','value1')
2.3 带签名的cookie(加盐,加密)
增: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')
代码演示:
views
def set_cookie(request
):
print(request
.session
)
obj
= render
(request
, 'index.html')
obj
.set_cookie
('name', 'lqz', path
='/lqz/')
return obj
def get_cookie(request
):
print(request
.COOKIES
.get
('name'))
print(request
.get_signed_cookie
('name', salt
='123'))
return HttpResponse
('获取成功')
2 cookie版登陆校验
路由
path
('login/', views
.login
),
path
('order/', views
.order
),
path
('logout/', views
.logout
),
path
('userinfo/', views
.userinfo
),
视图函数
低级写法:
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':
obj
=redirect
('/order/')
obj
.set_cookie
('name',name
)
return obj
else:
return HttpResponse
('用户名或密码错误')
def order(request
):
name
=request
.COOKIES
.get
('name')
if name
:
return render
(request
,'order.html')
else:
return redirect
('/login/')
优化写法
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
()
代码演示
def session_set(request
):
'''
# 一个浏览器,一个随机字符串
1 生成一个随机字符串asdfasdf,把随机字符串和name=lqz数据加密存到django_session表中
2 会把这个随机字符串放到cookie中
obj.set_cookie('sessionid',asdfasdf)
'''
request
.session
['name'] = 'lqz'
request
.session
['age'] = 19
return HttpResponse
('session写入了')
def session_set2(request
):
request
.session
['name'] = 'egon'
request
.session
['xx'] = 'xx'
return HttpResponse
('session写入了')
def session_get(request
):
print(request
.session
.session_key
)
return HttpResponse
('获取到了session')
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
@method_decorator
(login_auth
,name
='get')
class UserInfo(View
):
def get(self
, request
, *args
, **kwargs
):
return HttpResponse
('userinfo get')
方法二:
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')
路由配置
url
(r
'^UserInfo/', views
.UserInfo
.as_view
()),
总结:
-加在类上:@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',