跳到主要内容

快速入门

helloworld

from flask import Flask
from flask_restplus import Api, Resource

app = Flask(__name__)
api = Api(app)


@api.route("/hello")
class HelloWorld(Resource):
def get(self):
return {"hello": "world"}


if __name__ == "__main__":
app.run(debug=True)

新项目把 from flask_restplus import ... 换成 from flask_restx import ... 即可。

HTTP 资源路由

from flask import Flask, request
from flask_restplus import Api, Resource

app = Flask(__name__)
api = Api(app)

todos = {}


@api.route("/<string:todo_id>")
class TodoSimple(Resource):
def get(self, todo_id):
return {todo_id: todos[todo_id]}

def put(self, todo_id):
todos[todo_id] = request.form["data"]
return {todo_id: todos[todo_id]}


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

端点(endpoint)

@api.route()endpoint 参数用于指定内部端点名称,配合 url_for 反查:

@api.route("/todo", endpoint="todo_ep")
class Todo(Resource):
def get(self):
return {"uri": "todo"}


# 反查 URL
with app.test_request_context():
print(url_for("todo_ep")) # /todo

完整示例

from flask import Flask
from flask_restplus import Api, Resource, fields
from werkzeug.middleware.proxy_fix import ProxyFix

app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)
api = Api(
app,
version="1.0",
title="TodoMVC API",
description="A simple TodoMVC API",
)

ns = api.namespace("todos", description="TODO operations")

todo = api.model(
"Todo",
{
"id": fields.Integer(readonly=True, description="The task unique identifier"),
"task": fields.String(required=True, description="The task details"),
},
)


class TodoDAO:
def __init__(self):
self.counter = 0
self.todos = []

def get(self, id):
for todo in self.todos:
if todo["id"] == id:
return todo
api.abort(404, f"Todo {id} doesn't exist")

def create(self, data):
todo = data
todo["id"] = self.counter = self.counter + 1
self.todos.append(todo)
return todo

def update(self, id, data):
todo = self.get(id)
todo.update(data)
return todo

def delete(self, id):
todo = self.get(id)
self.todos.remove(todo)


DAO = TodoDAO()
DAO.create({"task": "Build an API"})
DAO.create({"task": "?????"})
DAO.create({"task": "profit!"})


@ns.route("/")
class TodoList(Resource):
@ns.doc("list_todos")
@ns.marshal_list_with(todo)
def get(self):
return DAO.todos

@ns.doc("create_todo")
@ns.expect(todo)
@ns.marshal_with(todo, code=201)
def post(self):
return DAO.create(api.payload), 201


@ns.route("/<int:id>")
@ns.response(404, "Todo not found")
@ns.param("id", "The task identifier")
class Todo(Resource):
@ns.doc("get_todo")
@ns.marshal_with(todo)
def get(self, id):
return DAO.get(id)

@ns.doc("delete_todo")
@ns.response(204, "Todo deleted")
def delete(self, id):
DAO.delete(id)
return "", 204

@ns.expect(todo)
@ns.marshal_with(todo)
def put(self, id):
return DAO.update(id, api.payload)


if __name__ == "__main__":
app.run(debug=True)

原示例中的 from werkzeug.contrib.fixers import ProxyFix 已失效(werkzeug 1.0+ 移除 contrib),应使用 from werkzeug.middleware.proxy_fix import ProxyFix

参考