python flask项目配置以及动态注册蓝图

已经挺久没做flask开发了,现在主要为了给大家分享一些关于之前flask项目开发的经验总结,希望对大家有所帮助!
flask启动项目里的初始化文件一般包括,初始化app,初始化配置config,注册蓝图等步骤!
最中规中矩的方式就是每次新增一个新的模块就在初始化文件中手动加两行代码用于蓝图的注册!

其中SECRET_KEY一定要设置,且最好为随机数,可以防止csrf,不然会出现 Must provide secret_key to use csrf 错误提醒!


import os

class Config(object):
    SECRET_KEY = 'wwzgYXYPI/ytEfA4wP1W5KucP21vaDaiusGaO5OlaOBw5O1Bg1f3nmg+G0VkauQPQEodiI4AKXF05rLPNmvquFYC'

    @staticmethod
    def init_app(app):

        pass

class DevConfig(Config):
    DEBUG = True
    SQLALCHEMY_ECHO = True
    CELERY_BROKER_URL = 'redis://localhost:6379/0'
    CELERY_BACKEND_URL = 'redis://localhost:6379/0'
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@ip:port/dev_db"

config = {'development': DevConfig}

import os, base64

def create_key(length):
    random_str = os.urandom(length)
    byte_ret = base64.b64encode(random_str)
    result = byte_ret.decode('unicode_escape')
    return result

if __name__ == '__main__':
    create_key(66)

from flask import Flask, redirect, url_for
from config import config
from flask_sqlalchemy import SQLAlchemy
from .extensions import celery
from flask_login import LoginManager, login_required, current_user

db = SQLAlchemy()
login_manager = LoginManager()
login_manager.session_protection = 'strong'
login_manager.login_view = 'auth.login'

def create_app(config_name='development'):
    '''
    1: 创建一个app应用程序
    2: 把配置对象传递给所创建的app
    '''
    app = Flask(__name__)
    app.config.from_object(config[config_name])

    db.init_app(app)
    celery.init_app(app)
    login_manager.init_app(app)
    login_manager.login_message = '请先登录'

    from app.auth import auth as auth_bp
    app.register_blueprint(auth_bp, url_prefix='/auth')

    from app.main import main as main_bp
    app.register_blueprint(main_bp, url_prefix='/main')

    @app.route('/')
    @login_required
    def index():
        return redirect(url_for('main.index'))

    return app

很显然如果开发的功能较少的情况下,以上那种针对蓝图逐个注册是问题不大,一旦项目业务越来越复杂时,以上这种方式会出现一大片注册代码,且都是做同样的事,既不美观也不简洁,所以可以采用批量注册的方式进行代码优化,封装动态注册蓝图函数!

  • 方式一
import importlib
import os

def auto_register_blueprint(app):
    path = os.path.dirname(os.path.abspath(__file__))
    base_file = path.split('\\')[-1]
    for filename in os.listdir(path):
        file_path = os.path.join(path, filename)
        if not os.path.isdir(file_path):
            continue
        if not os.path.exists(os.path.join(file_path, '__init__.py')):
            continue
        auto_blueprint = importlib.import_module(f'{base_file}.' + filename).__dict__[filename]
        app.register_blueprint(auto_blueprint, url_prefix=f'/{filename}')
  • 方式二
from werkzeug.utils import import_string
import os

def auto_register_blueprint(app):
    path = os.path.dirname(os.path.abspath(__file__))
    base_file = path.split('\\')[-1]
    for filename in os.listdir(path):
        file_path = os.path.join(path, filename)
        if not os.path.isdir(file_path):
            continue
        if not os.path.exists(os.path.join(file_path, '__init__.py')):
            continue
        auto_blueprint = import_string(f'{base_file}.' + filename + ".__init__:" + filename)
        app.register_blueprint(auto_blueprint, url_prefix=f'/{filename}')

优化后的初始化__init__.py文件如下:

def create_app(config_name='development'):
    '''
    1: 创建一个app应用程序
    2: 把配置对象传递给所创建的app
    '''
    app = Flask(__name__)
    app.config.from_object(config[config_name])

    db.init_app(app)
    celery.init_app(app)
    login_manager.init_app(app)
    login_manager.login_message = '请先登录'

    auto_register_blueprint(app)

    @app.route('/')
    @login_required
    def index():
        return redirect(url_for('main.index'))

    return app

from flask_script import Manager, Shell, Server
from app import create_app, db

app = create_app('development')
manager = Manager(app)

def make_shell_context():
    return dict(app=app, db=db)

manager.add_command('shell', Shell(make_context=make_shell_context))

if __name__ == '__main__':
    manager.run()

