在使用Python进行开发的过程中,有这样的需求:

  • 在用户进行访问系统特定页面时,对用户进行登录校验,只有登录认证过才准许其访问
  • 当校验用户未登录状态,跳转至登录页面进行登录,登录后能够跳转用户初始访问的页面,保证用户体验的良好性

实现方法:

  • 1、使用Django自带的auth模块的login_required
  • 2、自己定义装饰器方法

1、Django -- login_required

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    pass
作用:当判断用户未登录时,会跳转至LOGIN_URL指定的路径,此时还会在跳转路径后添加用户访问的url,如:/user/login/?next=/user/info/,当用户登录后会自动跳转至/user/info/下。

LOGIN_URL = '/user/login/'

2、自定义装饰器

from django.http import HttpResponseRedirect

def check_login(fn):
    def wrapper(request,*args,*kwargs):
        if request.session.session.get('IS_LOGIN', False):
            return fn(request,*args,*kwargs)
        else:
            # 获取用户当前访问的url,并传递给/user/login/
            next = request.get_full_path()
            red = HttpResponseRedirect('/user/login/?next=' + next)
            return red
    return wrapper
#用户中心函数
@check_login
def usercenter(request):
    pass

#login函数
def login(request):
    if request.method == 'POST':
        payload = request.POST
        username = payload['username']
        password = payload['pwd']
        # 获取复选框value值,以列表的形式,没有选中value值为空
        remember = payload.getlist('remember')
        # 登录后对next的url进行操作,为空跳转至产品的首页
        next_url = request.GET.get('next', reverse('product:home'))
        # 密码验证
        user = UserInfo.objects.filter(uname=username).values('id','upwd')

        if user is not None and bcrypt.checkpw(upwd.encode(),user[0].get('upwd').encode()):
            # 记录用户登录状态,存储到session当中
            login(request, user)
            response = redirect(next_url)
            if len(remember)==1:
                response.set_cookie('name', username, max_age=7*24*3600)
            else:
                response.delete_cookie('name')
            return response
        else:
            return render(request, 'user/login.html', {'error': '用户名或密码错误'})
    if 'name' in request.COOKIES:
        username = request.COOKIES.get('name', 0)
    else:
        username = ''
    return render(request, 'user/login.html', {'username': username})
12-30 21:15