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

2024-10-01 07:35:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想运行两个具有相同url模式的应用程序。我想避免有一个应用程序特定的slugdomain.com/pages/something-在这儿还是domain.com/blog/something-在那里。在

我试过了:

# 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),
)

我的代码不起作用,无论哪个include在前面(这里,页面.url)工作正常,其他网址(博客)抛出404。在

提前谢谢

编辑:我是这样做的:创建胶水.py在同一目录中设置.py. 它将处理我的主页和以下dispatcher视图:

^{pr2}$

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

谢谢你的评论。在


Tags: pycom应用程序urlincludeadmin模式blog
3条回答

你想让这个怎么样?它们都使用同一个URL(这当然会导致问题)。用户如何访问“页面”而不是“博客”,反之亦然?在

一般来说,在URL模式中不能有重叠的URL(不包括额外的数据)。在

编辑:

所以你想让第一个应用程序检查它是否有一个与URL匹配的视图,如果第一个不匹配,下一个就接管它?你可以做一些复杂的事情,比如写一个“视图匹配器”来实现你想要的,但是还有很多更为严格的解决方案。在

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

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

这不起作用,因为django url是按顺序解析的,这意味着与regexp匹配的第一个url将是已解析的url。在您的例子中,将永远不会搜索blogs应用程序中包含的url,因为django已经解析了pages includes行上的url。在

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

url模块只执行连接到匹配的第一个regexp的视图。在

你应该改变你的逻辑,比如把perpending“blog/”改为blog url(这有什么问题?)在

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

注意,我将blog url向上移动,因为大多数通用的regxexp应该是django url解析器最后一次尝试的。在

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

我不知道这是不是更好的答案。但是,如果你对这些情况感到满意。。在

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

  2. 您所说的url不需要通过在浏览器中键入端点来直接访问。

然后,也许您可以考虑url名称空间和模板重定向。在

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

相关问题 更多 >