django 自定义用户登录校验模块

django 自定义用户登录校验模块,第1张

django 自定义用户登录校验模块 django 自定义用户登录校验模块

话不多说,上代码
ps:我的应用名称叫‘mycharts’
校验该请求是否是由登录用户发起:

from django.shortcuts import redirect, reverse

# 普通函数装饰器
def is_authenticated(fn):
    def inner(request, *args, **kwargs):
    
    	# 判断此次请求的session中是否有用户信息
        status = request.session.get('user')
        
		# 这里根据项目需求来判断,比如可以增加用户状态【已下线/在线】的判断
        if status:
        	# 我的项目中如果session中有用户,就是已经登录了。
            ret = fn(request, *args, **kwargs)
            return ret
        else:
        	# 自定义HTTP_REFERER,以协助实现登录后自动跳转原请求地址
            request.session['HTTP_REFERER'] = request.get_full_path()
            return redirect(reverse('mycharts:login'))

    return inner

# 稍微改一下,类方法装饰器
def class_method_authenticated(fn):
    def inner(self, request, *args, **kwargs):
        status = request.session.get('user')
        if status:
            ret = fn(self, request, *args, **kwargs)
            return ret
        else:
            request.session.setdefault('HTTP_REFERER', request.get_full_path())
            return redirect(reverse('mycharts:login'))
    return inner

这是我的views.py 中的登录、登出模块
登出时,会清空session,所以登出后,session中没有user。

class Login(View):

    def get(self, request):
        user = request.session.get('user', None)
        referer = request.session.get('HTTP_REFERER', '')
        if user:
            if referer:
                return HttpResponseRedirect(referer)
            else:
                return HttpResponseRedirect(reverse('mycharts:index'))
        return render(request, 'mycharts/login.html')

    def post(self, request):
        user_name = request.POST.get('user', None)
        passwd = request.POST.get('passwd', None)
        referer = request.session.get('HTTP_REFERER', '')
        try:
            user = User.objects.get(name=user_name)
            u_passwd = user.passwd
        except Exception as e:
            user = None
            u_passwd = None

        if user is not None and passwd == u_passwd:
            request.session.set_expiry(0)  # 关闭浏览器失效
            request.session['user'] = user_name
            if referer:
                request.session['HTTP_REFERER'] = ''
                return HttpResponseRedirect(referer)
            else:
                return HttpResponseRedirect(reverse('mycharts:index'))
        else:
            return HttpResponseRedirect(reverse('mycharts:login'))
 
def logout(request):
    request.session.flush()
    return HttpResponseRedirect(reverse('mycharts:login'))

在视图中使用登录校验装饰器

请求首页时,如果未登录,会先跳转到登录页面,登录成功后,再跳转回来

@is_authenticated
@csrf_exempt
def index(request):
    user = request.session.get('user')
    table_name = TableData.objects.filter(table_id__lte=10, table_id__gte=0).values('table_name')
    table_name = TableData.objects.filter(table_id__lte=10, table_id__gte=0).values('table_name')
    return render(request, 'mycharts/index.html', {'tables': table_name,'name':user})

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/5070157.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存