Django URLS,如何将root映射到app?

时间:2011-09-28 08:17:39

标签: django django-urls

我是django的新手,但在使用不同框架的Python和java web编程方面经验丰富。 我已经把自己变成了一个不错的小django应用程序,但我似乎无法使它与www.mysite.com匹配而不是www.mysite.com/myapp。

我在urls.conf中定义了网址和视图,这些网址目前没有与应用程序分离(不介意)。

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重定向到我的“正确”默认网址。

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

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

(r'^$', 'index'),
然而,这让我陷入了困境......

希望你能在那里为django大师澄清一下这个!

7 个答案:

答案 0 :(得分:94)

我知道这个问题是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'),
)

答案 1 :(得分:61)

这听起来很奇怪。

你的最新尝试应该有效,但我通常做的是 - 把

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

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

答案 2 :(得分:13)

由于我没有看到django 2.0的任何答案,我以为我会提供一个。你必须使用''作为根网址。以下是django 2.0 docs

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

答案 3 :(得分:4)

只需输入一个空的原始正则表达式:r''

我在这里测试过它完美无缺。

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

希望有所帮助!

答案 4 :(得分:1)

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

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

PS:始终建议使用命名空间。以后会给你一个很好的优势。

在App urls.py

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

答案 5 :(得分:1)

我还希望拥有域的根目录以直接指向子应用程序的视图。

首先,我使用以下命令创建了子应用程序:

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上进行了测试。

答案 6 :(得分:1)

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

在项目urls.py中只需添加:

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

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