Python 金字塔:重复数据消除类似路由
我有一个问题,重复代码的路线,我们的金字塔应用程序。我很确定我做错了,但不知道如何做得更好。我们的应用程序基本上有三种“模式”,它们表示为URL路径的前缀。没有前缀,我们处于“prod”模式,然后有“/mock”和“/old”前缀,它们使用具有不同后端的相同视图来获取数据 代码结果如下所示:Python 金字塔:重复数据消除类似路由,python,pyramid,Python,Pyramid,我有一个问题,重复代码的路线,我们的金字塔应用程序。我很确定我做错了,但不知道如何做得更好。我们的应用程序基本上有三种“模式”,它们表示为URL路径的前缀。没有前缀,我们处于“prod”模式,然后有“/mock”和“/old”前缀,它们使用具有不同后端的相同视图来获取数据 代码结果如下所示: def routes(config): """Add routes to the configuration.""" config.add_route('my_view:old', '/ol
def routes(config):
"""Add routes to the configuration."""
config.add_route('my_view:old', '/old/my_view')
config.add_route('my_view:prod', '/my_view')
config.add_route('my_view:mock', '/mock/my_view')
@view_config(route_name='my_view:mock', renderer='string')
def my_view_mock(request):
return my_view(request, data.mock)
@view_config(route_name='my_view:prod', renderer='string')
def my_view_prod(request):
return my_view(request, data.prod)
@view_config(route_name='my_view:old', renderer='string')
def my_view_old(request):
return my_view(request, data.old)
def my_view(request, data):
results = data.query(**request.json)
更糟糕的是,这种模式对我们所有的端点都是重复的,导致大量几乎重复的样板代码
我怎样才能以某种集中的方式向金字塔教授我的设置,并摆脱这个样板文件?好吧,这里有一个选项。它要求您为每个视图定义一个唯一的对象。很好的一点是,您可以定义该对象,然后每个路由可以创建不同的对象。。。设想
factory=lambda request:MyView(request,old=True)
而不是为每个路由使用完全相同的MyView(request)
对象
def routes(config):
"""Add routes to the configuration."""
config.add_directive('add_routed_resource', add_routed_resource)
config.add_routed_resource('my_view', MyView)
def add_routed_resource(config, name, factory):
routes = [
('%s:old', '/old/%s-errors', lambda request: factory(request, old=True)),
('%s:prod', '/%s', factory),
('%s:mock', '/mock/%s', lambda request: factory(request, mock=True)),
]
for name_fmt, pattern_fmt in routes:
config.add_route(
name_fmt % name,
pattern_fmt % name,
factory=factory,
use_global_views=True,
)
class MyView:
def __init__(self, request, old=False, mock=False):
self.request = request
self.old = old
self.mock = mock
@reify
def data(self):
# let's assume sqlalchemy query to load the data?
q = self.request.db.query(...)
if self.old:
q = q.filter_by(old=True)
return q.one()
@view_config(context=MyView, renderer='json')
def my_view(context, request):
return context.data
我看不出是什么使context.data发生变化。这可能与对象的创建方式有关。。。正如我上面所说,路线可以控制这一点。您可以为每个路由指定不同的工厂。我更新了示例以显示如何实现
MyView
。这些只是让你思考如何解决问题的东西。您的原始示例也没有显示数据来自何处。