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)