【发布时间】:2015-06-16 15:22:14
【问题描述】:
我正在尝试在 Pyramid 视图中减少代码编写,并尝试通过工厂函数来实现。
因此,我的 views.py 中没有这样的内容:
class MyView(object):
def __init__(self, request):
self.request = request
@view_config(route_name='view', renderer='templates/view.pt')
def get(self):
return dict(msg='Hello!')
我尝试改用这样的东西:
def factory(cls_name, rtn, rndr, myfun):
class Cls(object):
def __init__(self, request):
self.request = request
@myfun(route_name=rtn, renderer=rndr)
def get(self):
return dict(msg='Hello!')
Cls.__name__ = cls_name
return Cls
MyView = factory('MyView', 'view', 'templates/view.pt', view_config)
显然,原因是我最终将拥有许多可以利用相同类功能的类,并且我想减少我的代码编写。如果您要求我改用继承,那么我就无法将派生类配置为具有参数化装饰器(例如myfun)。本质上,我需要类似 C++ 中的模板。
所以,即使上面的第二个 sn-ps 没有产生任何错误,而且对我来说它似乎工作得很好,当我尝试在我的测试站点中运行它时(通过用第二个替换第二个 sn-p一),金字塔不理解路线,所以我得到了404 error。根据错误,我推测我的问题可能与金字塔如何解析 views.py 文件以查找 view_config 装饰器有关,但我不知道如何解决。
我的__init__.py的主要功能是这样的:
def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
config = Configurator(settings=settings)
config.add_route('view', '/')
config.scan()
return config.make_wsgi_app()
任何帮助将不胜感激,所以提前谢谢大家!
【问题讨论】:
-
看看这个:bitbucket.org/websauna/websauna.viewconfig - 我创建了
@view_overrides装饰器,它允许你对基类进行子类化,只更改它的一部分。动态创建类的方法非常不符合 Python 风格,并且使代码难以遵循。相反,我建议使用静态类结构,然后根据需要使用装饰器和函数修改您的类。 -
但是 Mikko,这不会解决我使用参数化装饰器的问题,因为我仍然必须覆盖所有具有装饰器的方法,即使我只需要调用其父类对应项。我最初的问题是,既然上面的代码在语法上是正确的,那么金字塔内部的哪一部分不是
-
我最初的问题是,既然上面的代码在语法上是正确的,并且可以做我想要的,那么它有什么问题并且金字塔忽略了它的执行?
标签: python templates nested pyramid factory