本篇我们介绍flask中用蓝图组织路由的用法,这样可以使整个项目看起来整洁有序。
1.文件结构
如下是本篇完成后的项目文件结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| . ├── apps │ ├── api_v1 │ │ ├── __init__.py │ │ └── user.py │ ├── config.py │ └── __init__.py ├── data │ ├── mysql │ └── redis ├── docker-compose.yml ├── Dockerfile ├── requirements.txt └── wsgi.py
|
2.wsgi.py
现在wsgi中只做创建app的操作,通过传参使用相应的配置参数:
1 2 3 4 5 6
| from apps import create_app
app = create_app("production")
if __name__ == '__main__': app.run(host="0.0.0.0", port=5000, debug=True, use_reloader=True)
|
3.apps/config.py
如下是我们的配置文件,后续相关的配置都会写在这里。
1 2 3 4 5 6 7 8 9 10 11 12 13
| class BaseConfig(object): SECRET_KEY = "faj$[oSFwdr<2u42@#sddPD"
class DevConfig(BaseConfig): pass
class ProdConfig(BaseConfig): pass
config = { 'production': ProdConfig, 'development': DevConfig }
|
4.apps/init.py
下面是我们创建flask app的初始化代码,目前主要做了加载配置文件和注册蓝图的操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| from flask import Flask
from apps.config import config from apps.api_v1 import api_v1
def create_app(config_name=None): if config_name is None: config_name = 'development'
app = Flask(__name__) app.config.from_object(config[config_name]) app.secret_key = app.config["SECRET_KEY"]
register_blueprints(app)
return app
def register_blueprints(app): app.register_blueprint(api_v1, url_prefix='/api/v1')
|
5.apps/api_v1/init.py
下面是创建一个蓝图,并导入user中的视图。
1 2 3 4 5
| from flask import Blueprint
api_v1 = Blueprint('api_v1', __name__)
from apps.api_v1.user import *
|
6.apps/api_v1/user.py
这里是我们的user视图类,代码最后几行为视图设置路由,并关联到蓝图上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| from flask.views import MethodView from flask import request
from apps.api_v1 import api_v1
class UserAPI(MethodView):
def get(self, user_id): if user_id is None: return "get user list" else: return f"get user: {user_id}"
def post(self): username = request.form['username'] password = request.form['password']
return f"add user: {username}"
def delete(self, user_id): return f"delete user: {user_id}"
def put(self, user_id): return f"update user: {user_id}"
user_view = UserAPI.as_view('user_api') api_v1.add_url_rule('/users/', defaults={'user_id': None}, view_func=user_view, methods=['GET',]) api_v1.add_url_rule('/users/', view_func=user_view, methods=['POST',]) api_v1.add_url_rule('/users/<int:user_id>', view_func=user_view, methods=['GET', 'PUT', 'DELETE'])
|
7.测试
重启构建项目后,测试应看到如下预期效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| curl 127.0.0.1:5000/api/v1/users/ get user list
curl 127.0.0.1:5000/api/v1/users/1 get user: 1
curl -X POST -d 'username=张三&password=123' 127.0.0.1:5000/api/v1/users/ add user: 张三
curl -X DELETE 127.0.0.1:5000/api/v1/users/1 delete user: 1
curl -X PUT 127.0.0.1:5000/api/v1/users/1 update user: 1
|