Flask 学习-50.Flask-RESTX 结合蓝图使用
Posted 上海-悠悠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask 学习-50.Flask-RESTX 结合蓝图使用相关的知识,希望对你有一定的参考价值。
前言
flask 管理一个大的项目时,可以把项目分为几个不同的应用,通过蓝图来管理。
flask 里面的蓝图 相当于 django 的app。
蓝图基本使用
在视图部分使用蓝图
from flask import Blueprint
from flask_restx import Api
blueprint = Blueprint('api', __name__)
api = Api(blueprint)
# ...
使用蓝图绑定到app上
from flask import Flask
from apis import blueprint as api
app = Flask(__name__)
app.register_blueprint(api, url_prefix='/api/1')
app.run(debug=True)
需注意的地方
笔记
Api.init_app()此处不需要调用,因为向应用程序注册蓝图会负责为应用程序设置路由。
使用蓝图时,请记住使用蓝图名称url_for():
# without blueprint
url_for('my_api_endpoint')
# with blueprint
url_for('api.my_api_endpoint')
使用蓝图的代码示例
官方文档上的代码示例
from flask import Flask, Blueprint
from flask_restx import Api, Resource, fields
api_v1 = Blueprint("api", __name__, url_prefix="/api/1")
api = Api(api_v1, version="1.0", title="Todo API", description="A simple TODO API",)
ns = api.namespace("todos", description="TODO operations")
TODOS =
"todo1": "task": "build an API",
"todo2": "task": "?????",
"todo3": "task": "profit!",
todo = api.model(
"Todo", "task": fields.String(required=True, description="The task details")
)
listed_todo = api.model(
"ListedTodo",
"id": fields.String(required=True, description="The todo ID"),
"todo": fields.Nested(todo, description="The Todo"),
,
)
def abort_if_todo_doesnt_exist(todo_id):
if todo_id not in TODOS:
api.abort(404, "Todo doesn't exist".format(todo_id))
parser = api.parser()
parser.add_argument(
"task", type=str, required=True, help="The task details", location="form"
)
@ns.route("/<string:todo_id>")
@api.doc(responses=404: "Todo not found", params="todo_id": "The Todo ID")
class Todo(Resource):
"""Show a single todo item and lets you delete them"""
@api.doc(description="todo_id should be in 0".format(", ".join(TODOS.keys())))
@api.marshal_with(todo)
def get(self, todo_id):
"""Fetch a given resource"""
abort_if_todo_doesnt_exist(todo_id)
return TODOS[todo_id]
@api.doc(responses=204: "Todo deleted")
def delete(self, todo_id):
"""Delete a given resource"""
abort_if_todo_doesnt_exist(todo_id)
del TODOS[todo_id]
return "", 204
@api.doc(parser=parser)
@api.marshal_with(todo)
def put(self, todo_id):
"""Update a given resource"""
args = parser.parse_args()
task = "task": args["task"]
TODOS[todo_id] = task
return task
@ns.route("/")
class TodoList(Resource):
"""Shows a list of all todos, and lets you POST to add new tasks"""
@api.marshal_list_with(listed_todo)
def get(self):
"""List all todos"""
return ["id": id, "todo": todo for id, todo in TODOS.items()]
@api.doc(parser=parser)
@api.marshal_with(todo, code=201)
def post(self):
"""Create a todo"""
args = parser.parse_args()
todo_id = "todo%d" % (len(TODOS) + 1)
TODOS[todo_id] = "task": args["task"]
return TODOS[todo_id], 201
if __name__ == "__main__":
app = Flask(__name__)
app.register_blueprint(api_v1)
app.run(debug=True)
更多代码参考githubhttps://github.com/python-restx/flask-restx/tree/master/examples
以上是关于Flask 学习-50.Flask-RESTX 结合蓝图使用的主要内容,如果未能解决你的问题,请参考以下文章
五十九:Flask.Cookie之flask设置cookie过期时间