• Flask组件


    组件踩坑记录 : 先注册组件在使用配置(...)

    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']
    

      

  • 相关阅读:
    2016-09-13面试记录
    javascript中的深度拷贝的实现过程及深拷贝的几种方法。
    javascript中的for in循环
    常见的兼容问题及其解决方法。
    一次清空所有数据方法
    数组排序
    css对齐 挖坑~
    css reset样式重置
    CSS 表单
    CSS 表格
  • 原文地址:https://www.cnblogs.com/wwg945/p/8992781.html
Copyright © 2020-2023  润新知