flask的两种巧妙封装形式

 1,使用装饰器来封装登录验证!

'''functools.wraps(fn) 使得调用装饰器的时候能改为自己原来的名字
    使用装饰器,增加了验证的功能!必须这样设置,因为不设置所有使用这个装饰器的都会改成一样的名字!
'''
def user_show(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        user_id = session.get('user_id')
        # 在这里设置默认为 None是为了下面没有session记录时候,以None执行!
        user = None
        if user_id:
            try:
                user = User.query.get(user_id)
            except Exception as e:
                current_app.logger.error(e)
        # g 变量的生命周期只是一个请求的周期
        g.user = user
        return fn(*args, **kwargs)
    return wrapper

装饰器的使用!

from info.utils.common import user_show

@news_blue.route('/<int:news_id>')
@user_show
def get_news_detail(news_id):
    user = g.user
    pass

 2,巧妙的生成数据库对象的属性!在模型类之中定义 to_dict() 方法生成对象属性的字典!

def to_dict(self):
    resp_dict = {
        "id": self.id,
        "nick_name": self.nick_name,
        "avatar_url": constants.QINIU_DOMIN_PREFIX + self.avatar_url if self.avatar_url else "",
        "mobile": self.mobile,
        "gender": self.gender if self.gender else "MAN",
        "signature": self.signature if self.signature else "",
        "followers_count": self.followers.count(),
        "news_count": self.news_list.count()
    }
    return resp_dict

在视图之中直接使用 to_dict() 方法

paginates = News.query.filter(*filter).order_by(News.create_time.desc()).paginate(page, per_page, False)
# 获取分页的每一条数据!
new_model_list = paginates.items
# 总页数
total_page = paginates.pages
# 当前页数
current_page = paginates.page

news_dict_li = []
    for new in new_model_list:
        news_dict_li.append(new.to_dict())

data = {
        'news_dict_li': news_dict_li,
    }
    return jsonify(errno=RET.OK, errmag='ok', data=data)

 

posted @ 2018-06-01 23:19  十七楼的羊  阅读(461)  评论(0编辑  收藏  举报