想想应该先上需求的,目的就是检测用户信息如果不是完整的,则将在用户登录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
又不能提前调用。
请问有什么方法可以写的优雅一点呢?想要包装一下,可以给每一个方法都能优雅的调用
PHP中文网2017-04-18 09:48:07
Written as decorator, it is very suitable for this scenario. The request will also be passed to the decorator for processing first, as follows:
def ttd(func):
def wrapper(request, *args):
if datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S') > request.session['ttl']:
return redirect(to='complete')
return func(request, *args)
return wrapper
@ttd
def index(request, tag=None, sort=None):
# ...
# return render(request, 'index.html', context)
伊谢尔伦2017-04-18 09:48:07
If required by each page and each method, you should use middleware to implement the process_request method
PHP中文网2017-04-18 09:48:07
It feels like you can write a universal view. This is a class-based view. Write this method in the parent class.
巴扎黑2017-04-18 09:48:07
This must be written as middleware, refer to
http://www.ziqiangxuetang.com...