與cookie不同的是,session是服務器技術,把數(shù)據(jù)存在服務器上
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表中創(chuàng)建一條記錄: 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_key來維持,如果更新了賬號密碼,不會創(chuàng)建新的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表中創(chuàng)建一條記錄: session-key session-data 5j1d3jrfmjbnblnm3fz1fqfdmxi2vjog {'is_login':True,'username':edward} '''
注銷
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>
配置參數(shù)
django默認支持Session,并且默認是將Session數(shù)據(jù)存儲在數(shù)據(jù)庫中,即: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了,每次訪問都會往后推一天