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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
**`flask_openapi3`** 基于 [Flask](https://github.com/pallets/flask/)
和 [Pydantic](https://github.com/pydantic/pydantic),因此你可以像使用Flask一样使用 **`flask_openapi3`**。
## 最小应用
像 [Flask](https://flask.palletsprojects.com/en/latest/quickstart/#a-minimal-application) 一样,创建 `hello.py`:
``` python
from flask_openapi3 import OpenAPI
app = OpenAPI(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
```
然后运行:
```shell
python hello.py
```
你将会看到输出信息:
```
* Serving Flask app 'just_flask' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```
## REST API
你可以在 `flask-openapi3` 中使用 **`get`**,**`post`**,**`put`**,**`patch`**,**`delete`** 等 REST API 。
```python
from flask_openapi3 import OpenAPI
app = OpenAPI(__name__)
@app.get('/book')
def get_books():
return ["book1", "book2"]
@app.post('/book')
def create_book():
return {"message": "success"}
if __name__ == '__main__':
app.run()
```
## APIBlueprint
[APIBlueprint](./Reference/APIBlueprint.md)
基于 [Flask Blueprint](https://flask.palletsprojects.com/en/latest/tutorial/views/#create-a-blueprint),
你应该使用 **`register_api`** 来代替 **`register_blueprint`**。
```python hl_lines="14"
from flask_openapi3 import OpenAPI
app = OpenAPI(__name__)
api = APIBlueprint('/book', __name__, url_prefix='/api')
@api.post('/book')
def create_book():
return {"message": "success"}
# register api
app.register_api(api)
if __name__ == '__main__':
app.run()
```
## 嵌套 APIBlueprint
允许一个 **API Blueprint** 被另一个 **API Blueprint** 注册。
更多信息请查看 [Flask Nesting Blueprints](https://flask.palletsprojects.com/en/latest/blueprints/#nesting-blueprints)。
```python hl_lines="21 22"
from flask_openapi3 import OpenAPI, APIBlueprint
app = OpenAPI(__name__)
api = APIBlueprint('book', __name__, url_prefix='/api/book')
api_english = APIBlueprint('english', __name__)
api_chinese = APIBlueprint('chinese', __name__)
@api_english.post('/english')
def create_english_book():
return {"message": "english"}
@api_chinese.post('/chinese')
def create_chinese_book():
return {"message": "chinese"}
# register nested api
api.register_api(api_english)
api.register_api(api_chinese)
# register api
app.register_api(api)
if __name__ == '__main__':
app.run(debug=True)
```
## APIView
[基于类的 API 视图](./Reference/APIView.md), 点击[这里](https://github.com/luolingchun/flask-openapi3/blob/APIView/examples/api_view_demo.py) 查看完整示例:
```python
@api_view.route("/book")
class BookListAPIView:
a = 1
@api_view.doc(summary="get book list")
def get(self, query: BookQuery):
print(self.a)
return query.json()
@api_view.doc(summary="create book")
def post(self, body: BookBody):
"""description for create book"""
return body.json()
```
## 异步 API
在定义函数时使用 `async`。 更多信息参考 [Using async and await — Flask Documentation](https://flask.palletsprojects.com/en/latest/async-await/)。
!!! info
你需要使用 pip 手动安装 `asgiref`:
```bash
pip install flask-openapi3[async]
# or
pip install asgiref
```
```python hl_lines="2"
@app.post('/open/api')
async def post_openapi(body: Query):
print(body)
return 'POST, OpenAPI!'
```
|