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

Hoo*_*oof 53 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'),
)
Run Code Online (Sandbox Code Playgroud)

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

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

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

(r'^$', 'index'),
Run Code Online (Sandbox Code Playgroud)

然而这让我陷入了困境......

希望你在那里的django大师可以为我澄清这个!

小智 97

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

在项目中urls.py:

urlpatterns = patterns('',
    url(r'^', include('my_app.urls')), #NOTE: without $
)
Run Code Online (Sandbox Code Playgroud)

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'),
)
Run Code Online (Sandbox Code Playgroud)


Gua*_*ard 67

这听起来很奇怪.

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

urlpatterns = patterns('',
    (r'^$', lambda r: HttpResponseRedirect('myapp/')),
    ...
)
Run Code Online (Sandbox Code Playgroud)

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

  • 在Django 2.1中,这似乎不再起作用。我收到错误消息“错误:?:(urls.E004)您的URL模式('^ $',&lt;函数&lt;lambda&gt;在0x0000000004E5A510&gt;)无效。请确保urlpatterns是path()和/或re_path( )提示:尝试使用path()代替元组。” 我将其更改为path('',lambda r:HttpResponseRedirect('cl /')),它工作得很漂亮。 (2认同)

Ame*_*men 17

因为我没有看到django 2.0的任何答案我以为我会提供一个.你必须''用作根网址.这是django 2.0 docs的一个例子

urlpatterns = [
    path('', main_views.homepage),
    path('help/', include('apps.help.urls')),
    path('credit/', include(extra_patterns)),
]
Run Code Online (Sandbox Code Playgroud)

  • 如果你想重定向(就像@Guard 接受的答案一样),你也可以使用 `RedirectView.as_view(url='myapp/')`。在文档中:https://docs.djangoproject.com/en/2.0/ref/class-based-views/base/#redirectview (2认同)

小智 6

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

在项目 urls.py 中添加:

urlpatterns = [
    path('', include('myapp.urls')), 
    path('myapp/', include('myapp.urls')),
    #path('admin/', admin.site.urls),
]
Run Code Online (Sandbox Code Playgroud)

请注意,这个解决方案会将整个 django 独占到你饥饿且自私的应用程序:-) !!!


Fab*_*sco 5

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

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

urlpatterns = patterns('',
    url(r'', include('homepage.urls')),
    url(r'^homepage/', include('homepage.urls')),
    url(r'^admin/', include(admin.site.urls)),
)
Run Code Online (Sandbox Code Playgroud)

希望对您有所帮助!

  • 如果您以这种方式执行此操作,则模板中的帮助程序生成的所有网址均无效:( (3认同)

Joh*_*ehm 5

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

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

python3 manage.py startapp main offer_finder/main
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它将是:

python3 manage.py startapp myApp project/somedirectory/myApp
Run Code Online (Sandbox Code Playgroud)

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

这是我的项目结构:项目结构

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

offer_finder_project/offer_finder/main        # sub app  
offer_finder_project/offer_finder/            # main source directory  
Run Code Online (Sandbox Code Playgroud)

我有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')),
]
Run Code Online (Sandbox Code Playgroud)

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

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index),
]
Run Code Online (Sandbox Code Playgroud)

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

from django.http import HttpResponse

def index(request):
    return HttpResponse("TEST app index")
Run Code Online (Sandbox Code Playgroud)

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