cookie
-
基本实现用户登录
-
用户未登录就不能访问指定页面
-
基于cookie实现
-
def login(request): # return HttpResponse('...') # return render('...') # return redirect('...') # 设置cookie data = redirect('...') data.set_cookie() # 读取cookie request.COOKIES.get('xx') return data
-
def login(request): """ 用户登录 :param request: :return: """ if request.method == "GET": return render(request, "login.html") # 获取用户提交的用户名和密码 user = request.POST.get("username") pawd = request.POST.get("password") # 去数据库检查用户名和密码是否正确 user_obj = models.UserInfo.objects.filter(username=user, password=pawd).first() # user_obj = models.UserInfo.objects.filter(username=user, password=pawd).exists() if user_obj: # 用户登录成功 result = redirect('/index/') result.set_cookie('username', user) return result return render(request, "login.html", {'error': '用户名和密码错误'}) def index(request): """ 博客园后台首页 :param request: :return: """ user = request.COOKIES.get('username') if not user: return redirect('/login/') return render(request, 'index.html', {"user": user})
-
-
应用场景
- 用户认证
- 投票
- 每页默认显示
cookie操作
-
通过js设置cookie
-
两种方式 document.cookie = 'k1=wy222;path=/' $.cookie('k1','wy222',{path:'/'}) 注意:path不同会导致设置不同.
-
-
path的作用
- / , 当前网站中所有的URL都能读取到此值.
- "",只能在当前页面访问的到此数据.
- /index/ ,只能在/index/xxx 的网页中查看
操作session
- 设置:即添加
- request.session[user_name] = ‘david’
- 读取:
- request.session[‘user_name’]
request.session.get(‘user_name’)
-
删除
- del request.session[user_name]
-
字典操作
- request.session.values()
- request.session.keys()
- request.session.items()
-
设置过期时间
- request.session.set_expiry(999)
-
获取当前随机字符串
- request.session.session_key
session
-
是一种存储数据 的方式,依赖于cookie,实现本质
-
用户向服务端发送请求,服务端做两件事
- 生成随机字符串,
- 为次用户开辟一个独立的空间来存放用户当前独有的值
- 在空间中设置值:
- request.session[‘user_name’] = ‘david’
- 在空间中取值:
- request.session[‘user_name’]
- request.session.get(‘user_name’)
- 在空间中设置值:
-
视图函数中的业务处理完毕,给用户响应,在响应时会将随机字符串储存到用户浏览器的cookie中
-
应用场景:
- 用户认证
- 短信验证过期
- 权限管理
-
强调:
- session中默认储存的数据根据用户相互隔离
session用户登录认证
-
首先引入装饰器
-
装饰器要加入functools.wraps装饰:保留函数的元数据(函数名/注释)
-
import functools def wrapper(func): @functools.wraps def inner(request, *args, **kwargs): user = request.session.get('user_name') if not user: return redirect('/login/') return func(request, *args, **kwargs) return inner
-
两者的区别
- cookie是存储在浏览器上的键值对,发送请求时浏览器会自动携带
- session时一种存储数据的方式,基于cookie实现,将数据存储在服务端,django默认存储到数据库,其本质是:
- 用户向服务端发送请求,服务端做两件事
- 生成随机字符串,
- 为次用户开辟一个独立的空间来存放用户当前独有的值
- 在空间中设置值:
- request.session[‘user_name’] = ‘david’
- 在空间中取值:
- request.session[‘user_name’]
- request.session.get(‘user_name’)
- 在空间中设置值:
- 视图函数中的业务处理完毕,给用户响应,在响应时会将随机字符串储存到用户浏览器的cookie中
- 用户向服务端发送请求,服务端做两件事
扩展
-
django的session的默认储存在数据库,可以储存在其他地方吗
-
文件中,None可以指定文件路径
-
SESSION_ENGINE = ‘django.contrib.sessions.backends.file’ SESSION_FILE_PATH = ‘None’
-
-
缓存(内存)
-
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default' CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', '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": "密码", } } }
-
-
总结:
- 小系统:默认数据库就可以
- 大系统:缓存redis
-
-
django中的session如何设置过期时间
-
SESSION_COOKIE_AGE = 1209600 # Session的 cookie失效日期(2周)
-
SESSION设置文件解读
-
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_DOMAIN = None # api.baidu.com /www.baidu.com/ xxx.baidu.com SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输,即能否修改cookie SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
总结
- orm字段中的verbose_name
- 目前当注释用
- 以后:在model form 和form中使用
- 路由系统中记得加入终止符$:
- 防止url被截胡
- 用户名或密码检测:
- xxxx.first() #返回对象或None
- xxxx.exists() #返回布尔值
- 模板查找顺序
- 根目录templates
- 然后app注册顺序去每个app的templates中查找