我是 Python 新手(我正在退出 PHP,因为它越来越糟糕),并且我正在竞相移植我的旧代码。一件事:
我有一个带有函数index()和bar()的文件/foo.py,因此,通过发布者我可以访问http://domain/foo/bar和http://domain/foo作为文档表明。
我怎样才能拥有它,我可以做到:
http://domain/foo/bar/a1/a2/a3/an/...
这样发布者启动了 bar(),然后我就可以访问 URL 来获取 /a1/a2/... 我得到的只是 Forbidden :) (我不想对所有内容都使用 mod_rewrite)
哦,我正在使用 2.5.2 预先感谢
更新:理想的解决方案是发布者在 URL 中启动最右边的解析,并简单地通过 apache 模块访问 a1/a2/a3..。也许是 apache 指令和发布者的组合?
已解决(大约): 神奇的 call() 方法等等的答案是多汁的!尽管我想我会修改发布者或编写自己的发布者以使用最右匹配以类似的方式检查对象,然后允许最右使用 apache 模块访问 URL。谢谢大家!
您必须在
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 之类的东西。)
据我所知,我相信这超出了发布算法的能力。 (文档当然没有提及它。)但是,您可以编写自己的 mod_python 处理程序(此处为示例)来扩展发布算法来执行此操作。
更好的解决方案是研究 mod_wsgi 并将您的 Web 应用程序构建为 WSGI 应用程序。您将受益于大量的 WSGI 中间件,但特别是您可以使用像 Routes 这样的路由软件,它们是专门为处理对象发布不够强大的情况而设计的。但我不知道你的截止日期,所以这可能可行,也可能不可行。