目录
Django框架06 /cookie和session
1.装饰器
def wrapper(f):
def inner(*args,**kwargs):
return f(*args,**kwargs)
return inner
@wrapper
def index(a1,a2):
"""
这是一个index函数
"""
return a1+ a2
print(index.__name__)
print(index.__doc__)
结果:
inner
这是一个inner函数
import functools
def wrapper(f):
@functools.wraps(f)
def inner(*args,**kwargs):
return f(*args,**kwargs)
return inner
'''
1.执行wrapper
2.重新赋值
index = wrapper(index)
'''
@wrapper
def index(a1,a2):
"""
这是一个index函数
"""
return a1+ a2
print(index.__name__)
print(index.__doc__)
结果:
index
这是一个index函数
作用:保留函数的元数据(函数名/注释)
2.什么是http协议
1.超文本传输协议
2.关于连接:一次请求一次响应之后断开来连接(无状态、短连接)
3.关于格式:
请求:请求头+请求体(http:www.baidu.com/index/?a=123)
send("GET /index/?a=123 http1.1\r\nhost:www.baidu.com\r\nuseragent:Chrome\r\n\r\n")
send("POST /index/ http1.1\r\nhost:www.baidu.com\r\nuseragent:Chrome\r\n\r\nusername=alex&pwd=123")
响应:响应头+响应体
Content-Encoding: gzip\r\nCache-Control: private\r\n\r\n网页看到的HTML内容
4.扩展:常见的请求头都有哪些?
- user-agent:用什么浏览器访问的网站。
- content-type: 请求体的数据格式是什么(服务端按照 格式要求进行解析)
5.扩展:常见的请求方式?
- GET
- POST
3.django请求生命周期
浏览器上输入http://www.xxx.com 请求到达django后发生了什么?
#wsgi、uwsgi:web服务网关接口
4.案例:博客系统
1.基本实现用户登录
2.用户未登录就不能访问指定页面
基于cookie实现
保存在用户浏览器端的键值对,向服务端发请求时会自动携带。
Cookie可以做登录之外,还可以做什么?
基于session实现(推荐)
依赖cookie
是一种存储数据的方式,依赖于cookie,实现本质:
用户向服务端发送请求,服务端做两件事:
1.生成随机字符串;
2.为此用户开辟一个独立的空间来存放当前用户独有的值.
在空间中如何想要设置值:
request.session['x1'] = 123
request.session['x2'] = 456
在空间中取值:
request.session['x2']
request.session.get('x2')
视图函数中的业务操作处理完毕,给用户响应,在响应时会将随机字符串存储到用户浏览器的cookie中.
问题
cookie和session的区别?
答: cookie是存储在客户端浏览器上的键值对,发送请求时浏览器会自动携带. session是一种存储数据方式,基于cookie 实现,将数据存储在服务端(django默认存储到数据库).其本质是:
用户向服务端发送请求,服务端做两件事:生成随机字符串;为此用户开辟一个独立的空间来存放当前用户独有的值.
在空间中如何想要设置值:
request.session['x1'] = 123
request.session['x2'] = 456
在空间中取值:
request.session['x2']
request.session.get('x2')
视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.
拓展
django和session相关的配置
1.SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即: sessionid=随机字符串
2.SESSION_COOKIE_DOMAIN = None # api.baidu.com /www.baidu.com/ xxx.baidu.com
3.SESSION_COOKIE_PATH = "/" # Session的cookie 保存的路径
4.SESSION_COOKIE_HTTPONLY = True # 是否 Session的cookie只支持http传输
5.SESSION_COOKIE_AGE = 1209600 # Session的 cookie失效日期(2周)
6.SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
7.SESSION_SAVE_EVERY_REQUEST = False # 是否每 次请求都保存Session,默认修改之后才保存
django中的session如何设置过期时间?
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
django的session默认存储在数据库,可以放在其他地方吗?
小系统:默认放在数据库即可.
大系统:缓存(redis)
- 文件
SESSION_ENGINE = 'django.contrib.sessions.backends.file' SESSION_FILE_PATH = '/sssss/'
- 缓存(内存)
SESSION_ENGINE =
'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
CACHES = {
'default': {
'BACKEND':
'django.core.cache.backends.locmem.LocMem Cache',
'LOCATION': 'unique-snowflake',
}
}
- 缓存(redis)
SESSION_ENGINE =
'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
CACHES = {
default": {
"BACKEND":
"django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS":
"django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS":
{"max_connections": 100}
# "PASSWORD": "密码",
}
}
}
操作session
# 设置(添加&修改)
request.session['x1'] = 123
request.session['x2'] = 456
# 读取
request.session['xx']
request.session.get('xx')
# 删除
del request.session['xx']
request.session.keys()
request.session.values()
request.session.items()
request.session.set_expiry(value)
request.session.session_key
5.内容总结
装饰器要加入functools.wrap装饰
保留函数的元数据(函数名/注释)
orm字段中的verbose_name
目前当注释用. 以后:在model form和form中使用.
路由系统中记得加入终止符 $
用户名和密码检测
xxxx.first() # 返回对象或None xxxx.exists() # 返回布尔值
模板查找顺序
根目录templates 根据app注册顺序去每个app的tempaltes中找
cookie
原理
操作
def login(request): # return HttpResponse('...') # return render('...') # return redirect('...') # 设置cookie data = redirect('...') data.set_cookie() # 读取cookie request.COOKIES.get('xx') return data 必须背会一下三个参数: key, value='', max_age=None
应用场景:
用户认证
投票
每页默认显示数据
session
原理:随机字符串的过程....
操作
request.session['x']
request.session['x'] = 123
del request.session['x']
配置
数据存储位置
数据库(django默认)
文件
缓存(内存/redis)
cookie相关操作
应用场景
用户认证
短信验证过期
权限管理
强调
session中的数据是根据用户相互隔离.
# 示例
def login(request):
# 获取用户提交的用户名和密码
user = request.POST.get('user')
request.session['user_name'] = user
def index(request):
print(request.session['user_name'])
Http协议
django请求生命周期
从数据库判断用户名以及密码的两种方式
# 去数据库检查用户名密码是否正确 # user_object = models.UserInfo.objects.filter(username=user,password=pwd).first() # user_object = models.UserInfo.objects.filter(username=user, password=pwd).exists()
cookie练习代码
from django.shortcuts import render,redirect
from app01 import models
def login(request):
"""
用户登录
:param request:
:return:
"""
if request.method == 'GET':
return render(request, 'login.html')
# 获取用户提交的用户名和密码
user = request.POST.get('user')
pwd = request.POST.get('pwd')
# 去数据库检查用户名密码是否正确
# user_object = models.UserInfo.objects.filter(username=user,password=pwd).first()
# user_object = models.UserInfo.objects.filter(username=user, password=pwd).exists()
user_object = models.UserInfo.objects.filter(username=user, password=pwd).first()
if user_object:
# 用户登录成功
result = redirect('/index/')
result.set_cookie('xxxxxxxx',user)
return result
# 用户名或密码输入错误
return render(request,'login.html',{'error':'用户名或密码错误'})
def index(request):
"""
博客后台首页
:param request:
:return:
"""
user = request.COOKIES.get('xxxxxxxx')
if not user:
return redirect('/login/')
return render(request,'index.html',{'user':user})
session练习代码
from django.shortcuts import render,redirect
from app01 import models
def login(request):
'''
用户登陆
:param request:
:return:
'''
if request.method == 'GET':
return render(request,'login.html')
user = request.POST.get('username')
pwd = request.POST.get('password')
ret = models.UserInfo.objects.filter(username=user,password=pwd).first()
if ret:
request.session['user_name'] = ret.username
return redirect('/index/')
return render(request,'login.html',{'error':'用户名或密码错误'})
#构建装饰器
import functools
def auth(f):
@functools.wraps(f)
def inner(request,*args,**kwargs):
user = request.session.get('user_name')
if not user:
return redirect('/login/')
return f(request,*args,**kwargs)
return inner
@auth
def index(request):
'''
博客后台首页
:param request:
:return:
'''
return render(request,'index.html')