熟悉Spring Boot的朋友都知道,如果你想新建一个接口,那么这很简单,只要在controller注解标记的类里面新写方法,并在这个方法上以RequestMapping注解标记,这个方法就成为了一个接口方法。但是在Flask里面是行不通的。
在上一篇文章里我们学习了Flask的最小应用。
- 首先第一步,实例化一个Flask对象(app = Flask(name))
- 没个接口的入口也是一个方法,在这个方法上标记注解
@app.route('/mapping')
就完成了一个接口
但是随着应用体积的增大,势必要完成模块化。说白了,就是不可能所有接口都写到一个脚本里。
和Spring不同,不同脚本里的接口必须得经过一种“集中提取”的操作才能在这个Flask应用运行时,全部同时启用。
为了实现模块化,我们需要使用Blueprint(蓝图)
我们距离说明:
新建工程,在工程里我们有如下文件:
app
|-- __ init __.py # pycharm生成
|-- controller1.py # 接口1
|-- controller2.py # 接口2
|-- manager.py # 启动脚本
按照SpringBoot习惯,应用总是有一个main入口的。按照习惯,flask应用的入口为manager.py
如果按照上一篇文章里的接口的写法,我们在controller1.py和controller2.py里的代码是这样的:
from flask import Flask
con1= Flask(__name__)
@con1.route('/con1') # 同理,controller2就是con2,不再赘述
def index():
return 'con1'
if __name__ == '__main__':
con1.run()
上一篇文章也提到了,这个if块,只有你去把他当做入口来用,整个脚本才会生效。
所以我们需要一种手段来把这个接口集中到一个地方。
这就是blueprint(蓝图)
先看代码:
controller1.py:
from flask import Blueprint # 导入蓝图
con1_blueprint = Blueprint('con1',__name__) # 初始化一个蓝图,而不是Flask对象
@con1_blueprint.route('/c1') # 接口函数。比上一篇文章的代码更少!
def con1():
return 'c1 is here!'
controller2.py:
from flask import Blueprint # controller1.py的复制
con2_blueprint = Blueprint('con2',__name__)
@con2_blueprint.route('/c2')
def con2():
return 'c2 is here!'
manager.py:
这里的代码很重要了,注意看
from controller1 import con1_blueprint # 导入全部蓝图变量
from controller2 import con2_blueprint
from flask import Flask
app = Flask(__name__) # 初始化Flask对象
app.register_blueprint(con1_blueprint) # 将所有蓝图对象注册到app这个flask对象内
app.register_blueprint(con2_blueprint)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=27016, debug='true') # 启动入口
然后访问 http://localhost:27016/c1 或者c2,发现成功访问。
更合理的组织代码
现在有个小知识点还没有触及,那就是 __ init __.py 脚本。
这个脚本是IDE自动生成的,每一个python package都有一个。
按照我的理解,这里应该写一些初始化对象的代码。比如初始化一个数据库连接等动作。
按照这个逻辑,其实整个蓝图注册,manager.py的app对象初始化,实际上都可以写在init脚本里。
优化后的代码:
controller1.py 和controller2.py代码不变
__ init __.py :
from controller1 import con1_blueprint # 导入全部蓝图对象
from controller2 import con2_blueprint
from flask import Flask
app = Flask(__name__) # 初始化Flask对象
app.register_blueprint(con1_blueprint , url_prefix = '/api/v1')
app.register_blueprint(con2_blueprint, url_prefix = '/api/v2') # 将全部蓝图注册。url_prefix 参数意思为给这个蓝图内的接口地址添加前缀。
manager.py:
from app import app # 导入app包下的init脚本中初始化好的app对象
if __name__ == '__main__':
app.run(host='0.0.0.0', port=27016, debug='true') #启动程序
现在我们开放了两个接口:
但是问题又出现了。似乎这两个接口距离RESTful风格好像还差一些东西。(不知道RESTful的同学请面壁一分钟然后百度一下)
下一篇文章我们来一起学习: 如何使用flask编写RESTful风格的接口