day74 cookie与session组件 2

it2026-10-02  1

目录

昨日回顾今日内容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): # 反射判断有没有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:面向对象编程)

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() # obj.set_signed_cookie('name', 'lqz', '123',path='/lqz/') obj.set_cookie('name', 'lqz', path='/lqz/') # obj.delete_cookie('name') # date=datetime.timedelta() return obj def get_cookie(request): print(request.COOKIES.get('name')) print(request.get_signed_cookie('name', salt='123')) return HttpResponse('获取成功')

2 cookie版登陆校验

路由

# 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 ### 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('用户名或密码错误') ## 装饰器版本(只要加了装饰器,一旦进入这个视图函数,就表明登录成了) @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 # 获取那个随机字符串,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设置为过期

代码演示

# 设置session # django框架默认,把session信息存到数据库中了,django_session表 # 先迁移数据库 def session_set(request): # request.session是个字典 # 写了下面那一句话,干了如下几件事 ''' # 一个浏览器,一个随机字符串 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): # name=request.session.get('name') # print(name) # print(request.session.keys()) # print(request.session.values()) # print(request.session.items()) 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) # 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 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): 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 中间件简介

# 中间件顾名思义,是介于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() # 自定义中间件,如何使用
最新回复(0)