以上的这些项目基本文件都配置好,项目就可以启动了,进入shell命令:

python manage.py shell

项目启动命令,其中的host、port为可选参数:

python manage.py runserver --host 0.0.0.0 --port 8888

单个子模块的蓝图配置,例如针对account模块蓝图注册,在account文件下新建__init__.py文件,如下:

from flask import Blueprint

account = Blueprint('account', __name__)

from .forms import *
from .views import *
from .models import *

Original: https://blog.csdn.net/Lin_Hv/article/details/113112527
Author: Thomas_Lean
Title: python flask项目配置以及动态注册蓝图

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/749191/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【Python数据科学 | 11】应用实战:我的第一个开源项目-基金定投回测工具

    这是机器未来的第60篇文章 原文首发地址:https://robotsfutures.blog.csdn.net/article/details/127712752 ; 《Pyth…

    Python 2023年9月3日
    052
  • CVPR2022论文列表(中英对照)

    Cascade Transformers for End-to-End Person Search用于端到端人员搜索的级联变压器Compositional Temporal Gro…

    Python 2023年10月27日
    031
  • docker基础学习

    虚拟机上部署应用示意图 虚拟机的优点 可以把资源分配到不同的虚拟机,达到硬件资源的最大化利用 与直接在物理机上部署应用,虚拟更容易扩展应用。 云服务:通过虚拟机虚拟出不同的物理资源…

    Python 2023年6月10日
    092
  • 关于某宝花指令还原

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/pythonywy/p/16288743.htmlAut…

    Python 2023年6月15日
    065
  • drf 视图家族

    视图家族 """ views:视图 generics:工具视图 mixins:视图工具集 viewsets:视图集 ""&quot…

    Python 2023年6月12日
    058
  • yolov5结果解析

    Confusion matrix 以这种形式给出矩阵的值g t c l a s s 1 gt_{class1}g t c l a ss 1 ​g t c l a s s 2 gt_…

    Python 2023年8月3日
    044
  • Pandas库

    Pandas是python第三方库,提供高性能易用数据类型和分析工具。Pandas基于NumPy实现,常与NumPy和Matplotlib一同使用。pandas库引用: impor…

    Python 2023年8月28日
    042
  • 超详细的 pytest 钩子函数 之初始钩子和引导钩子来啦

    一、什么是钩子函数 钩子函数在 pytest 称之为 Hook 函数,它 pytest 框架的开发者,为了让用户更好的去扩展开发预留的一些函数。而预留的这些函数,在整个测试执行的生…

    Python 2023年9月9日
    054
  • 【测试基础】软件测试框架Pytest和Unittest的区别

    本文将从多个维度分别列出软件测试框架pytest和unittet的区别 一、是否需要安装 1、UnittestUnittest是Python自带的测试框架,因此不需要安装(也被称为…

    Python 2023年9月11日
    035
  • python实现sha1加密算法

    python实现sha1加密算法 原创 CorwinPC2022-07-18 17:21:56博主文章分类:Python ©著作权 文章标签 加密 字符串 加密算法 封装 文章分类…

    Python 2023年5月25日
    072
  • Python实现导弹自动追踪

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年10月8日
    029
  • MCU-51:矩阵键盘

    题目 一、矩阵键盘介绍 * 1.1 矩阵键盘 1.2 扫描的概念 二、编程 * 2.1 LCD屏显示”HelloWord” 2.2 矩阵键盘程序 三、矩阵键…

    Python 2023年10月27日
    039
  • CANN 6.0来了,硬核技术抢先看

    摘要:在华为全联接大会2022期间,华为正式官宣昇腾AI异构计算架构CANN 6.0版本将在年底正式发布。 在华为全联接大会2022期间,华为正式官宣昇腾AI异构计算架构CANN …

    Python 2023年10月28日
    039
  • python柱状图加百分比_python matplotlib 为柱状图添加百分比

    背景 最近使用python matplotlib绘制柱状图时,想要更清晰地查看每一项占总数的百分比,在搜索后发现matplotlib.pyplot.bar方法并没有提供这个参数,于…

    Python 2023年9月3日
    051
  • 10.数据库-Matplotlib

    Matplotlib 文章目录 * – Matplotlib – + 1.基础图象绘制 + * 1.1 完善原始折线图-给图形添加辅助功能 * 1.2中文显…

    Python 2023年9月6日
    077
  • Python批量导出word文档中的图片、嵌入式文件

    学生试卷中的题目有要提交截图的,也有要提交文件的,为了方便学生考试,允许单独交或者嵌入Word中提交,那么事后如何整理学生的答案?单独提交的比较方便,直接扫描文件名匹配名字后放入指…

    Python 2023年11月2日
    027
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球