簡體   English   中英

創建 Flask 沒有命名空間的 Restx 端點

[英]Create Flask Restx endpoints without namespaces

我正在使用 Flask-restx 重新設計 API 和 Flask,但我有一個問題:出於兼容性原因,我們需要接受舊網址的 API 的舊版本,但我不明白如何這樣做是因為 flask-restx 需要聲明一個命名空間。

網址應該是這樣的:

{{host}}/api/v1/art/savegallery <- new one
{{host}}/savegallery <- legacy

在 Flask 我有這樣的東西:

應用程序/初始化.py

db = SQLAlchemy()
migrate = Migrate()
cors = CORS()


def create_app(config_class=DevelopmentConfig):
    app = Flask(__name__)
    app.config.from_object(config_class)

    db.init_app(app=app)
    migrate.init_app(app=app, db=db)
    cors.init_app(app=app)

    from app.api import api_bp, legacy_bp
    app.register_blueprint(api_bp, url_prefix='/api/v1')
    app.register_blueprint(legacy_bp)

    return app

/應用程序/API/初始化.py

api_bp = Blueprint('v1', __name__)
legacy_bp = Blueprint('legacy', __name__)

api_v1 = Api(
    app=api_bp,
    version='1.00',
    title='Art',
    description=(
        "API"
    ),
)

api_lgc = Api(
    app=legacy_bp,
    version='1.00',
    title='Art Legacy',
    description=(
        "API Legacy"
    ),
)



from app.art.routes import art_ns
api_v1.add_namespace(art_ns)
api_lgc.add_namespace(art_ns)

應用程序/藝術/routes.py

art_ns = Namespace(name='art', description='Art Storage')
#artlegacy_ns = Namespace(name='legacy', description='Art Storage')


@art_ns.route('/savegallery')
class GalleryAPI(Resource):
    def get(self):
        try:
            #data = request.json
            data = {}
            return {"foo":"bar"}, 200
        except Exception as e:
            print(e)
            return {"error": "Something happened"}, 500

有了這個,我可以正確訪問{{host}}/api/v1/art/savegallery但我找不到聲明舊版的方法,因為以這種方式創建 url 至少需要 url 的命名空間部分. Flask-restx 是否有辦法聲明這些 URL 和/或將流重定向到新的 URL?

對於任何想知道我是如何解決這個問題的人,我只是做了一個小技巧:

/應用程序/API/初始化.py

legacy_bp = Blueprint('legacy', __name__)

api_lgc = Api(
    app=legacy_bp,
    version='1.00',
    title='Art Legacy',
    description=(
        "API Legacy"
    ),
)

@legacy_bp.route('/savegallery/', methods=['POST'])
def saveGallery():
    return redirect('/api/art/savegallery/', code=307)

有了這個,我從遺留的 API 中刪除了命名空間,並且只聲明每個 URL 以重定向到所需的一個。 它現在似乎工作,但我不確定這是否是最好的解決方案,或者它是否可能更好,但目前這似乎是答案。

暫無
暫無

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

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