话不多说,上代码
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})
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)