一、Cookie基础知识
1、实质:就是保存在浏览器端的键值对
2、用途:主要做登录
3、属性
1)保存在用户浏览器
2)可以主动清除
3)可以被“伪造”
4)跨域名cookie不共享
5)浏览器可以设置接受cookie(京东登录不上)
二、代码(实现登录)
1、Django下的urls代码
1 from django.contrib import admin 2 from django.urls import path 3 from resort import views 4 urlpatterns = [ 5 path('admin/', admin.site.urls), 6 path('login/', views.login), 7 path('index/', views.index), 8 9 ]
2、Django下的view代码
1 from django.shortcuts import render,HttpResponse,redirect 2 3 # Create your views here. 4 5 6 def login(req): 7 if req.method == "POST": 8 user = req.POST.get('username') 9 pwd = req.POST.get('pwd') 10 if user == 'root' and pwd == 'root': 11 rep = redirect('/index') 12 rep.set_cookie('username',user) 13 return rep 14 else: 15 return render(req,'login.html') 16 17 return render(req,'login.html') 18 19 def index(req): 20 username = req.COOKIES.get('username') 21 if username: 22 return render(req,'index.html') 23 # 这里如果使用redirect会出现重定向问题,未解决原因,不断的登录 24 else: 25 return render(req,'login.html')
3、Django下的template代码
1)index页面
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <p>hello</p> 9 </body> 10 </html>
2)login页面
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 9 <form action='/login/' method="POST"> 10 11 用户名:<input type="text" name="username"> 12 密码:<input type="password" name="pwd"> 13 <button>提交</button> 14 15 </form> 16 17 18 </body> 19 </html>
4、参数
1)可以设置多个Cookie值
rep = redirect('/index')
rep.set_cookie('username',user)
rep.set_cookie('email',user+'@163.com')
return rep
2)多个参数
def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
domain=None, secure=False, httponly=False):
第一个参数:键
第二个参数:值
第三个参数:设置cookie的有限期
第四个参数:不同浏览器之间设置cookie的有效期,比如IE
第五个参数:设置规定地址下的cookie值
第六个参数:设置主域(待完善)
第七个参数:设置安全性(待完善)
第八个参数:(待完善)
三、总结
1、Cookie三个重要点:
--客户端设置
--服务端设置
--保存在客户端
2、Cookie的应用:
登录认证
普通cookie
--敏感信息(直接看到),不宜防止在cookie中,敏感信息放在数据库,频繁操作
签名的cookie
--敏感信息(可能会解密)
rep = redirect('/index.html/') rep.set_signed_cookie('username',username) return rep -------------------------------- username = req.get_signed_cookie('username')
注:以上两个都不宜使用,敏感信息还是要放在数据库中,频繁操作有负担。所以Cookie做认证时,要将不敏感的信息放在Cookie中,但是对数据库还有负担,所以用Session解决
一、Session相关知识
1、Session原理
服务器端保存的:
以随机字符串为键构成的字典
session = {
adsf:{
‘is_login’ : 'True',
'user' : 'user01'
'nid' : '123'
}
qwer : {
‘is_login’ : 'True',
'user' : 'user02'
'nid' : '456'
}
}
客户端保存的:
随机字符串
adsf,qwer
2、cookie和session对比
3、session存储配置(补充)
· 数据库
· 缓存
· 文件
· 缓存+数据库
· 加密cookie
4、示例:实现两周自动登陆
——request.session.set_expiry(60*10)
——SESSION_SAVE_EVERY_REQUEST = True
PS:cookie中不设置超时时间,则表示关闭浏览器自动清除
5、Session的操作语句
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']
# 所有 键、 值、 键值对 操作
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 用户session的随机字符串
request.session.session_key
# 将所有session失效日期小于当前日期的数据删除(处理脏数据)
request.session.clear_expired()
# 检查 用户session的随机字符串 在数据库中是否存在
request.session.delete('session_key')
request.session.set_expiry(value)
* 如果value是个整数,session会在这些秒后失效
* 如果value是个datatime或timedelta,session就会在这个时间后失效
* 如果value是None,session会依赖全局session失效策略。
6、Session的默认配置
Session在setting.py文件中的配置
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_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
二、代码(实现登录、注销、10秒免登录为例)
1、Django下的urls代码
1 from django.contrib import admin 2 from django.urls import path 3 from app01 import views 4 urlpatterns = [ 5 path('admin/', admin.site.urls), 6 path('login/', views.login), 7 path('index/', views.index), 8 path('logout/', views.logout), 9 ]
2、Django下的view代码
1 from django.shortcuts import render,redirect,HttpResponse 2 3 # Create your views here. 4 5 def login(request): 6 if request.method == "GET": 7 return render(request,'login.html') 8 elif request.method == 'POST': 9 user = request.POST.get('username') 10 pwd = request.POST.get('pwd') 11 if user == 'root' and pwd == '123': 12 # 生成随机字符串 13 # 写到用户浏览器cookie 14 # 保存到session中 15 # 在随机字符串对应的字典中设置相关内容 16 request.session['username'] = user 17 request.session['is_login'] = True 18 if request.POST.get('rmb',None) == '1': # 注意这里的引号 19 request.session.set_expiry(10) 20 # 人为的设置一下超时时间 21 return redirect('/index/') 22 else: 23 return render(request,'login.html') 24 25 26 def index(request): 27 # 获取每一个当前用户的随机字符串 28 # 根据随机字符串获取对应信息 29 # if request.session['is_login']: 用这个第一次跳到index时会报错,改为下面 30 if request.session.get('username',None): 31 return render(request,'index.html') 32 else: 33 return render(request,'login.html') 34 35 def logout(request): 36 request.session.clear() 37 return redirect('/login/')
3、Django下的template代码
1)index页面
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>欢迎:{{ request.session.username }} :登录</h1> 9 <a href="/logout/">注销</a> 10 </body> 11 </html>
2)login页面
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form action="/login/" method="POST"> 9 10 <input type="text" name="username"> 11 <input type="password" name="pwd"> 12 <input type="checkbox" name="rmb" value="1">10秒免登录 13 <input type="submit" value="提交"> 14 15 </form> 16 17 </body> 18 </html>
浙公网安备 33010602011771号