mod_python发布者和漂亮的URL

时间:2009-05-08 18:03:22

标签: python url mod-python friendly-url

我是Python新手(因为它越来越破碎,我正在退出PHP),而且我正在通过移植我的旧代码来竞争。一件事:

我有一个带有函数index()和bar()的文件/foo.py,因此,对于发布者,我可以访问http://domain/foo/barhttp://domain/foo,如文档所示。

我怎样才能做到这一点:

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

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

哦,我在2.5.2 提前致谢

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

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

2 个答案:

答案 0 :(得分: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这样的东西。)

答案 1 :(得分:1)

据我所知,我认为这超出了发布算法的能力。 (The documentation certainly doesn't mention it.)但是,您可以编写自己的mod_python处理程序(example here)来扩展发布算法。

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