Fork me on GitHub

Flask之蓝图

一、什么是蓝图

  蓝图的基本设想是它们记录注册到一个应用时的操作执行情况。 当从一个端点到另一端分发请求和生成 URL 时,Flask 关联视图函数和蓝图。也就是随着我们开发程序越来越大,将代码进行模块化管理。我们之前可能是将所有代码都写在一个py文件,例如:

from flask import Flask

app = Flask(__name__)


@app.route('/home')
def home():
    return "home"


@app.route('/login')
def login():
    return "login"


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

  随着功能越来越多,功能之间也需要进行区分,此时我们可以将同一功能的模块写在一个py文件,这样可以将这一个py文件当作一个蓝图,然后每一个蓝图注册到app中就可以了。

二、简单项目结构设计

I:.
│  run.py
│
├─.idea
│  │  encodings.xml
│  │  flaskPro.iml
│  │  misc.xml
│  │  modules.xml
│  │  workspace.xml
│  │
│  └─inspectionProfiles
│          Project_Default.xml
│
└─flaskPro
    │  __init__.py
    │
    ├─statics
    │      home.css
    │
    ├─templates
    │      home.html
    │      login.html
    │
    ├─views
    │  │  account.py
    │  │  blogs.py
    │  │
    │  └─__pycache__
    │          account.cpython-35.pyc
    │          blogs.cpython-35.pyc
    │
    └─__pycache__
            __init__.cpython-35.pyc

这是flask项目flaskPro下的树形结构,可以看到主要是run.py文件和flaskPro包。

1、run.py

这是整个项目的入口文件,启动项目就从这个文件开始。

from flaskPro import app  #从flaskPro 包导入app对象


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

2、flaskPro 

run.py中的app对象就是从这个包导入的,首先就是在这个包中的__init__.py文件中:

from flask import Flask

# 将Flask进行实例化,传入响应的参数,其中static_url_path是静态文件地址路径
app = Flask(__name__,template_folder='templates',static_folder='statics',static_url_path='/static')

# 将所有的蓝图导入进来,相当于汇总
from .views.account import account
from .views.blogs import blogs

# 将所有的蓝图再注入到app中,这样进行同一,请求一旦进来,由app统一分发
app.register_blueprint(account) #不加前缀 http://127.0.0.1:5000/login
app.register_blueprint(blogs,url_prefix='/blogs') #可以加入前缀,http://127.0.0.1:5000/blogs/home

可以看到在这个文件中主要做下面几件事:

  • 实例化Flask对象app
  • 导入所有的蓝图
  • 将蓝图注入到app对象

那么,这个包中剩下的views、templates、statics目录分别是蓝图文件、模板文件、静态文件。比如,views中的blogs蓝图文件:

from flask import Blueprint
from flask import render_template
from flask import request


blogs = Blueprint('blogs',__name__)

@blogs.route('/home')
def home():
    return render_template('home.html')

templates文件中home.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="/static/home.css"  type="text/css" rel="stylesheet">
</head>
<body>
<h1>home</h1>
</body>
</html>

这就是通过蓝图设计一个简单项目的结构。

三、复杂项目结构设计

I:.
│  run.py
│
├─.idea
│  │  encodings.xml
│  │  flaskPro2.iml
│  │  misc.xml
│  │  modules.xml
│  │  workspace.xml
│  │
│  └─inspectionProfiles
│          Project_Default.xml
│
└─flaskPro2
    │  __init__.py
    │
    ├─admin
    │  │  views.py
    │  │  __init__.py
    │  │
    │  ├─statics
    │  ├─templates
    │  └─__pycache__
    │          views.cpython-35.pyc
    │          __init__.cpython-35.pyc
    │
    ├─web
    │  │  views.py
    │  │  __init__.py
    │  │
    │  ├─statics
    │  ├─templates
    │  └─__pycache__
    │          views.cpython-35.pyc
    │          __init__.cpython-35.pyc
    │
    └─__pycache__
            __init__.cpython-35.pyc

这是flask项目flaskPro2下的树形结构,可以看到主要是run.py文件和flaskPro2包。

1、run.py

这是整个项目的入口文件,启动项目就从这个文件开始。

from flaskPro2 import app  #从flaskPro2 包导入app对象


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

2、flaskPro2 

run.py中的app对象就是从这个包导入的,首先就是在这个包中的__init__.py文件中:

from flask import Flask
from .admin import admin
from .web import web


app = Flask(__name__)  #app对象

# 注入蓝图
app.register_blueprint(admin,url_prefix='/admin')
app.register_blueprint(web,url_prefix='/web')

注意的是这里的每一个蓝图又相当于是每一个app一样。比如web蓝图,在web包的__init__.py文件中创建蓝图对象:

from flask import Blueprint


web = Blueprint(
    'web',
    __name__,
    template_folder='templates',
    static_url_path='static'
)  #每一个蓝图有自己独立的模板文件夹和静态文件夹

from . import views #这里的views文件是必须导入的,否则不执行views中路由注入,会导致找不到web下的路由

在views.py文件中:

from . import web

@web.route('/home')
def home():
    return 'home'

其余的蓝图与这个是一样的。

 

posted @ 2020-07-08 22:22  iveBoy  阅读(305)  评论(0编辑  收藏  举报
TOP