想想应该先上需求的,目的就是检测用户信息如果不是完整的,则将在用户登录5分钟后弹到提示页面,用户除了点击登出或者补全信息,才能继续浏览,否则查看任何页面都转跳到complete
页面
我的实现方法是这样的,在登录的时候,给session
加上一个ttl的字段,然后在除了登出和补全信息的页面外,其他都在超时后就自动转跳
已经试着用了楼下给出去的中间件形式,可是发现会无限跳转。不知道是不是代码有问题。
小白,如果有错误请原谅
先上代码
# ttl 是登录后user取出来的last_time做了一下延迟的时间,已经格式化为str
# app/views.py
def index(request, tag=None, sort=None):
if datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S') > request.session['ttl']:
return redirect(to='complete')
...
return render(request, 'index.html', context)
我想在每一个页面开头(每一个方法开头)都做一个这样的判断
if datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S') > request.session['ttl']:
return redirect(to='complete')
但是觉得不是很美观,但是包装成方法
def is_ttd(ttl):
if datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S') > ttl:
return redirect(to='complete')
调用的时候
def index(request, tag=None, sort=None):
is_ttd(request.session['ttl'])
...
return render(request, 'index.html', context)
是没有用的,但是又不能直接加return
在前面
但是如果写成这样,
def index(request, tag=None, sort=None):
ttd = is_ttd(request.session['ttl'])
if ttd:return ttd
...
return render(request, 'index.html', context)
就更加不美观了。
写成装饰器的话,index
里面才传入的request
又不能提前调用。
请问有什么方法可以写的优雅一点呢?想要包装一下,可以给每一个方法都能优雅的调用
Written as decorator, it is very suitable for this scenario. The request will also be passed to the decorator for processing first, as follows:
If required by each page and each method, you should use middleware to implement the process_request method
It feels like you can write a universal view. This is a class-based view. Write this method in the parent class.
You can use the
django.contrib.auth.decorators.user_passes_test
method.This must be written as middleware, refer to
http://www.ziqiangxuetang.com...