【问题标题】:Multiple django apps using same url pattern使用相同 url 模式的多个 django 应用程序
【发布时间】:2013-01-31 16:07:06
【问题描述】:

我想运行两个具有相同 url 模式的应用程序。我想避免使用特定于应用程序的 slug,例如 domain.com/pages/something-here 或 domain.com/blog/something-there。

我试过这个:

# urls.py
urlpatterns = patterns('',
    url(r'^$', 'my.homepage.view'),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include('pages.urls')),
    url(r'^', include('blog.urls')),
)

# pages/urls.py
urlpatterns = patterns('',
    url(r'^(.+)/$', views.page),
)

# blog/urls.py
urlpatterns = patterns('',
    url(r'^(.+)/$', views.post),
)

我的代码不起作用,无论哪个先包含(此处为 pages.urls)都可以,其他 url(用于博客)抛出 404。

提前致谢

编辑:我是这样做的:在 settings.py 所在的目录中创建了glue.py。它将处理我的主页和这个调度程序视图:

def dispatcher(request, slug):
    try:
        page = get_object_or_404(Page, slug=slug)
        return render(request, 'pages/page.html', {'page': page})
    except:
        post = get_object_or_404(Post, slug=slug)
        return render(request, 'blog/post.html', {'post': post})

不知道好不好。希望有更好的办法。

感谢cmets。

【问题讨论】:

    标签: python django django-urls


    【解决方案1】:

    我不知道这是否是一个更好的答案。但是,如果您对这些情况感到满意..

    1. 如果你的 django 应用是基于 django 模板渲染的。

    2. 你所说的url,不需要直接在浏览器中输入endpoint来访问。

    那么,也许你可以考虑 url 命名空间和模板重定向。

    https://docs.djangoproject.com/en/1.11/topics/http/urls/#url-namespaces

    【讨论】:

    • 感谢您的回答。自从我要求它以来已经过去了一段时间。到目前为止,我什至不知道它到底是什么 :) 事实上,我认为 Django 不再是一个好的框架,而且我不打算再回到它上面。但再次感谢您!
    • 总是很开心
    【解决方案2】:

    这不起作用,因为 django url 是按顺序解析的,这意味着与正则表达式匹配的第一个 url 将是解析的。在您的情况下,永远不会搜索博客应用程序中包含的 url,因为 django 已经解析了页面上的 url 包含行。

    此外,django url 模块不应该知道某个页面或博客文章是否存在,因为我相信在您的应用程序中这是通过数据库查找来确定的。

    urls 模块只执行连接到第一个匹配的正则表达式的视图。

    你应该改变你的逻辑,例如将“blog/”附加到博客网址(这有什么问题?)

       url(r'^blog/', include('blog.urls')),
       url(r'^', include('pages.urls')),
    

    请注意,我将博客 url 向上移动,因为大多数通用 regxexp 应该始终是 django url resolver 尝试的最后一个。

    或者,您可以编写一个代理视图来尝试博客文章和页面。但这对我来说似乎不是最好的方法。

    【讨论】:

      【解决方案3】:

      您希望它如何工作?他们都使用相同的 URL(这当然会导致问题)。用户如何访问“页面”而不是“博客”,反之亦然?

      一般来说,您的网址格式中不能有重叠的网址(不包括其他数据)。

      编辑:

      所以您希望第一个应用程序检查它是否具有与 URL 匹配的视图,如果第一个应用程序没有,则下一步接管?你可以做一些复杂的事情,比如写一个“视图匹配器”来做你想做的事情,但是还有更直接的解决方案。

      最简单的方法是为您的一个应用更改slug 生成函数。让一个人使用除下划线以外的一些分隔符,或者总是将应用程序的名称附加到 slug 上。这样你就可以找到页面,因为它们的 url 是“some-slug-page”,而博客是“some-slug-blog”,然后你可以为其编写一个 URL 模式。如果您不想添加整个 URL,您可以仅附加/前置第一个字母,或任何您想要的。

      想一想您可以接受的为每个应用程序生成 URL 的方法,只需读取 URL,您就可以知道该页面属于哪个应用程序。

      【讨论】:

      • 假设我有一个带有“关于”的 slug 的页面。它的网址是:domain.com/about-us 并且有博客文章,例如:domain.com/blog-post-one domain.com/blog-post-two 我想让 django 检查是否有首先匹配页面(因为要检查的内容较少),然后继续阅读博文
      • 我想我可以有一个主视图来捕捉这个 url 模式并调度 pages.view.page 或 blog.view.post --- 但由于某种原因它似乎不正确
      • 谢谢,情况是我不希望 url 在两个(或更多)应用程序之间是可区分的。到目前为止,我采用了“视图匹配器”方法(参见我的操作编辑)。顺便说一句,你的博客很棒,我很喜欢,谢谢!
      • -1。这不是问题,因为您可以看到它在 stackoverflow.com/a/11618280/1402286 中有效
      猜你喜欢
      • 2017-09-09
      • 2019-05-09
      • 2017-06-04
      • 1970-01-01
      • 2017-10-15
      • 2016-04-26
      • 2017-03-28
      • 2012-10-19
      • 1970-01-01
      相关资源
      最近更新 更多