一使用 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
- # Create your views here.
- user = "a"
- pwd = "a"
- def login(request):
- if request.method =="GET":
- return render(request,"login.html")
- elif request.method == "POST":
- u = request.POST.get("user")
- p = request.POST.get("password")
- print(u)
- print(p)
- if u ==user and p ==pwd:
- res = redirect("/index")
- res.set_cookie(user,u,max_age=5) #设置 cookie, 关闭浏览器 cookie 失效 max_age=5 表示 5 秒后 cookie 失效, 需要重新登录
- return res
- else:
- return render(request,"login.html")
- def index(request):
- v = request.COOKIES.get("user")
- if v:
- return render(request,"index.html",{"current_user":v})
- else:
- return redirect("/login")
示例 2 --- 基于装饰器实现用户认证
- user = "a"
- pwd = "a"
- def auth(func):
- def inner(reqeust,*args,**kwargs):
- v = reqeust.COOKIES.get(user)
- if not v:
- return redirect(/login)
- return func(reqeust, *args,**kwargs)
- return inner
- def login(request):
- if request.method =="GET":
- return render(request,"login.html")
- elif request.method == "POST":
- u = request.POST.get("user")
- p = request.POST.get("password")
- if u ==user and p ==pwd:
- res = redirect("/index")
- res.set_cookie(user,u,max_age=5) #设置 cookie, 关闭浏览器 cookie 失效 max_age=5 表示 5 秒后 cookie 失效, 需要重新登录
- return res
- else:
- return render(request,"login.html")
- @auth
- def index(request):
- v = request.COOKIES.get("user")
- return render(request,"index.html",{"current_user":v})
来源: http://www.bubuko.com/infodetail-2530504.html