python - 关于django view的优雅处理方式?
怪我咯
怪我咯 2017-04-18 09:46:07
0
5
415

想想应该先上需求的,目的就是检测用户信息如果不是完整的,则将在用户登录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又不能提前调用。
请问有什么方法可以写的优雅一点呢?想要包装一下,可以给每一个方法都能优雅的调用

怪我咯
怪我咯

走同样的路,发现不同的人生

reply all(5)
Ty80

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)
伊谢尔伦

If required by each page and each method, you should use middleware to implement the process_request method

Ty80

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...

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!