组件踩坑记录 : 先注册组件在使用配置(...)
flask-script
Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任务;使得脚本和系统分开;
Flask Script和Flask本身的工作方式类似,只需定义和添加从命令行中被Manager实例调用的命令;
安装
pip install flask-script
创建并运行命令
首先,创建一个Python模板运行命令脚本,可起名为manager.py;
在该文件中,必须有一个Manager实例,Manager类追踪所有在命令行中调用的命令和处理过程的调用运行情况;
Manager只有一个参数——Flask实例,也可以是一个函数或其他的返回Flask实例;
调用manager.run()启动Manager实例接收命令行中的命令;
from flask_script import Manager from debug import app manager = Manager(app) if __name__ == '__main__': manager.run()
然后就可以在项目目录下执行命令来启动项目了
python manage.py runserver
创建更多命令
from flask_script import Manager from flask import Flask app = Flask(__name__) manager = Manager(app) @manager.command def custom(arg): """ 自定义命令 python manage.py custom 123 :param arg: :return: """ print(arg) @manager.option('-n', '--name', dest='name') @manager.option('-u', '--url', dest='url') def cmd(name, url): """ 自定义命令 执行: python manage.py cmd -n wupeiqi -u http://www.oldboyedu.com 执行: python manage.py cmd --name wupeiqi --url http://www.oldboyedu.com :param name: :param url: :return: """ print(name, url) if __name__ == '__main__': manager.run()
flask-sqlalchemy
将flask与sqlalchemy封装到了一起,并且是基于线程隔离的方式
使用
实例化SQLAlchemy对象,将Flask对象注册进SQLAlchemy对象中
from flask import Flask from flask_sqlalchemy import SQLAlchemy # 包含了SQLAlchemy相关的所有操作 db = SQLAlchemy() app = Flask(__name__) app.config.from_object('settings.DevelopmentConfig') from .views.account import ac # 导入蓝图时应注意蓝图中可能导入了db对象,所以要在db对象生成后导入 app.register_blueprint(ac) db.init_app(app)
配置文件设置
class BaseConfig(object): SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/s8day130db?charset=utf8" SQLALCHEMY_POOL_SIZE = 5 SQLALCHEMY_POOL_TIMEOUT = 30 SQLALCHEMY_POOL_RECYCLE = -1
模型类:
from sqlalchemy import Column, Integer, String from s8day130_pro import db class Users(db.Model): __tablename__ = 'users' id = Column(Integer, primary_key=True,autoincrement=True) name = Column(String(32),nullable=False,unique=True)
离线脚本生成表/删除表
# 导入db # 导入app with app.app_context(): db.drop_all() # db.create_all()
踩坑记录1 -- 无法生成表, 解决方法 : 把所有的模型导入
在视图函数中使用SQLAlchemy操作数据库
from flask import blueprints ac = blueprints.Blueprint('ac',__name__) @ac.route('/login',methods=['GET','POST']) def login(): data = db.session.query(models.Users).all() print(data) db.session.remove() return 'Login'
flask-migrate
帮助flask做数据库迁移,他是基于flask-script和flask-migrate来做的
安装
pip install flask-migrate
使用
# 导入db,app from flask_script import Manager from flask_migrate import Migrate, MigrateCommand manager = Manager(app) migrate = Migrate(app, db) """ # 数据库迁移命名 python manage.py db init python manage.py db migrate python manage.py db upgrade """ manager.add_command('db', MigrateCommand)
自定义一个登陆验证的组件
from flask import request,session,redirect class Auth(object): def __init__(self,app=None): self.app = app if app: # 实例化时完成注册 self.init_app(app) def init_app(self,app): # 也可手动完成注册过程 app.auth_manager = self # 将自身添加进app中 self.app = app app.before_request(self.check_login) # 添加一个before_request app.context_processor(self.context_processor) # 向模板中添加新的变量 def check_login(self): """ 检查用户是否已经登录 :return: """ if request.path == '/login': return user = session.get('user') if not user: return redirect('/login') def context_processor(self): user = session.get('user') return dict(current_user=user) def login(self,data): """ 将用户登录信息,放入session :param data: :return: """ session['user'] = data def logout(self): """ 将用户登录信息,放入session :param data: :return: """ del session['user']