鱼书项目模块化总结 (2)

方案二

from app.extensions import db,login_manager from werkzeug.security import generate_password_hash,check_password_hash #生成token的模块 from itsdangerous import TimedJSONWebSignatureSerializer as Seralize from flask_login import UserMixin from flask import current_app from .posts import Posts class User(UserMixin,db.Model): __tablename__ = 'user' id = db.Column('id',db.Integer,primary_key=True) username = db.Column(db.String(12),index=True) password_hash = db.Column(db.String(128)) sex = db.Column(db.Boolean,default=True) age = db.Column(db.Integer) email = db.Column(db.String(40)) icon = db.Column(db.String(70),default='default.jpg') #当期账户激活状态 confirm = db.Column(db.Boolean,default=False) #参数1模型名称 参数2反向引用的字段名 参数3 加载方式 提供对象 posts = db.relationship('Posts',backref='user',lazy='dynamic') #secondary在多对多关系中指定关联表的名称 favorite = db.relationship('Posts',secondary='collections',backref=db.backref('users',lazy='dynamic'),lazy='dynamic') #添加使用append 删除使用remove @property def password(self): raise ValueError @password.setter def password(self, password): self.password_hash = generate_password_hash(password) #生成token的方法 def generate_token(self): s = Seralize(current_app.config['SECRET_KEY']) return s.dumps({'id':self.id}) #检测token的方法 @staticmethod def check_token(token): s = Seralize(current_app.config['SECRET_KEY']) #从当前的token中拿出字典 try: id = s.loads(token)['id'] except: return False #根据用户id取出对应用户的对象 u = User.query.get(id) #判断 当期u对象是否存在 if not u: return False #判断当期用户的激活状态 如果没有激活 则激活 if not u.confirm: u.confirm = True db.session.add(u) return True #验证密码 def check_password_hash(self,password): return check_password_hash(self.password_hash,password) def is_favorite(self,postsId): all = self.favorite.all() for p in all: if p.id==postsId: return True #lambda表达式 if list(filter(lambda p:p.id==int(postsId),all)): return True return False #登录认证的回调,保持数据的一致性 @login_manager.user_loader def user_loader(uid): return User.query.get(int(uid)) 4 Flask工厂函数管理三方,蓝本

1 extensions.py负责三方模块的导入与

2 app.__init__.py 负责create_app初始化

3 view.__init__.py 负责蓝本的注册

方案一:

manage.py

from app import create_app from flask_script import Manager from flask_migrate import MigrateCommand #通过函数create_app进行包括蓝本/扩展/系统配置的初始化 app = create_app('default') manager = Manager(app) #给manage添加迁移命令db manager.add_command('db',MigrateCommand) if __name__ == '__main__': manager.run()

extensions.py

#extensions.py from flask_bootstrap import Bootstrap from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_mail import Mail from flask_login import LoginManager from flask_uploads import UploadSet,IMAGES,patch_request_class,configure_uploads from flask_moment import Moment from flask_cache import Cache #实例化db db = SQLAlchemy() #实例化bootstrap bootstrap = Bootstrap() #实例化migrate migrate = Migrate(db=db) #实例化邮箱 mail = Mail() #实例化用户登录模块 login_manager = LoginManager() #实例化文件对象 file = UploadSet('photos',IMAGES) moment = Moment() #simple简单缓存 # cache = Cache(config={'CACHE_TYPE':'simple'}) cache = Cache(config={'CACHE_TYPE': 'simple'}) def config_extensions(app): #bootstrap初始化app bootstrap.init_app(app) #db初始化app db.init_app(app) #migrate初始化app migrate.init_app(app=app) #mail初始化 mail.init_app(app) #登录模块初始化 login_manager.init_app(app) #moment时间模块初始化 moment.init_app(app) cache.init_app(app=app) #需要指定登录端点 login_manager.login_view ='user.login' #提示信息 login_manager.login_message = '请登录再访问' #设置session保护级别 login_manager.session_protection = 'strong' #配置文件上传 configure_uploads(app,file) patch_request_class(app,size=None)

app.__init__.py

#app.__init__.py from flask import Flask,render_template from app.settings import config from app.extensions import config_extensions from app.views import config_blueprint #初始化当前整个应用的函数 def create_app(config_name): app = Flask(__name__) #导入settings配置信息 app.config.from_object(config[config_name]) #第三方库初始化 config_extensions(app) #注册所有的蓝本函数 config_blueprint(app) #错误页面绑定app errors(app) return app def errors(app): @app.errorhandler(404) def page_not_found(e): return render_template('errors/error.html',error=e) @app.errorhandler(500) def page_not_found(e): return render_template('errors/error.html', error=e)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjsdx.html