Cookie:是保存在浏览器上的键值对
服务器端控制着响应,在响应里可以让浏览器在本地保存cookie
下一次请求在发送的时候就会自动携带这个cookie的值
cookie的使用:
1.登录 七天免登录
2.记录用户的浏览习惯
3.简单的投票限制 如: 一台机器每天只能最多投片3次
cookie是服务器端设置的,浏览器可以禁用cookie,然后浏览器用户登录不了了 比如登录京东
1 def login(request):
2 if request.method=='POST':
3 user=request.POST.get('user')
4 pwd = request.POST.get('pwd')
5 user_obj=models.Employee.objects.all().filter(name=user,).values('psd')
6 psd=user_obj[0].get('psd')
7 if psd==pwd:
8 ret=redirect('/home/')
9 ret.set_signed_cookie('islogin','1',salt='good')
10 return ret
11 return render(request,'login.html')
12
13 def home(request):
14 print(request.get_full_path()) #获取当前请求的除IP端口外的全部路径
15 print(request.path_info) #获取当前请求的路径
16 flag=request.get_signed_cookie('islogin',default='0',salt='good',max_age=6)
17 if flag=='1':
18 return render(request,'home.html')
19 else:
20 return redirect('/login/')
21 from functools import wraps
22 def check_login(func):
23 @wraps(func)
24 def inner(request,*args,**kwargs):
25 ret=request.get_signed_cookie('islogin',default='0',salt='good',max_age=6)
26 if ret=='1':
27 return func(request,*args,**kwargs)
28 else:
29 #获取当前访问页
30 url=request.path_info
31 return redirect('/login/?next={}'.format(url))
32 return inner
33
34 @check_login
35 def index(request):
36
37 return render(request,'index.html')
38
39 def logout(request):
40 rep=redirect('/login/')
41 #删除cookie
42 rep.delete_cookie('islogin')
43 return re
- key, 键
- value='', 值
- max_age=None, 超时时间
- expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Sesson必须依赖于Cookie 因为cookie是存储在客户端的
存session:
1.在服务器端生成随机字符串
2.生成一个和字符串对应的大字典,来保存用户的数据 字典存储在服务器端
3.随机字符串作为cookie,以键值对的形式返回给客户端
取session:
1.从浏览器携带的cookie中找到随机的字符串
2.拿着字符串 去session中找对应的大字典
3.从字典里按key取值,得到用户保存的数据
session 优点:比cookie存的数据多,安全性好,数据都保存在服务器端。
缺点:session的数据量大,会占用一些资源
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
request.session.delete() #删除当前会话的所有session数据
request.session.flush() #删除当前会话并删除会话的cookie
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Session版登录校验:
1 from functools import wraps
2
3
4 def check_login(func):
5 @wraps(func)
6 def inner(request, *args, **kwargs):
7 next_url = request.get_full_path()
8 if request.session.get("user"):
9 return func(request, *args, **kwargs)
10 else:
11 return redirect("/login/?next={}".format(next_url))
12 return inner
13
14
15 def login(request):
16 if request.method == "POST":
17 user = request.POST.get("user")
18 pwd = request.POST.get("pwd")
19
20 if user == "alex" and pwd == "alex1234":
21 # 设置session
22 request.session["user"] = user
23 # 获取跳到登陆页面之前的URL
24 next_url = request.GET.get("next")
25 # 如果有,就跳转回登陆之前的URL
26 if next_url:
27 return redirect(next_url)
28 # 否则默认跳转到index页面
29 else:
30 return redirect("/index/")
31 return render(request, "login.html")
32
33
34 @check_login
35 def logout(request):
36 # 删除所有当前请求相关的session
37 request.session.delete()
38 return redirect("/login/")
39
40
41 @check_login
42 def index(request):
43 current_user = request.session.get("user", None)
44 return render(request, "index.html", {"user": current_user})
>>>>>>>>>>>>>>>>>>>>>>>>Django中Session相关的方法>>>>>>>>>>>>>>>>>>>>>
1 # 获取、设置、删除Session中数据
2 request.session['k1']
3 request.session.get('k1',None)
4 request.session['k1'] = 123
5 request.session.setdefault('k1',123) # 存在则不设置
6 del request.session['k1']
7
8
9 # 所有 键、值、键值对
10 request.session.keys()
11 request.session.values()
12 request.session.items()
13 request.session.iterkeys()
14 request.session.itervalues()
15 request.session.iteritems()
16
17 # 会话session的key
18 request.session.session_key
19
20 # 将所有Session失效日期小于当前日期的数据删除
21 request.session.clear_expired()
22
23 # 检查会话session的key在数据库中是否存在
24 request.session.exists("session_key")
25
26 # 删除当前会话的所有Session数据
27 request.session.delete()
28
29 # 删除当前的会话数据并删除会话的Cookie。
30 request.session.flush()
31 这用于确保前面的会话数据不可以再次被用户的浏览器访问
32 例如,django.contrib.auth.logout() 函数中就会调用它。
33
34 # 设置会话Session和Cookie的超时时间
35 request.session.set_expiry(value)
36 * 如果value是个整数,session会在些秒数后失效。
37 * 如果value是个datatime或timedelta,session就会在这个时间后失效。
38 * 如果value是0,用户关闭浏览器session就会失效。
39 * 如果value是None,session会依赖全局session失效策略。
Django中的Session配置
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用
1 1. 数据库Session
2 SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
3
4 2. 缓存Session
5 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
6 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
7
8 3. 文件Session
9 SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
10 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
11
12 4. 缓存+数据库
13 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
14
15 5. 加密Cookie Session
16 SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
17
18 其他公用设置项:
19 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
20 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
21 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
22 SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
23 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
24 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
25 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
26 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)