基于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