URL-адреса Django, как сопоставить root с приложением? - PullRequest
52 голосов
/ 28 сентября 2011

Я довольно новичок в django, но имею опыт работы с Python и веб-программированием на Java с различными фреймворками. Я сделал себе симпатичное маленькое приложение django, но, похоже, не могу заставить его соответствовать www.mysite.com, а не www.mysite.com/myapp.

.

Я определил URL-адреса и представления в моем файле 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 на мой «правильный» URL-адрес по умолчанию.

Итак, как я могу добавить шаблон, который будет делать то же самое, что и (r '^ myapp / $', 'index'), но без / myapp - то есть должно хватить www.mysite.com?

Я думаю, это было бы очень просто ... Я попытался добавить строку вроде:

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

однако это бросает меня в петлю ...

Надеюсь, вы, гуру джанго, можете прояснить это для меня!

Ответы [ 6 ]

96 голосов
/ 06 марта 2014

Я знаю, что этот вопрос задавался 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'),
)
64 голосов
/ 28 сентября 2011

Звучит странно.

Ваша последняя попытка должна сработать, но то, что я обычно делаю - поставить

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

Это масштабируется лучше, когда вы начинаете добавлять новые приложения.

14 голосов
/ 28 марта 2018

Так как я не видел ответа для django 2.0, я думал, что предоставлю один.Вы должны использовать '' в качестве корневого URL.Вот пример из django 2.0 документов

urlpatterns = [
    path('', main_views.homepage),
    path('help/', include('apps.help.urls')),
    path('credit/', include(extra_patterns)),
]
5 голосов
/ 22 апреля 2013

Просто поместите пустое необработанное регулярное выражение: r ''

Я тестировал здесь, и он отлично работал.

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

Надеюсь, это поможет!

2 голосов
/ 22 декабря 2018

Я также хотел, чтобы корень моего домена указывал непосредственно на представление вспомогательного приложения.

Сначала я создал вспомогательное приложение с помощью этой команды:

python3 manage.py startapp main offer_finder/main

В вашем случае это будет:

python3 manage.py startapp myApp project/somedirectory/myApp

убедитесь, что каталог существует: mkdir -p project/somedirectory/myApp

Это моя структура проекта: Структура проекта

В моем случае у меня есть эти каталоги:

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.

2 голосов
/ 05 декабря 2017

Я знаю, что ответ опоздал, но я недавно получил свою долю на охоте. Это то, что я пытался с 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'),
]
...