設(shè)置session過期時(shí)間需要用到的配置
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
視圖函數(shù)
from datetime import datetime, timedelta
from django.contrib.auth.hashers import check_password
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse
from users.models import Users
from utils.functions import is_login
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
if request.method == 'POST':
# 使用Cookie+Session形式實(shí)現(xiàn)登錄
username = request.POST.get('username')
password = request.POST.get('password')
# all()校驗(yàn)參數(shù),若列表中存在元素為空,則返回False
if not all([username, password]):
msg = '請?zhí)顚懲暾牡卿浶畔?
return render(request, 'login.html', {'msg': msg})
# 校驗(yàn)是否能通過username和password找到user對象
user = Users.objects.filter(username=username).first()
if user:
# 校驗(yàn)密碼
if not check_password(password, user.password):
msg = '密碼錯(cuò)誤'
return render(request, 'login.html', {'msg': msg})
else:
# 向cookie中設(shè)置隨機(jī)值,并存取至user_ticker中
request.session['user_id'] = user.id
# 設(shè)置session過期時(shí)間
request.session.set_expiry(timedelta(days=1))
return HttpResponseRedirect(reverse('users:index'))
else:
msg = '用戶名不存在'
return render(request, 'login.html', {'msg': msg})
@is_login
def index(request):
if request.method == 'GET':
user_id = request.session.get('user_id')
return render(request, 'index.html')
@is_login
def logout(request):
if request.method == 'GET':
# 注銷,刪除session和cookie
# request.session.flush()
# 獲取session_key并實(shí)現(xiàn)刪除,刪除服務(wù)端
# session_key = request.session.session_key
# request.session.delete(session_key)
return HttpResponseRedirect(reverse('users:login'))
裝飾器
from django.http import HttpResponseRedirect
from django.urls import reverse
def is_login(func):
def check(request):
try:
# 獲取session中已保存的user_id的值
request.session['user_id']
except:
# 跳轉(zhuǎn)到登錄
return HttpResponseRedirect(reverse('users:login'))
return func(request)
return check
去除settings中對csrf的注釋
'django.middleware.csrf.CsrfViewMiddleware',
在前端FORM表單中加上{% csrf_token %}即可