python - 如何计算 Pyramid 复合项目中的跨应用 URL?

标签 python url-routing pyramid

我正在使用 Pyramid 开发一个由多个应用程序组成的大型 Web 项目,这些应用程序使用复合应用程序功能连接在一起,并且我想在主页上生成导航链接以指向不同的应用程序。我的 INI 文件开头如下:

[composite:main]
use = egg:Paste#urlmap
/ = home
/app1 = myapp1
/app2 = myapp2

[app:home]
use = egg:myproject#home

[app:myapp1]
use = egg:myproject#myapp1

[app:myapp2]
use = egg:myproject#myapp2

...

在给定的应用程序中,我使用 request.route_url('view_name') 生成 URL,并且代码正确地在前面添加 //app1/app2 到应用程序中通过 config.add_route(...) 定义的任何 URL。

我使用 home 应用程序作为 / 网站的登陆页面,并且我想做类似 request.route_url('app1.index ')home 模板中生成指向 app1index View 的链接。然而,当我尝试此操作时,我从模板中得到了 KeyError: 'No such route named app1.index'

我的解决方法是将路径硬编码到我的主页导航链接中,但我不想这样做,因为这些路径已经在我的项目的 .ini 配置中定义。

有没有办法在 Pyramid 中做到这一点?

最佳答案

没有一个标准的解决方案。我个人使用的方法是在我的配置文件中定义应用程序之间的交叉链接,然后我编写了一些代码以将它们作为静态路由自动注入(inject)到我的应用程序中(请参阅 config 上的 static=True .add_route),它允许您使用 request.route_url 生成应用外部的 URL。

因此我构建了一个如下所示的配置:

[composite:main]
use = egg:Paste#urlmap
/ = home
/app1 = myapp1
/app2 = myapp2

[app:home]
use = egg:myproject#home
links =
    app1 /app1
    app2 /app2

[app:myapp1]
use = egg:myproject#myapp1
links =
    home /
    app2 /app2

[app:myapp2]
use = egg:myproject#myapp2
links =
    home /
    app1 /app1

您可能会觉得它很乏味,但我喜欢它为每个应用程序提供的控制。您也可以在文件的 [DEFAULT] 部分中定义它,并在应用程序之间继承它。

我的想法是,这个配置将允许我执行 request.route_url('app1')

我使用此代码(将其放入名为 app_links.py 的文件中,并通过 config.include('.app_links') 包含它:

from urllib.parse import urlparse

from pyramid.settings import aslist

def link_pregenerator(request, elements, kwargs):
    kwargs['_app_url'] = request.host_url
    return elements, kwargs

def includeme(config):
    settings = config.get_settings()

    links = aslist(settings.get('links', ''), flatten=False)
    for name, pattern in (item.split(' ', 1) for item in links):
        parsed = urlparse(pattern)
        if parsed.hostname:
            config.add_route(name, pattern, static=True)
        else:
            config.add_route(
                name, pattern,
                pregenerator=link_pregenerator,
                static=True,
            )

关于python - 如何计算 Pyramid 复合项目中的跨应用 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55768596/

相关文章:

python - BrowserStack 脚本因 MaxRetryError 而失败

python - 通过表单将表情符号添加到数据库时出现不正确的字符串错误

c# - ASP.Net Core RouteBuilder 和依赖注入(inject)

具有两个或多个查询字符串参数的 ASP.NET 4.0 URL 路由

python - 为 colander.SchemaNode 动态定义 'missing'

python - 如何获取 Pyramid 中add_static_view()的文件路径

python - 初始化任意形状的嵌套列表

php - Yii2 中带有模块的自定义 URL 规则

javascript - 如何在 JavaScript 中使用 tal 变量?

python - 如何停止 multiprocessing.Process