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

访问效果

在这里插入图片描述

原文地址:https://blog.csdn.net/xuyanwei5/article/details/110142497

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Jinja2:是Python的Web项目中被广泛应用的模板引擎,是由Python实现的模板语言,Jinja2 的作者也是 Flask 的作者。他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
Fullcalendar日历使用,包括视图选择、事件插入、编辑事件、事件状态更改、事件添加和删除、事件拖动调整,自定义头部,加入el-popover显示图片、图片预览、添加附件链接等,支持手机显示。
监听QQ消息并不需要我们写代码,因为市面上已经有很多开源QQ机器人框架,在这里我们使用go-cqhttp官方文档:go-cqhttp如果您感兴趣的话,可以阅读一下官方文档,如果不想看,直接看我的文章即可。
【Flask框架】—— 视图和URL总结
python+web+flask轻量级框架的实战小项目。登录功能,后续功能可自行丰富。
有了这个就可以配置可信IP,关键是不需要企业认证,个人信息就可以做。
本专栏是对Flask官方文档中个人博客搭建进行的归纳总结,与官方文档结合事半功倍。 本人经验,学习一门语言或框架时,请首先阅读官方文档。学习完毕后,再看其他相关文章(如本系列文章),才是正确的学习道路。
本专栏是对Flask官方文档中个人博客搭建进行的归纳总结,与官方文档结合事半功倍。基础薄弱的同学请戳Flask官方文档教程 本人经验,学习一门语言或框架时,请首先阅读官方文档。学习完毕后,再看其他相关文章(如本系列文章),才是正确的学习道路。 如果python都完全不熟悉,一定不要着急学习框架,请首先学习python官方文档,一步一个脚印。要不然从入门到放弃是大概率事件。 Python 官方文档教程
快到年末了 相信大家都在忙着处理年末数据 刚好有一个是对超市的商品库存进行分析的学员案例 真的非常简单~
一个简易的问答系统就这样完成了,当然,这个项目还可以进一步完善,比如 将数据存入Elasticsearch,通过它先进行初步的检索,然后再通过这个系统,当然我们也可以用其他的架构实现。如果你对这系统还有其他的疑问,也可以再下面进行留言!!!
#模版继承和页面之间的调用@app.route("/bl")def bl(): return render_template("file_2.html")主ht
#form表达提交@app.route("/data",methods=['GET','POST']) #methods 让当前路由支持GET 和
#form表达提交@app.route("/data",methods=['GET','POST']) #methods 让当前路由支持GET 和
#session 使用app.secret_key = "dsada12212132dsad1232113"app.config['PERMANENT_SESSION_LI
#文件上传@app.route("/file",methods=['GET','POST'])def file(): if request.meth
#跳转操作:redirect@app.route("/red")def red(): return redirect("/login")
#session 使用app.secret_key = "dsada12212132dsad1232113"app.config['PERMANENT_SESSION_LI
@app.route("/req",methods=['GET','POST'])def req(): print(request.headers)
#模版继承和页面之间的调用@app.route("/bl")def bl(): return render_template("file_2.html")主ht
#文件操作:send_file,支持图片 视频 mp3 文本等@app.route("/img")def img(): return send_file("1.jpg&q