【问题标题】:mod_python publisher and pretty URLsmod_python 发布者和漂亮的 URL
【发布时间】:2010-10-24 20:57:35
【问题描述】:

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

我有一个包含函数 index() 和 bar() 的文件 /foo.py,因此,我可以通过发布者访问 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): 神奇的 call() 方法等的答案是多汁的!虽然我认为我会修改发布者或编写自己的发布者以使用最右匹配以类似方式检查对象,然后允许最右匹配使用 apache 模块访问 URL。谢谢大家!

【问题讨论】:

    标签: python url mod-python friendly-url


    【解决方案1】:

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

    您必须在 foo.py 模块中定义一个对象 bar.a1.a2.a3.an。基本上,发布者处理程序将 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 之类的东西。)

    【讨论】:

    • 这会让人头疼,因为 a1,a2,a3 组件很可能是来自数据库的标签: foo/articles/may/2009/latest forarticles() 混合数据库信息和约束“最新” ' 将所有这些编码到一个对象嵌套中会很糟糕 :) 无论如何谢谢!
    • :) 我没有,而且我的街道上似乎有很多神奇的方法
    • 你得到我的绿色!我应该想到这一点,不习惯跳到对象的动态性(虽然 PHP 支持它,很糟糕)我主要是一个 C 人!谢谢
    • 我明白你的意思,Python 有很多技巧需要一些时间来适应。 (我已经做了一年半了。)
    • 6 小时 :(,虽然一旦整个空白交易变得舒适,我会很高兴看到 PHP 的背面。目前虽然我想要我的大括号 :)
    【解决方案2】:

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

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

    【讨论】:

    • 感谢 Hao Lian:我认为比发布者更庞大的应用程序框架或中间件是矫枉过正的。在 PHP 中,我只是简单地分解了 $_SERVER[url_key_thing] 并且我瘦了 Apache 认识到 /foo/bar/a/b/c 不存在但 /foo/bar 确实存在(作为文件)并运行它。也许有一个 Apache 指令?
    • @NewToPython:听起来您正在考虑 PATH_INFO - 您也可以在 Python 中使用它,但要使用发布者处理程序。
    • Mod_Python 的实现实际上相当庞大。您可能会发现 WSGI + Routes(或其他东西)实际上可能更快更轻。
    • 我要指出的是 url 爆炸式方法,当 Apache “刚刚运行”时,生成的文件代表了 PHP 文化的一个基本方面,它导致你认为它被打破了:-)
    • @Jarret - 我知道耻辱,虽然我不认为发布者坏了,只是不知道它是否实现了类似的解决机制,我不能找到它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多