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 模式 ('^$',由于我没有看到 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,如何将根映射到应用程序?的主要内容,如果未能解决你的问题,请参考以下文章