话不多说,上代码
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})



