在使用Python進行開發的過程中,有這樣的需求:
- 在用戶進行訪問系統特定頁面時,對用戶進行登錄校驗,只有登錄認證過才准許其訪問
- 當校驗用戶未登錄狀態,跳轉至登錄頁面進行登錄,登錄后能夠跳轉用戶初始訪問的頁面,保證用戶體驗的良好性
實現方法:
- 1、使用Django自帶的auth模塊的login_required
- 2、自己定義裝飾器方法
1、Django -- login_required
導入 login_required
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
pass
setting中添加設置LOGIN_URL
作用:當判斷用戶未登錄時,會跳轉至LOGIN_URL指定的路徑,此時還會在跳轉路徑后添加用戶訪問的url,如:/user/login/?next=/user/info/,當用戶登錄后會自動跳轉至/user/info/下。
LOGIN_URL = '/user/login/'
2、自定義裝飾器
定義check_login裝飾器
from django.http import HttpResponseRedirect
def check_login(fn):
def wrapper(request,*args,**kwargs):
if request.session.get('IS_LOGIN', False):
return fn(request,*args,*kwargs)
else:
# 獲取用戶當前訪問的url,並傳遞給/user/login/
next = request.get_full_path()
red = HttpResponseRedirect('/user/login/?next=' + next)
return red
return wrapper
在views中需要登錄驗證方法處添加裝飾器
#用戶中心函數
@check_login
def usercenter(request):
username = request.session.get('name')
pass
#login函數
def login(request):
if request.method == 'POST':
payload = request.POST
username = payload['username']
password = payload['pwd']
# 獲取復選框value值,以列表的形式,沒有選中value值為空
remember = payload.getlist('remember')
# 登錄后對next的url進行操作,為空跳轉至產品的首頁
next_url = request.GET.get('next', reverse('product:home'))
# 密碼驗證
user = UserInfo.objects.filter(uname=username).values('id','upwd')
if user is not None and bcrypt.checkpw(upwd.encode(),user[0].get('upwd').encode()):
# 記錄用戶登錄狀態,存儲到session當中
login(request, user)
response = redirect(next_url)
if len(remember)==1:
response.set_cookie('name', username, max_age=7*24*3600)
else:
response.delete_cookie('name')
return response
else:
return render(request, 'user/login.html', {'error': '用戶名或密碼錯誤'})
if 'name' in request.COOKIES:
username = request.COOKIES.get('name', 0)
else:
username = ''
return render(request, 'user/login.html', {'username': username})
