1

我是 Python 的新手(我正在退出 PHP,因为它越来越糟糕),并且我正在通过移植我的旧代码进行比赛。一件事:

我有一个文件/foo.py,其中包含函数 index() 和 bar(),因此,与发布者一起,我可以按照文档的建议访问http://domain/foo/barhttp://domain/foo 。

我怎样才能拥有它,以便我可以做到:

http://domain/foo/bar/a1/a2/a3/an/ ...

这样发布者启动 bar() 然后我可以访问 URL 以获取 /a1/a2/... 我得到的只是 Forbidden :) (我不想在所有内容上使用 mod_rewrite)

哦,我在 2.5.2 提前谢谢

更新:理想的解决方案是发布者可以在 URL 中启动最右分辨率,并简单地使 a1/a2/a3.. 可通过 apache 模块访问。也许是 apache 指令和发布者的组合?

已解决(ish):魔术调用()方法等的答案多汁!虽然我认为我会修改发布者或编写自己的发布者以使用最右匹配以类似的方式检查对象,然后允许最右匹配使用 apache 模块访问 URL。谢谢大家!

4

2 回答 2

1

您必须在模块中bar.a1.a2.a3.an定义一个对象。foo.py基本上,发布者处理程序将 URL 中的斜杠替换为点,并尝试查找具有该名称的 Python 对象。

您必须在模块中bar.a1.a2.a3.an定义一个对象。foo.py基本上,发布者处理程序将 URL 中的斜杠替换为点,并尝试查找具有该名称的 Python 对象。

这里有一些你可以尝试的古怪的东西:在foo.py

class _barclass(object):
    def __init__(self, parent, name):
        if parent and name:
            self.path = parent.path + '/' + name
            setattr(parent, name, self)
        else:
            self.path = ''
    def __getattr__(self, name):
        return _barclass(self, name)
    def __call__(self):
        # do your processing here
        # url path is contained in self.path

bar = _barclass(None, None)

虽然这有点限制发布者的意图 - 你最好从头开始编写自己的处理程序。(或者使用 Django 之类的东西。)

于 2009-05-08T18:14:46.483 回答
1

据我所知,我相信这超出了发布算法的能力。(文档当然没有提到它。)但是,您可以编写自己的 mod_python 处理程序(此处为示例)来扩展发布算法。

更好的解决方案是查看mod_wsgi并将您的 Web 应用程序构建为WSGI 应用程序。您将从 WSGI 中间件的货架和货架中受益,但特别是您将能够使用像Routes这样的路由软件,这些软件专门用于处理对象发布不够强大的这些情况。但我不知道你的截止日期,所以这可能可行,也可能不可行。

于 2009-05-08T18:17:27.117 回答