安全认证机制cookies session
目录
django请求生命周期
文字描述
用户输入www.baidu.com 先wsgi协议(外部服务网关接口 实现这个协议的有两个wsgiref[本地测试用] uwsgi.[性能高]) 本质是socket 后面才是django
先到路由系统(路由匹配) 在到视图函数(执行逻辑 两步先通过orm 数据库取值 然后给模板渲染) 最后通过wsji返回给用户
案例:博客系统
第一步用户输入login进入登录页面
配置数据库
settings配置文件中
自己先在数据库中创建库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'cs',
'USER':'root',
'PASSWORD':'123',
'HOST':'127.0.0.1',
'PORT':3306,
}
}
2 项目文件夹下的init文件中写上下面内容,用pymysql替换mysqldb
import pymysql
pymysql.install_as_MySQLdb()
settings配置文件中将 USE_TZ 的值改为 False
# USE_TZ = True
USE_TZ = False # 告诉mysql存储时间时按照当地时间来寸,不要用utc时间
使用pycharm的数据库客户端的时候,时区问题要注意
键表
class UserInfo(models.Model):
"""
用户表
"""
username = models.CharField(verbose_name='用户名',max_length=32)
password = models.CharField(verbose_name='密码',max_length=64)
配置路由系统
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/$', views.login),
url(r'^index/$', views.index),
]
配置视图
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:
# 用户登录成功
request.session['user_name'] = user_object.username
request.session['user_id'] = user_object.pk
return redirect('/index/')
# 用户名或密码输入错误
return render(request,'login.html',{'error':'用户名或密码错误'})
def auth(func):
def inner(request,*args,**kwargs):
name = request.session.get('user_name')
if not name:
return redirect('/login/')
return func(request,*args,**kwargs)
return inner
@auth
def index(request):
"""
博客后台首页
:param request:
:return:
"""
return render(request,'index.html')
配置模板
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div style="width: 500px;margin: 0 auto;border: 1px solid #dddddd;">
<form class="form-horizontal" method="post">
<div class="form-group">
<label class="col-sm-2 control-label">用户名</label>
<div class="col-sm-10">
<input type="text" class="form-control" placeholder="请输入用户名" name="user">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">密码</label>
<div class="col-sm-10">
<input type="password" class="form-control" placeholder="请输入密码" name="pwd">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">提 交</button>
<span style="color: red;">{{ error }}</span>
</div>
</div>
</form>
</div>
</body>
</html>
什么是cookie什么是session
cookie
定义:cookie是服务器让浏览器保存在浏览器本地的键值对
原因:http是无状态,每次请求之间没有任何关系,无法保存状态。使用cookie来保存一些状态。
session
定义:session是保存在服务器上的键值对,依赖于cookie
原因:
cookie在浏览器端 不太安全
cookie长度受到限 session的长度没有限制
cookie
什么是cookie及 应用场景
cookie的运用方法?
什么是cookie?
定义:cookie是服务器让浏览器保存在浏览器本地的键值对
原因:http是无状态,每次请求之间没有任何关系,无法保存状态。使用cookie来保存一些状态。
实列 用户登录
登录成功向其客户端发送一个令牌 (保存在用户器上的键值对) 用于下次确认身份
cookie的运用方法
1.通过js设置cookie
js查看cookie
document. cookie
js设置cookie 注意路径问题path 默认为空 有则覆盖 无则增加
document. cookie = ' k1=wy222 ;path=/ '
注意: path不同会导致设置不同.
path的作用
/,当前网站中所有的URL都能读取到此值.
",只能在当前页面访问的到此数据
/index/ ,只能在/index/xxx的网页中查看.
通过jquery设置 有则覆盖 无则增加
$. cookie('k1', 'wy222' ,{path:'/'})
通过py文件设置
# 设置cookie
data.set_cookie('a1','1',path='/')
data.set_cookie('a2','2',path='')
data.set_cookie('a3','3',path='/test/')
# 读取cookie
request.COOKIES.get('cookie键') #判断有没这个值
在下面3种情况都可以设置cookie
return HttpResponse('...')
return render('...')
return redirect('...')
# 用户登录成功
result = redirect('/index/')
result.set_cookie('xxxxxxxx',user)
return result
用户输入index网址 后台进行判断
def index(request):
"""
博客后台首页
:param request:
:return:
"""
user = request.COOKIES.get('xxxxxxxx')#判断有没这个值
if not user:
return redirect('/login/')
return render(request,'index.html',{'user':user})
在下面3种情况都可以设置cookie
return HttpResponse('...')
return render('...')
return redirect('...')
必须背会一下三个参数:
key 键, value='' 值, max_age=None 秒 多少秒后失效 path 路径
菜鸟教程
https://www.runoob.com/js/js-cookies.html
![1570527138385](file:///C:/Users/86131/AppData/Roaming/Typora/typora-user-images/1570527138385.png)
session
依赖cookie 是一种存储数据的方式,依赖于cookie,
实现本质: 用户向服务端发送请求,服务端做两件事:第一步为此用户开辟一个独立的空间来存放当前用户独有的值.第2步生成随机字符串发给客户端 他保存在游览器中
在空间中如何想要设置值:
request.session['x1'] = 123
request.session['x2'] = 456
在空间中取值:
request.session['x2']
request.session.get('x2') 推荐
视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.
数据 django默认存在数据库中
装饰器
![1570528618057](file:///C:/Users/86131/AppData/Roaming/Typora/typora-user-images/1570528618057.png)
![1570528714941](file:///C:/Users/86131/AppData/Roaming/Typora/typora-user-images/1570528714941.png)
cookie和session的区别?
答:
cookie是存储在客户端浏览器上的键值对,发送请求时浏 览器会自动携带.
session是一种存储数据方式,基于cookie 实现,将数据存储在服务端(django默认存储到数据库).
其本质是:用户向服务端发送请求,服务端做两件事:生成随机字符串;
为此用户开辟一个独立的空间来存放当前用户独有的值. 在空间中如何想要设置值:
request.session['x1'] = 123 request.session['x2'] = 456
在空间中取值:
request.session['x2']
request.session.get('x2')
视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.
session相关的配置
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_DOMAIN = None #那个域名可以用 读取的到 none代表全部子域名
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 /默认所有的
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 True只可以读不可以改
SESSION_COOKIE_AGE = 1209600 #单位秒 Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认false定时过期时间 如果改为true刷新一次过期时间程序计算
session如何设置过期时间?
SESSION_COOKIE_AGE = 1209600 # Session的 cookie失效日期(2周)
session默认存储可以放在其他地方吗?
小系统:默认放在数据库即可. 大系统:缓存(redis)
在settings文件 里面加入里面的代码
# 文件
# 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.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": "密码",
# }
# }
# }
操作session
# 设置(添加&修改) request.session['x1'] = 123 request.session['x2'] = 456
# 读取 request.session['xx'] request.session.get('xx')
# 删除 del request.session['xx'] 其实是修改了过期时间
内容总结
1. 装饰器要加入functools.wrap装饰
2. orm字段中的verbose_name
3. 路由系统中记得加入终止符 $
4. 用户名和密码检测
5. 模板查找顺序
request.session.keys() request.session.values() request.session.items() request.session.set_expiry(value) request.session.session_key
通过js设置cookie
document.cookie = 'k1=wy222;path=/'
$.cookie('k1','wy222',{path:'/'})
注意:path不同会导致设置不同.
path的作用
/ , 当前网站中所有的URL都能读取到此值.
"",只能在当前页面访问的到此数据.
/index/ ,只能在/index/xxx 的网页中查看.
非学,无以致疑;非问,无以广识