Django URLS,如何将根映射到应用程序?

Posted

技术标签:

【中文标题】Django URLS,如何将根映射到应用程序?【英文标题】:Django URLS, how to map root to app? 【发布时间】:2011-11-26 16:05:30 【问题描述】:

我对 django 很陌生,但在 Python 和 java web 编程方面有不同的框架经验。 我已经为自己制作了一个不错的小 django 应用程序,但我似乎无法让它匹配 www.mysite.com 而不是 www.mysite.com/myapp。

我在我的 urls.conf 中定义了 url 和视图,它们目前没有与应用程序分离(不要介意)。

urlpatterns = patterns('myapp.views',
  (r'^myapp/$', 'index'),
  (r'^myapp/(?P<some_id>\d+)/global_stats/$', 'global_stats'),
  (r'^myapp/(?P<some_id>\d+)/player/(?P<player_id>\d+)/$', 'player_stats'),
)

这一切都像一个魅力。如果有人访问 www.mysite.com/myapp,他们会点击我的索引视图,这会导致 http 重定向到我的“正确”默认 url。

那么,我怎样才能添加一个与 (r'^myapp/$', 'index') 相同但没有 /myapp 的模式——也就是说,www.mysite.com 就足够了?

我认为这将是非常基本的东西...我尝试添加如下一行:

(r'^$', 'index'),

但是这让我陷入了循环......

希望你们 django 大师可以为我澄清这一点!

【问题讨论】:

【参考方案1】:

我知道这个问题是 2 年前提出的,但我遇到了同样的问题并找到了解决方案:

项目中urls.py

urlpatterns = patterns('',
    url(r'^', include('my_app.urls')), #NOTE: without $
)

my_app.urls.py:

urlpatterns = patterns('',
    url(r'^$', 'my_app.views.home', name='home'),
    url(r'^v1/$', 'my_app.views.v1', name='name_1'),
    url(r'^v2/$', 'my_app.views.v2', name='name_2'),
    url(r'^v3/$', 'my_app.views.v3', name='name_3'),
)

【讨论】:

太棒了!适用于 django 1.8 完美!像 Django 1.8.4 的魅力一样工作 在页面中引用根目录:起始页 是的,我刚刚找到了你的命令。谢谢你。就我而言:urlpatterns = [ url(r'^reportsys/', views.index, name='index'), # url(r'^index/', views.index, name='index'), # url(r'^$', views.index, name='index'), url(r'^dataprocessing/', views.dataprocessing, name='dataprocessing'), ]【参考方案2】:

这听起来很奇怪。

你最近的尝试应该有效,但我通常会做的 - 放

urlpatterns = patterns('',
    (r'^$', lambda r: HttpResponseRedirect('myapp/')),
    ...
)

当您开始添加新应用时,这会更好地扩展。

【讨论】:

好吧,出于某种原因,这行得通,而我的解决方案却没有——所以我坚持下去! :) 如果您将 gzip 与您的最小应用程序一起发送给我,我可以看到它有什么问题。顺便说一句,来自我的不同文件:urlpatterns = patterns('common.views', url('^$', 'home', name='home'), ...),工作得很好 这非常好,因为它可以确保用户最终访问应用程序的真实/“正确”URL,而不是默默暗示它确实位于根目录。 在 Django 2.1 中,这似乎不再起作用。我收到错误“错误:?: (urls.E004) 您的 URL 模式 ('^$', at 0x0000000004E5A510>) 无效。确保 urlpatterns 是 path() 和/或 re_path( ) 实例。提示:尝试使用 path() 而不是元组。”我把它改成了path('', lambda r: HttpResponseRedirect('cl/')),效果很好。【参考方案3】:

由于我没有看到 django 2.0 的任何答案,我想我会提供一个。您必须使用 '' 作为根 url。这是来自django 2.0 docs的示例

urlpatterns = [
    path('', main_views.homepage),
    path('help/', include('apps.help.urls')),
    path('credit/', include(extra_patterns)),
]

【讨论】:

如果你想重定向(就像@Guard 接受的答案),你也可以使用RedirectView.as_view(url='myapp/')。在文档中:docs.djangoproject.com/en/2.0/ref/class-based-views/base/…【参考方案4】:

只放一个空的原始正则表达式:r''

我在这里测试过,效果很好。

urlpatterns = patterns('',
    url(r'', include('homepage.urls')),
    url(r'^homepage/', include('homepage.urls')),
    url(r'^admin/', include(admin.site.urls)),
)

希望对您有所帮助!

【讨论】:

如果您这样做,模板中的助手生成的任何 url 都不起作用:( 你在哪个文件中更新了它?不适合我。【参考方案5】:

我还想让我的域的根目录直接指向子应用程序的视图。

一开始我用这个命令创建了子应用:

python3 manage.py startapp main offer_finder/main

在你的情况下是:

python3 manage.py startapp myApp project/somedirectory/myApp

确保目录存在:mkdir -p project/somedirectory/myApp

这是我的项目结构:Project structure

就我而言,我有这些目录:

offer_finder_project/offer_finder/main        # sub app  
offer_finder_project/offer_finder/            # main source directory  

offer_finder_project/offer_finder/urls.py我有这个代码:

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('offer_finder.main.urls')),
]

offer_finder_project/offer_finder/main/urls.py 我有这个代码:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index),
]

offer_finder_project/offer_finder/main/views.py 文件只包含一些测试代码。

from django.http import HttpResponse

def index(request):
    return HttpResponse("TEST app index")

这样,您对根域的请求就会被定向到您的子应用。 希望这可以帮助某人。 此代码已使用 Django 2.1.4 进行了测试。

【讨论】:

这也是 Django3 更简洁的解决方案。为什么其他答案使用正则表达式而不遵循文档(如果我阅读正确)?【参考方案6】:

我知道答案已经晚了,但我最近有相当多的狩猎。这就是我尝试使用 CBV 的方法。 在项目 urls.py 中

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', include('app_name.urls', namespace='app_name')),
]

PS:总是推荐使用命名空间。以后有很好的优势。

在应用程序 urls.py 中

urlpatterns = [
    url(r'^$', views.IndexPageView.as_view(), name='index'),
]

【讨论】:

re_path() 现在是正则表达式的首选,而不是 url(),因为 url() 将被弃用。 path() 可用于不需要正则表达式的地方【参考方案7】:

这里的老问题......(和我自己一样:o) 但仍然值得分享 Django 3.x 的更新:

在项目 urls.py 中添加:

urlpatterns = [
    path('', include('myapp.urls')), 
    path('myapp/', include('myapp.urls')),
    #path('admin/', admin.site.urls),
]

请注意,此解决方案会将整个 django 垄断给您饥饿而自私的应用程序 :-) !!!

【讨论】:

以上是关于Django URLS,如何将根映射到应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

Django 应用开发

Django基础之urls

二 Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器

Django分发控制器urls--白话聊Django系列

第三百零四节,Django框架,urls.py模块——

Django之Urls.py模块