Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用flask MethodView_Python_Flask - Fatal编程技术网

Python 使用flask MethodView

Python 使用flask MethodView,python,flask,Python,Flask,我正在尝试适应这一点: 进入蓝图本身,(基于我看过的其他蓝图)。将api注册从应用程序抽象到蓝图初始化中。这是flask文档中的代码,有一些更改 这似乎有效: class MyAPI(MethodView): def __init__(self, name): self.name = name bp = Blueprint(name, __name__) bp_endpoint = '{0}_api'.format(name)

我正在尝试适应这一点:

进入蓝图本身,(基于我看过的其他蓝图)。将api注册从应用程序抽象到蓝图初始化中。这是flask文档中的代码,有一些更改

这似乎有效:

 class MyAPI(MethodView):

    def __init__(self, name):
        self.name = name
        bp = Blueprint(name, __name__)
        bp_endpoint = '{0}_api'.format(name)
        bp_url = '/{0}/'.format(name)
        bp_pk = '{0}_tag'.format(name)
        self.register_api(bp, bp_endpoint, bp_url, bp_pk, 'string')
        self._blueprint = bp

    def register_api(self, blueprint, endpoint, url, pk='id', pk_type='int'):
        view_func = self.as_view(endpoint)
        blueprint.add_url_rule(url, defaults={pk: None},
                         view_func=view_func, methods=['GET',])
        blueprint.add_url_rule(url, view_func=view_func, methods=['POST',])
        blueprint.add_url_rule('{0}<{1}:{2}>'.format(url, pk_type, pk), view_func=view_func,
                         methods=['GET', 'PUT', 'DELETE'])

    def get(self, my_tag):
         #... with post, put methods etc.
这似乎有效,注册URL以便我可以获得:

Map([<Rule '/my/' (POST, OPTIONS) -> my.my_api>,
 <Rule '/my/<my_tag>' (PUT, HEAD, DELETE, OPTIONS, GET) -> my.my_api>,
 <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>,
 <Rule '/my/' (HEAD, OPTIONS, GET) -> my.my_api>])
这比我想象的要低一两级。感谢您对我错过的任何意见。我认为这可能与register\u api中的view\u func有关

编辑:

这算是个回答

class MyAPI(MethodView):  

    def __init__(self, name):
        self.name = name
        bp = Blueprint(name, __name__)
        self.endpoint = '{0}_api'.format(name)
        self.url = '/{0}/'.format(name)
        self.pk = '{0}_tag'.format(name)
        self._blueprint = bp
        self.register_api(self._blueprint, self.endpoint, self.url, self.pk)

    def register_api(self, bp, endpoint, url, pk ='id', pk_type='int'):
        view_func = self.__class__.as_view(endpoint)
        bp.add_url_rule(url, defaults={pk: None},
                     view_func=view_func, methods=['GET',])
        bp.add_url_rule(url, view_func=view_func, methods=['POST',])
        bp.add_url_rule('{0}<{1}:{2}>'.format(url, pk_type, pk), view_func=view_func,
                     methods=['GET', 'PUT', 'DELETE'])
类MyAPI(方法视图):
定义初始化(self,name):
self.name=名称
bp=蓝图(名称、名称)
self.endpoint='{0}_api'。格式(名称)
self.url='/{0}/'.format(名称)
self.pk='{0}_tag'。格式(名称)
自我设计图=bp
self.register\u api(self.\u蓝图、self.endpoint、self.url、self.pk)
def register_api(self、bp、endpoint、url、pk='id',pk_type='int'):
视图\u func=self.\u类\u类作为\u视图(端点)
添加url规则(url,默认值={pk:None},
查看函数=查看函数,方法=['GET',])
添加url规则(url,view\u func=view\u func,methods=['POST',]))
添加url规则({0})。格式(url,pk类型,pk),view\u func=view\u func,
方法=['GET','PUT','DELETE'])

我认为您可以只保留initialize方法的一个参数:

def __init__(self):
    bp = Blueprint("what?", __name__)  # here
    bp_endpoint = '{0}_api'.format(name)
    bp_url = '/{0}/'.format(name)
    bp_pk = '{0}_tag'.format(name)
    self.register_api(bp, bp_endpoint, bp_url, bp_pk, 'string')
    self._blueprint = bp
或者在不修改初始化方法的情况下,在
视图中提供足够的值

def register_api(self, blueprint, endpoint, url, pk='id', pk_type='int'):
    view_func = self.as_view(endpoint, name="what?")  # here
    # ... omit ...

但在我看来,在方法视图中创建蓝图不是一个好主意。蓝图是一个子应用程序,应该由许多视图共享。

我从这里开始:但情况不同。如果该方式与MethodView不兼容,则单击“确定”。我基本上是尝试在我的应用程序中实例化API,而不需要大量的代码。嗯,我明白你的意思,但我的尝试缺乏技巧。因为你对蓝图的看法是正确的,但这样做的目的是最终抽象出类,为传递给它的任何db对象实例化api,本质上是一个蓝图的抽象,作为初始化的一部分定制并应用于每个实例。然后我认为
register\u api
应该是一个静态方法或类方法,因为
as\u view
是MethodView实例的工厂方法。
def __init__(self):
    bp = Blueprint("what?", __name__)  # here
    bp_endpoint = '{0}_api'.format(name)
    bp_url = '/{0}/'.format(name)
    bp_pk = '{0}_tag'.format(name)
    self.register_api(bp, bp_endpoint, bp_url, bp_pk, 'string')
    self._blueprint = bp
def register_api(self, blueprint, endpoint, url, pk='id', pk_type='int'):
    view_func = self.as_view(endpoint, name="what?")  # here
    # ... omit ...