如何创建 Python Pyramid 视图类而不需要为每个方法指定“名称”

Posted

技术标签:

【中文标题】如何创建 Python Pyramid 视图类而不需要为每个方法指定“名称”【英文标题】:Howto create Python Pyramid view class without need to specify 'name' for each method 【发布时间】:2012-07-06 09:41:01 【问题描述】:

我的 Python Pyramid 项目中有几个视图类是通过 add_handler 添加的:

config.add_handler('export_index', '/export', handler=ExportViews, action='index')

class ExportViews(ConfigViewBase):
    @action(request_method='POST', name='index',
            request_param='ftp_export.form.submitted')
    @action(request_method='POST', name='index', xhr=True, renderer='json',
            request_param='ftp_export.form.submitted')
    def ftp_export(self):
         #process form
         return 

    @action(request_method='GET')
    def index(self):
        return 

是否可以这样做:

config.add_handler('export_index', '/export', handler=ExportViews)

class ExportViews(ConfigViewBase):
    @action(request_method='POST',
            request_param='ftp_export.form.submitted')
    @action(request_method='POST', xhr=True, renderer='json',
            request_param='ftp_export.form.submitted')
    def ftp_export(self):
         #process form
         return 

    @action(request_method='GET')
    def __call__(self):
        return 

所以当浏览器获取页面时调用了 __call__,当我在同一页面上发布表单时应该调用 ftp_export。现在我得到page not found error

谢谢。

【问题讨论】:

目前 pyramid_handlers 不支持此行为 【参考方案1】:

您可以通过遍历来做到这一点。穿越岩石:)

class Root(object):
    def  __getitem__(self, name):
        if name == "export":
            return ExportSomething(self)
        if name == "export_something_else":
            return ExportSomethingElse(self)



class ExportSomething(object):

    implements(IViewable, IExportable)

    def view(self, request):
        return "Hi"

    def export(self, request):
        return "something else"

@view_config(context=IViewable, request_method="GET")
def view_viewable(conext, request):
    return context.view(request)

@view_config(context=IExportable, request_method="POST")
def export_exportable(conext, request):
    return context.export(request)

然后你可以实现一堆ExportThisExportThat 类,让它们实现IViewableIExportable 接口,让它们从Root.__getitem__ 返回,一切都会神奇地工作。或者,如果您不需要多个导出器,您可以省略接口并将视图直接绑定到 ExportSomething 类。或者您可以在 getitem 中实例化 ExportSomething 的不同实例并使其...我不知道,查看/导出不同的文件/报告。

【讨论】:

如果在/export你有出口,他可以做类似view_config(context=IExportable, name="fun")的事情来匹配/export/fun。遍历是非常棒的。 我还建议使用 view_defaultsview_config 而不是 pyramid_handler

以上是关于如何创建 Python Pyramid 视图类而不需要为每个方法指定“名称”的主要内容,如果未能解决你的问题,请参考以下文章

编码的 UI 测试:创建多个单独的 UIMap 类而不只是多个部分 UIMap 类的原因是啥?

是否可以将方法添加到现有(内置)ActionScript Flash 类而不扩展它并创建一个新类?

如何在 Spring 中测试 @Configuration 类而不启动整个上下文?

如何在 JsDoc(VS Code / IntelliSense)中引用另一个文件中的类而不直接导入?

将参数从jsp页面传递给java类而不使用servlet [重复]

如何从类而不是视图更改@EnvironmentObject