Django -- 裝飾器login_required使用及自定義登錄驗證裝飾器


在使用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})


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM