django之基於cookie和裝飾器實現用戶認證
阿新 • • 發佈:2018-03-18
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和裝飾器實現用戶認證