cookies和session
基于cookies做用户验证时,敏感信息不适合放在cookies中
cookies保存在客户浏览器端的键值对
session保存在服务器端的键值对(依赖于cookies),把用户浏览器中的cookies中信息
session =
{
生成随机字符串1>{‘login’:True,'user’:root.......},
生成随机字符串2>{..............}
}
cookies中session的使用
1 def index(request): 2 # 获取、设置、删除Session中数据 3 request.session['k1'] 4 request.session.get('k1',None) 5 request.session['k1'] = 123 6 request.session.setdefault('k1',123) # 存在则不设置 7 del request.session['k1'] 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 18 # 用户session的随机字符串 19 request.session.session_key 20 21 # 将所有Session失效日期小于当前日期的数据删除 22 request.session.clear_expired() 23 24 # 检查 用户session的随机字符串 在数据库中是否 25 request.session.exists("session_key") 26 27 # 删除当前用户的所有Session数据 28 request.session.delete("session_key")
基于cookies的session用户验证登录
1 from django.shortcuts import render, HttpResponse, redirect 2 3 4 # Create your views here. 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('user') 10 pwd = request.POST.get('pwd') 11 if user == 'root' and pwd == '123': 12 # 生成随机字符串。 13 # 写到用户浏览器cookies中 14 # 保存到服务器端的session 15 # 在随机字符串的字典中设置相关的内容 16 request.session['username'] = user # 基于session中设置值 17 request.session['is_login'] = True 18 return redirect('/index/') 19 else: 20 return render(request, 'login.html') 21 22 def index(request): 23 # 获取当前用户的随机字符串 24 # 根据随机字符串获取对应信息 25 if request.session['is_login']: 26 # return HttpResponse('ok') 27 return HttpResponse(request.session['username']) # 基于session中获取值 28 else: 29 return HttpResponse('请登录')
登录注销
1 """untitled4 URL Configuration 2 3 The `urlpatterns` list routes URLs to views. For more information please see: 4 https://docs.djangoproject.com/en/1.10/topics/http/urls/ 5 Examples: 6 Function views 7 1. Add an import: from my_app import views 8 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 9 Class-based views 10 1. Add an import: from other_app.views import Home 11 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 12 Including another URLconf 13 1. Import the include() function: from django.conf.urls import url, include 14 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 15 """ 16 from django.conf.urls import url 17 from django.contrib import admin 18 from app1 import views 19 20 urlpatterns = [ 21 url(r'^admin/', admin.site.urls), 22 url(r'^login/$', views.login), 23 url(r'^index/$', views.index), 24 url(r'^loginout/$', views.loginout), 25 ]
1 from django.shortcuts import render, HttpResponse, redirect 2 3 4 # Create your views here. 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('user') 10 pwd = request.POST.get('pwd') 11 if user == 'root' and pwd == '123': 12 # 生成随机字符串。 13 # 写到用户浏览器cookies中 14 # 保存到服务器端的session 15 # 在随机字符串的字典中设置相关的内容 16 request.session['username'] = user # 基于session中设置值 17 request.session['is_login'] = True 18 return redirect('/index/') 19 else: 20 return render(request, 'login.html') 21 22 23 def index(request): 24 # 获取当前用户的随机字符串 25 # 根据随机字符串获取对应信息 26 if request.session.get('is_login', None): 27 # return HttpResponse('ok') 28 return render(request, 'index.html') 29 else: 30 return HttpResponse('请登录') 31 32 33 def loginout(request): 34 request.session.clear() 35 return redirect('/login/')
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="/loginout/">注销</a> 10 </body> 11 </html>
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 <input type="text" name="user" placeholder="user"/> 10 <input type="password" name="pwd" placeholder="pwd"/> 11 <input type="submit" value="提交"/> 12 </form> 13 </body> 14 </html>
修改默认超时时间:
修改默认超时时间---在settings里面做修改。
每次用户发来请求的时候,都需要更新一下超时时间。超时时间的起点应该是每次用户操作完开始计算,而不应该是第一次登录的时间点为起点,将如下代码在settings中设置为True,则可设置浏览器超时时间的起点应该是每次用户操作完开始计算。
1 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)。最后一次操作10秒后再失效。
session的基本操作
. Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
- 数据库(默认) #把session存在数据库中
- 缓存
- 文件
- 缓存+数据库
- 加密cookie
1 a. 配置 settings.py 2 3 SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) 4 5 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) 6 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) 7 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认) 8 SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认) 9 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认) 10 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认) 11 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) 12 set_cookie('k',123) #没有写超时时间,默认情况下就是关闭浏览器,cookie失效。 13 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
方式一:
数据库(默认) #把session存在数据库中
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
1 SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
方式二:
把session存在缓存中
1 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
方式三:
把session存在文件中
1 SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 2 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T 3
方式三:
缓存+数据库
数据库用于做持久化,缓存用于提高效率;
先去数据库中找,找到的话,直接用;
找不到的话,到数据库中去找,然后再在缓存中放一份。
1 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
方式四:
加密cookies
1 SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