python - 关于django view的优雅处理方式?
怪我咯
怪我咯 2017-04-18 09:46:07
[Python讨论组]

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

怪我咯
怪我咯

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

全部回复(5)
PHP中文网

写成decorator非常合适这种场景,request也会先传给decorator来处理,如下:

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

每个页面和每个方法都需要的话,你应该使用middleware,实现process_request方法

PHP中文网

感觉上可以写一个通用视图,这个是基于类的视图,在父类中写这个方法。

阿神

可以使用django.contrib.auth.decorators.user_passes_test方法。

巴扎黑

这个一定是写中间件啊,参考
http://www.ziqiangxuetang.com...

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号