多个django应用程序使用相同的url模式

时间:2013-02-15 16:18:30

标签: python django django-urls

我想运行两个具有相同网址格式的应用。我想避免使用像domain.com/pages/something-here或domain.com/blog/something-there这样的应用程序特定的slug。

我试过了:

# 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)正常,其他网址(博客)抛出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})

我不知道是否可以。我希望有更好的方法。

感谢您的评论。

3 个答案:

答案 0 :(得分:1)

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

  1. 如果您的django应用程序基于django模板渲染。

  2. 您正在谈论的网址,无需通过在浏览器中输入端点直接访问。

  3. 然后,也许您可​​以考虑网址命名空间和模板重定向。

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

答案 1 :(得分:0)

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

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

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

你应该改变你的逻辑,例如用博客网址“博客/”(这有什么不对?)

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

请注意,我移动了博客网址,因为大多数通用的regxexp应该始终是django url解析器尝试的最后一个。

或者,您可以编写代理视图,同时尝试博客帖子和页面。但这对我来说似乎不是最好的方式。

答案 2 :(得分:-1)

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

通常,您的网址格式不能包含重叠的网址(不包含其他数据)。

编辑:

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

最简单的方法是更改​​其中一个应用的slug生成功能。有一个人使用除下划线以外的一些除界,或者总是将应用程序的名称附加到slug。这样你就可以找到页面,因为他们的网址是“some-slug-page”,而博客则是“some-slug-blog”,你可以为其编写一个URL模式。如果您不想添加整个URL,则可以仅添加/添加第一个字母或任何您想要的内容。

只需考虑一种可以为每个应用生成网址的方式,只需阅读网址,即可让您知道该网页属于哪个应用。