其他分享
首页 > 其他分享> > 基于flask仿照django进行简单的项目架构

基于flask仿照django进行简单的项目架构

作者:互联网

使用flask编写简单的项目框架创建蓝图(仅供小白学习参考)

1.创建项目

创建主文件main.py,创建文件包applications 在__Init__文件中配置

from flask_migrate import Migrate,MigrateCommand
# 创建应用对象
app = Flask(__name__)

# 创建数据库对象
db = SQLAlchemy()

# 数据迁移
migrate = Migrate()

# 创建终端脚本管理对象
manager = Manager()
def init_app():
    manager.app = app
    return manager

main.py文件中配置

from application import  init_app
manager = init_app()

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

现在就可以使用python manage.py runserver 运行代码了

2.通过调整manager对象中的路径,可以导入需要的静态文件

在application文件中创建settings配置文件包,在settings文件中创建prod.py和dev,py文件

settings文件包中配置_init_.py文件

class InitConfig():
    DEBUG = True

prod.py

from  . import InitConfig
class Config(InitConfig):
    '''线上运营配置文件'''
    DEBUG = False

dev.py

from  . import InitConfig
class Config(InitConfig):
    '''本站开发配置文件'''
    pass

同时在settings同级文件下创建utils文件包 _init_.py文件中配置

from importlib import  import_module
def load_config(config_path):
    # 根据字符串路径进行模块导报,识别中的变量成员
    module = import_module(config_path)
    config_flie_path = config_path.split('.')[-1]
    #判断路径返回不同的配置文件类
    if config_flie_path == 'settings':
        return  module.InitConfig
    return module.Config

对main.py文件和applications 在__Init__文件进行相应的调整

manager = init_app('application.settings')
def init_app(config_path):
    #自动加载配置
    Config = load_config(config_path)
    #启动文件,加载配置信息
    app.config.from_object(Config)
    #挂载应用对象
    manager.app = app
    #对外暴露对象
    return manager

这样我们就可以通过调整manager对象中的路径,可以导入需要的静态文件

3.通过自定义代码创建需要的蓝图结构( 应用到flask_script)

在utils文件下创建自定义方法文件command.py 把需要的目录结构写入代码中

from flask_script import Command, Option
import os
class BluePrintCommand(Command):

    name = "blue"  # 命令的调用别名
    option_list = [
        Option("--name","-n",help="蓝图名称")
    ]

    def run(self,name=None):
        if name is None:
            print("蓝图名称不能为空!")
            return
        if not os.path.isdir(name):
            os.mkdir(name)
        open("%s/__init__.py" % name,"w")
        open("%s/views.py" % name,"w")init__
        open("%s/models.py" % name,"w")
        with open("%s/urls.py" % name,"w") as f:
            f.write("""from . import views
urlpatterns = [

]
""")

utils文件包 _init_.py文件中配置载入方法load_command

import inspect
from importlib import  import_module
from flask_script import Command
def load_command(manager,command_path):
    '''自动加载命令'''
    module = import_module(command_path)
    #搜索当前模块下所有类
    class_list = inspect.getmembers(module, inspect.isclass)
   
    for class_name, class_object in class_list:
        if issubclass(class_object, Command) and class_name != "Command":
            #载入到manger对象中
            manager.add_command(class_object.name, class_object)

application 在__Init__文件配置加载方法

def init_app(config_path):
    #自动加载配置
    Config = load_config(config_path)
    #启动文件,加载配置信息
    app.config.from_object(Config)
    # 挂载应用对象
    manager.app = app
    #自动加载终端命令
    load_command(manager,'application.utils.commands')

    # 对外暴露对象
    return manager

执行代码

python3 manager.py blue -n=homeshell

执行结果

在这里插入图片描述

4.注册路由返回视图函数

把home文件夹移到apps文件加下,同时home文件夹下

views.py

def index():
    return 'ok'

urls.py

from . import views
from  application.utils import  path
urlpatterns = [
    path ('/home', views.index),
]

为路由urls文件添加path方法,在utils文件下的__Init__文件中添加

def path(url,view_func):
    '''注册路由'''
    return {'rule':url,'view_func':view_func}

同时添加注册蓝图对象方法

from flask import Blueprint
def load_blueprint(app):
    '''自动加载蓝图'''
    #从配置文件中根据INSTALLED_APPS进行循环,在蓝图中进行注册
    for blueprint_path in app.config.get("INSTALLED_APPS"):
        blueprint_name = blueprint_path.split(".")[-1]
        #创建蓝图对象
        blue = Blueprint(blueprint_name,blueprint_path)
        #蓝图对象自动注册路由
        blue_urls_module = import_module(blueprint_path + ".urls")
        for urls_item in blue_urls_module.urlpatterns:
            blue.add_url_rule(**urls_item)
        #注册蓝图
        app.register_blueprint(blue,url_prefix='')

在settings/__Init__文件添加INSTALLED_APPS属性

INSTALLED_APPS=[
]

在dev文件中配置INSTALLED_APPS,把home路径添加进去

INSTALLED_APPS=[
        'application.apps.home',
    ]

更改manager对象的静态配置文件manager.py

manager = init_app('application.settings.dev')
5.设置总路由

在settings文件夹下的总静态文件_init_.py配置总路由地址

class InitConfig():
    DEBUG = True
    #总路由地址
    URL_PATH = 'application.urls'
    #蓝图列表
    INSTALLED_APPS=[

    ]

在application 创建总路由文件urls.py文件

'''总路由'''
from application.utils import  path,include
urlpatterns = [
    include('/index','home.urls')
]

在utils文件下的__Init__文件加载蓝图方法进行适当调整,并添加include方法

def load_blueprint(app):
    '''自动加载蓝图'''
    # 获取总路由
    app_url_list = import_module(app.config.get('URL_PATH')).urlpatterns
    #从配置文件中根据INSTALLED_APPS进行循环,在蓝图中进行注册
    for blueprint_path in app.config.get("INSTALLED_APPS"):
        # 获取蓝图名称
        blueprint_name = blueprint_path.split(".")[-1]
        # 获取当前路径下的url_prefix参数
        for blueprint_url in app_url_list:
            if blueprint_url.get("path") == blueprint_name + ".urls":
                url_prefix = blueprint_url.get("url_prefix")
                break
        #创建蓝图对象
        blue = Blueprint(blueprint_name,blueprint_path)
        #蓝图对象自动注册路由
        blue_urls_module = import_module(blueprint_path + ".urls")
        for urls_item in blue_urls_module.urlpatterns:
            blue.add_url_rule(**urls_item)
        #注册蓝图
        app.register_blueprint(blue,url_prefix=url_prefix)

def include(url,blueprint_path):
    return {'url_prefix':url, 'path':blueprint_path}

访问效果
在这里插入图片描述

标签:blueprint,__,flask,app,py,django,import,仿照,path
来源: https://blog.csdn.net/xuyanwei5/article/details/110142497