簡體   English   中英

Flask-Restx Swagger 文檔問題

[英]Flask-Restx Swagger Doc issue

我得到 AttributeError: module 'flask_restx.api' has no attribute 'doc' 當它嘗試在使用 flask restx 時為 API 添加額外的。 如何修復此錯誤。

api.py

from flask import Flask
from flask_restx import Api, Resource
from hello import Hello

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

api.add_resource(Hello, '/hello')

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

你好.py

from flask_restx import Resource, api


@api.doc(params={'id': 'An ID'})
class Hello(Resource):
    def get(self):
        return {
            'data': {
                'names': ['one',
                          'two',
                          'three']
            }
        }

我不知道您遵循了哪個教程(如果您遵循了任何教程),但是

@api.doc(params={'id': 'An ID'})

需要一個 Api class 的實例而不是 flask-restx.api

通常,在教程(至少是我找到的那些)中,它們展示了如何在同一個文件中完成所有這些操作。 因此,如果這樣編寫,您的代碼將起作用:

api.py

from flask import Flask
from flask_restx import Api, Resource
from hello import Hello

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

@api.doc(params={'id': 'An ID'})
class Hello(Resource):
    def get(self):
        return {
            'data': {
                'names': ['one',
                          'two',
                          'three']
            }
        }

api.add_resource(Hello, '/hello')

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


現在,這不是您想要實現的目標,因為我猜您想將文件拆分為具有某種結構(我也想這樣做)。 非常糟糕,我在網上找不到合適的教程,但這是我在項目中所做的(使用您的示例代碼):

api > __init__.py

from flask_restx import Namespace

default_namespace = Namespace("default", ordered=True)

api > hello.py

from flask_restx import Resource
from api import default_namespace as ns


@ns.doc(params={'id': 'An ID'})
class Hello(Resource):
    def get(self):
        return {
            'data': {
                'names': ['one',
                          'two',
                          'three']
            }
        }

app.py(您的 api.py 文件)位於根目錄

from flask import Flask
from flask_restx import Api
from hello import Hello
from api import default_namespace

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

api.add_resource(Hello, '/hello')
api.add_namespace(default_namespace)

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

其中package結構為:

.
+-- app.py
+-- api
   +-- __init__.py
   +-- hello.py

通過聲明命名空間,您實際上可以將資源組合在 Swagger 中。 我將命名空間放在另一個文件(這里是__init__.py )的原因是沒有循環導入。 您可以將所有裝飾器與 ns.doc、ns.route... 一起使用,就像使用 api 一樣。 (其中 api 是一個變量;))。 順便說一句, ns 是一個別名,如果你喜歡放別的東西,你可以在 import 語句中更改它。

請注意,這可能不是最好的方法,但它對我和我所擁有的結構來說已經足夠干凈了。 如果有更多經驗的人知道如何以不同的方式做到這一點,請回復;)

這與@Jeremie 的答案幾乎相同,但只是想指出官方文檔。

flask-restx 中有以下語句。

Flask-RESTX 提供了一種使用幾乎與 Flask 藍圖相同的模式的方法。 主要思想是將您的應用程序拆分為可重用的命名空間。

並附帶一個例子:

# let's say the file name is `cat_controller`.
from flask_restx import Namespace, Resource, fields

api = Namespace('cats', description='Cats related operations')

cat = api.model('Cat', {
    'id': fields.String(required=True, description='The cat identifier'),
    'name': fields.String(required=True, description='The cat name'),
})

CATS = [
    {'id': 'felix', 'name': 'Felix'},
]

@api.route('/')
class CatList(Resource):
    @api.doc('list_cats')
    @api.marshal_list_with(cat)
    def get(self):
        '''List all cats'''
        return CATS

我們需要 app.py 中的app.py add_namespace()add_resource()

from flask import Flask
from flask_restx import Api
from .cat_controller import CatList, api as ns1
from .dog_controller import DogList, api as ns2
# ...

app = Flask(__name__)
api = Api(
    app,
    version='1.0',
    title='A title',
    description='A description'
)

api.add_resource(CatList, '/cat')
api.add_resource(DogList, '/dog')
api.add_namespace(ns1)
api.add_namespace(ns2)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM