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