cookie与session的使用,cbv加装饰器,中间件

一.昨日回顾

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):#反射判断有没有clean_字段名
			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()  # self.clean执行的是自己类的clean方法
	except ValidationError as e:
		self.add_error(None,e)

面向切面编程(AOP OOP:面向对象编程)

1.django中cookie的使用

# 0 会话跟踪,会话保持
# 1 cookie规范
	-记住:当前网站在浏览器上cookie个数和大小有限制
	-Cookie大小上限位4KB;
	-一个服务器最多在客户端浏览器上保存20个Cookie;
	-一个浏览器最多保存300个Cookie;
# 2 django中操作cookie
	-:obj.set_cookie('key','value')
	-:obj.delete_cookie('key')  # 设置过期
	-:request.COOKIES.get('key')
	-:obj.set_cookie('key','value1')
# 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'')

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版登陆校验

路由

# 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

### cookie版登陆
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':
            # 写入cookie
            # 登录成功,重定向
            path = request.GET.get('returnUrl')
            if path:
                obj = redirect(path)
            else:
                obj = redirect('/index/')
            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')

## 装饰器版本(只要加了装饰器,一旦进入这个视图函数,就表明登录成了)
@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  # 获取那个随机字符串,django_session表中session_key字段

	-request.session.clear_expired()  #清除过期的session
	-request.session.exists("session_key")  # 判断这个随机字符串(session_key字段),有没有数据
	-request.session.delete()  # 删除所有的值,django_session表中删除当前登陆者的这条记录
	-request.session.flush()  # 干了上面那个事,把cookie设置为过期 

4.django中 session的配置

def set_cookie(self,key,value='',max_age=None,expires=None,path='/',domain=None,secure=False,httponly=False)

# key
# value
# max_age:传个数字,以秒计,过期时间,有默认值(6天后过期:60*60*24*5)
---了解
# expires:传时间对象,date=datetime.timedelta()
# path:默认/表示当前域下的所有路径
http://127.0.0.1:8000/lqz/dfd
# domain:在那个域下有效
# secure:是否https传输cookie
# httponly:cookie只支持http传输

1 数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 引擎(默认)
2.缓存session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'  # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
3.文件Session
SESSION_ENGINE='django.contrib.sessions.backends.file'  # 引擎
SESSION_FILE_PATH = None  # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
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的cookie失效日期(2周) (默认)***记住

---了解
SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期(默认)


SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)

SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

5.cbv加装饰器

from django.views import View
from django.utils.decorators import method_decorator
# 使用登录认证装饰器
# 用法一
# @method_decorator(login_auth,name='get')
# @method_decorator(login_auth,name='post')
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.中间件简介

# 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎使用,用不好会影响到性能

# django内置中间件
'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

# 读一读SessionMiddleware和CommonMiddleware()
# 自定义中间件,如何使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值