动态生成Flask-RESTPlus路由

时间:2019-08-17 11:48:20

标签: flask-restplus

我正在尝试抽象一些路由类逻辑(即,我希望动态生成路由)。 api.add_resource似乎是执行此操作的正确位置。

这就是我想要做的:

# app.py

from flask import Flask
from flask_restplus import Api, Resource, fields
from mylib import MyPost

# Define my model
json_model = api.schema_model(...)

api.add_resource(
    MyPost,
    '/acme',
    resource_class_kwargs={"json_model": json_model}
)

然后在mylib中:

# mylib.py

def validate_endpoint(f):
    def wrapper(*args, **kwargs):
        return api.expect(json_fprint)(f(*args, **kwargs))
    return wrapper

class MyPost(Resource):
    def __init__(self, *args, **kwargs):
        # Passed in via api.add_resource
        self.api = args[0]
        self.json_model = kwargs['json_model']

    # I can't do this because I don't have access to 'api' here...
    # @api.expect(json_model)

    # So I am trying to make this work
    @validate_endpoint
    def post(self):
        return {"data":'some data'}, 200

我无法在此处访问全局api对象,因此无法调用@api.expect(json_model)。但是我确实可以在post方法中访问apijson_model。这就是为什么我试图创建自己的validate_endpoint装饰器。

但这不起作用。我在这里尝试做的事情甚至可能吗?我应该采取更好的方法吗?

1 个答案:

答案 0 :(得分:0)

使用flask-restplus停止。那就是我能给您(和其他任何人)最有价值的答案。

不存在所有权

烧瓶restplus是烧瓶restful的叉子。一些工程师开始开发适合他们的功能。核心人员已使该项目失灵,因此该项目再次以Flask-Restx的名义正式分叉。

设计欠佳

从小我曾经爱过烧瓶。从那时起,我意识到具有全局请求,应用程序和配置的所有魔术更新都不是一个好的设计。他们的应用程序工厂模式(flask-restplus所遵循的模式)是一种有状态地更改应用程序对象的样式。首先,它很难测试。其次,这意味着flask-restplus包装了应用程序,因此也包装了所有请求/处理程序。谁能做到那是一件好事?一个以端点文档为主要功能的库在我的每一个请求中都有自己的肮脏手? (顺便说一句,这就是导致上述问题的原因),因为我的帖子很认真,很体贴,所以我对Resource类模式的想法有所保留,因为它可能会将我带入怒吼

随机功能集

一个好的库有一个目的,并且做得很好。 Flask-restplus做15件事(掩盖,招摇一代,邮递员一代,封送处理,请求arg验证)。通过阅读文档,您甚至无法分辨出某些功能在库代码中。

我为您解决的问题

如果您想通过函数装饰器和模型来记录代码,请使用一个工具,该工具可以很好地完成此任务。使用不会影响您的处理程序或影响您实际请求装饰的程序。使用oapispec进行草率生成。对于flask-restplus的其他功能,您有marshmallow用于编组请求/响应数据,pydantic用于验证请求对象和参数,等等。

顺便说一句,我知道所有这些,因为我必须用它构建一个api。经过数周的努力,我将该框架进行了分叉,撕开,创建了oapispec并将其从项目中删除。