Python 金字塔:重复数据消除类似路由

Python 金字塔:重复数据消除类似路由,python,pyramid,Python,Pyramid,我有一个问题,重复代码的路线,我们的金字塔应用程序。我很确定我做错了,但不知道如何做得更好。我们的应用程序基本上有三种“模式”,它们表示为URL路径的前缀。没有前缀,我们处于“prod”模式,然后有“/mock”和“/old”前缀,它们使用具有不同后端的相同视图来获取数据 代码结果如下所示: def routes(config): """Add routes to the configuration.""" config.add_route('my_view:old', '/ol

我有一个问题,重复代码的路线,我们的金字塔应用程序。我很确定我做错了,但不知道如何做得更好。我们的应用程序基本上有三种“模式”,它们表示为URL路径的前缀。没有前缀,我们处于“prod”模式,然后有“/mock”和“/old”前缀,它们使用具有不同后端的相同视图来获取数据

代码结果如下所示:

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
。这些只是让你思考如何解决问题的东西。您的原始示例也没有显示数据来自何处。