1. 程式人生 > >django之基於cookie和裝飾器實現用戶認證

django之基於cookie和裝飾器實現用戶認證

view itl 代碼 重新 -- eve method args ()

一、使用Django自帶的decorator

通常情況,使用 函數定義的view,可以直接使用 login_required 直接裝飾

技術分享圖片
@login_required
def index(request):
    if request.method == "GET":
        return render(request, "index.htm")


def user_login(request):
    if request.method == "GET":
        return render(request, "login.html")
    if request.method == "POST":
        username = request.POST.get("username", "")
        password = request.POST.get("password", "")
        user_obj = authenticate(username=username, password=password)
        if user_obj:
            login(request, user_obj)
            return redirect(request.GET.get("nex", "/"))
        else:
            return render(request, "login.html")


def user_logout(request):
    logout(request)
    return render(request, "login.html")
技術分享圖片

這裏需要註意的是: login_required默認會重定向到 /account/login url, 因此我們可以在Settings.py中修改這個默認的重定向url;

LOGIN_URL = "/login/"

但是如果使用類定義的view,是不能夠直接使用 login_required進行裝飾的

需要定義一個 LoginRequired類

技術分享圖片
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator


class LoginRequiredMixin(object):
    @method_decorator(login_required(login_url="/login/"))
    def dispatch(self, request, *args, **kwargs):
        return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
技術分享圖片

然後在view中進行繼承

xxxView(LoginRequired, View)

pass

二、自己寫一個認證decorator

函數裝飾器

技術分享圖片
# 認證裝飾器
class AuthDecorator(object):
    @method_decorator(login_required(login_url="/login/"))
    def dispatch(self, request, *args, **kwargs):
        return super(AuthDecorator, self).dispatch(request, *args, **kwargs)


def has_auth(func):
    def auth(request, *args, **kwargs):
            if not request.session.get("username"):
                return redirect(reverse("login"))
            return func(request, *args, **kwargs)
    return auth


@has_auth
def index(request):
    user = request.session.get("username")
    business_obj = Business.objects.all()
    user_obj = User.objects.all()
    hosts = Host.objects.filter(user__username=user)
    return render(request, "index.html", {
        "hosts": hosts,
        "business_obj": business_obj,
        "user_obj": user_obj
    })
技術分享圖片

類裝飾器

技術分享圖片
# 認證裝飾器
class Auth(View):
    def dispatch(self, request, *args, **kwargs):
        user_obj = UserInfo.objects.filter(username=request.session.get("username")).first()
        if not user_obj:
            return redirect(reverse("login"))
        return super(Auth, self).dispatch(request, *args, **kwargs)


# 主頁視圖
class IndexView(Auth):
    def get(self, request):
        user = request.session.get("username")
        business_obj = Business.objects.all()
        user_obj = UserInfo.objects.all()
        hosts = Host.objects.filter(user__username=user)
        return render(request, "index.html", {
            "hosts": hosts,
            "business_obj": business_obj,
            "user_obj": user_obj
        })
技術分享圖片

示例1

技術分享圖片
 1 # Create your views here.
 2 user = "a"
 3 pwd = "a"
 4 def login(request):
 5     if request.method =="GET":
 6         return render(request,"login.html")
 7     elif request.method == "POST":
 8         u = request.POST.get("user")
 9         p = request.POST.get("password")
10         print(u)
11         print(p)
12         if u ==user and p ==pwd:
13             res = redirect("/index")
14             res.set_cookie(‘user‘,u,max_age=5)   #設置cookie,關閉瀏覽器cookie失效。max_age=5表示5秒後cookie失效,需要重新登錄
15             return res
16         else:
17             return  render(request,"login.html")
18 def index(request):
19     v = request.COOKIES.get("user")
20     if v:
21         return render(request,"index.html",{"current_user":v})
22     else:
23         return redirect("/login")
技術分享圖片

示例2 --- 基於裝飾器實現用戶認證

技術分享圖片
 1 user = "a"
 2 pwd = "a"
 3 
 4 def auth(func):
 5     def inner(reqeust,*args,**kwargs):
 6         v = reqeust.COOKIES.get(‘user‘)
 7         if not v:
 8             return redirect(‘/login‘)
 9         return func(reqeust, *args,**kwargs)
10     return inner
11 
12 def login(request):
13     if request.method =="GET":
14         return render(request,"login.html")
15     elif request.method == "POST":
16         u = request.POST.get("user")
17         p = request.POST.get("password")
18         if u ==user and p ==pwd:
19             res = redirect("/index")
20             res.set_cookie(‘user‘,u,max_age=5)   #設置cookie,關閉瀏覽器cookie失效。max_age=5表示5秒後cookie失效,需要重新登錄
21             return res
22         else:
23             return  render(request,"login.html")
24 @auth
25 def index(request):
26     v = request.COOKIES.get("user")
27     return render(request,"index.html",{"current_user":v})
技術分享圖片

django之基於cookie和裝飾器實現用戶認證