与 cookie 不同的是, session 是服务器技术, 把数据存在服务器上.
保存登陆状态信息和上次登陆时间
- def login_session(request):
- if request.method == 'POST':
- user = request.POST.get('user')
- pwd = request.POST.get('pwd')
- user = UserInfo.objects.filter(user=user, pwd=pwd).first()
- if user:
- request.session['is_login'] = True
- request.session['username'] = user.user
- import datetime
- now = datetime.datetime.now().strftime('%Y-%m-%d %X') # 记录上次登陆 login-session 的时间
- request.session['last_visit_time'] = now
- '''
- 1. 生成一个随机字符串 5j1d3jrfmjbnblnm3fz1fqfdmxi2vjog
- 2.response.set_cookie('sessionid',5j1d3jrfmjbnblnm3fz1fqfdmxi2vjog
- 3. 在 django_session 表中创建一条记录:
- session-key session-data
- 5j1d3jrfmjbnblnm3fz1fqfdmxi2vjog {'is_login':True,'username':edward}
- ''' return HttpResponse('登陆成功 ')
- return render(request, 'login.html')
- def index_session(request):
- # print('login',request.session['is_login']) 找不到会报错 print('login', request.session.get('is_login')) # 找不到不会报错
- ''' 1. request.COOKIE.get('session')
- 2. django-session 表中过滤记录:
- session-key session-data
- 5j1d3jrfmjbnblnm3fz1fqfdmxi2vjog {'is_login':True,'username':edward}
- obj = django-session.objects.filter(session-key=5j1d3jrfmjbnblnm3fz1fqfdmxi2vjog).first
- 3. obj.session-data.get('is_login')
- ''' is_login = request.session.get('is_login')
- if not is_login:
- return redirect('/login-session/')
- username = request.session.get('username')
- last_visit_time = request.session.get('last_visit_time')
- return render(request, 'index.html', {'username': username, 'last_visit_time': last_visit_time})
session 的更新操作
一个服务器和一个浏览器只用一个 session_key 来维持, 如果更新了账号密码, 不会创建新的 session_key, 只会更新 session_key 对应的 session_data.
'''if request.COOKIE.get('sessionid'):
更新
在 django-session 表中更新一条记录:
session-key session-data
5j1d3jrfmjbnblnm3fz1fqfdmxi2vjog 更新
else:
1. 生成一个随机字符串 5j1d3jrfmjbnblnm3fz1fqfdmxi2vjog
2.response.set_cookie('sessionid',5j1d3jrfmjbnblnm3fz1fqfdmxi2vjog
3. 在 django_session 表中创建一条记录:
session-key session-data
5j1d3jrfmjbnblnm3fz1fqfdmxi2vjog {'is_login':True,'username':edward}
'''
session 的注销功能与 session 的配置参数
注销
- def login_out(request):
- # del request.session['is_login'] # 只删除了一个键值, 我们要做的是删除整条记录
- request.session.flush()
- '''
- flush() 做的三个操作
- 1.random_str = request.COOKIE.get("sessionid")
- 2.django-session.objects.filter(session-key=random_str).delete()
- 3.response.delete_cookie("sessionid",path="/",random_str) 把 cookie 也删了
- ''' return redirect('/login/')
- HTML
- <a href="/login-out"> 注销 </a>
配置参数
django 默认支持 Session, 并且默认是将 Session 数据存储在数据库中, 即: django_session 表中.
a. 配置 settings.py
- SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎 (默认)
- 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_HTTPONLY = True # 是否 Session 的 cookie 只支持 http 传输 (默认)
- SESSION_COOKIE_AGE = 1209600 # Session 的 cookie 失效日期 (2 周)(默认)
- SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得 Session 过期 (默认)
- SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存 Session, 默认修改之后才保存 (默认) 如果设置为 True 了, 每次访问都会往后推一天
来源: http://www.bubuko.com/infodetail-2944937.html