Python 使用flask MethodView
我正在尝试适应这一点: 进入蓝图本身,(基于我看过的其他蓝图)。将api注册从应用程序抽象到蓝图初始化中。这是flask文档中的代码,有一些更改 这似乎有效: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)
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 ...