django之基于cookie和装饰器实现用户认证

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

原文地址:https://www.cnblogs.com/xc1234/p/8594570.html

时间: 2024-10-21 06:30:43

django之基于cookie和装饰器实现用户认证的相关文章

Django基于Cookie装饰器实现用户认证

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,p) if u ==user and p

simple_tag,filte,分页以及cookie和装饰器

自定义simple_tag 内置的方法 首先Django中包含了很多内置的方法: 这里通过lower实现 在views视图函数中写如下代码: def tp3(request): name= "ABCDEFG" return render(request,"tp3.html",{"name":name}) 在urls路由关系中添加如下: url(r'^tp3/',views.tp3), 在tp3页面中写如下: {{ name }} {{ name|

Django中间件,csrf校验和装饰器以及auth模块和部分功能

一.Django中间件 1).什么是中间件 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能. 说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法. 我们一直都在使用中间

Django处理HTTP 请求中装饰器的使用

在学习Django的过程中,看见通过装饰器对view进行装饰,使得view可以提前处理Etag,if-modify-since以及检测请求的类型 先谈谈检测请求的类型: 我们知道Django的view是不区分请求的方法的,也就是说对于一个相同的URL,无论你是get或是post,你都会进入到一个相同的处理逻辑中. 当然我们可以自己在view中检测request.method. 但是如果提取到一个公共的需求的角度,可以认为每一个view都需要检测对应的方法. 首先看下我们希望如何使用: #app.

备忘录《一》基于cookie使用拦截器实现客户每次访问自登陆一次

原创声明:本文为本人原创作品,绝非他处摘取,转载请联系博主 相信大家在各大网站都会遇到,登录时,在登录框出现下次免登陆/一个月免登陆的类似选项,本次博文就是讲解如何实现,在这记录一下,也算是做个备忘录合集,如果文中有错,欢迎大家指出 为啥说自登陆一次呢,因为当访问某个页面时,如果第一次自动登录失败时,你下次刷新访问时还再次走自动登录流程,就会出现死循环. 本篇博文代码示例框架为Spring MVC,下面就讲解实现该功能的需要掌握哪些知识:cookies与拦截器 1.cookies 我们看一下是如

Django 之装饰器实现登录认证

def check_login(func): # 自定义登录验证装饰器 def warpper(request, *args, **kwargs): is_login = request.session.get('is_login', False) if is_login: func(request, *args, **kwargs) else: return redirect("/login") return warpper def login_user(request): if r

flask中的endpoint、自定义转化器、与djnago中session区别、利用装饰器实现登录认证

flask路由中的endpoint 与自定义转化器 ''' endpoint主要用于 反向解析, 例如:login函数中配的路由是/login,其中endpoint='lg' 则在其他函数,可以用 url=url_for('lg'),redirect(url)直接访问login函数 ''' ''' 自定义转化器,可以用来动态更新url_for 的跳转路由 其中 to_python主要是给后端的,可以对路由参数做修改 to_url是给前端url的,可以更新指定的url ''' flask与djan

装饰器做权限认证

#!/usr/bin/env python #_*_coding:utf-8_*_ from django.shortcuts import render,HttpResponse allow_list = ['admin'] def cron_allow(request,**kwargs): if request.user.username in allow_list: return True else: return False def check_cron_permission(fun):

装饰器实现用户验证登录

在实现用户验证的登录的时候可以使用装饰器工厂产生装饰器,让装饰器得到参数,从而判断登录类型,并验证用户登录条件,代码实现如下: def login_type(type): def Outer(F): def inner(): if type == 'QQ': name = input('请输入用户名:') psw = input('请输入密码:') if name == '汪凡' and psw == '198765': print('登陆成功!') return F() else: print