URL-адреса Django, как сопоставить root с приложением?
Я новичок в 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'),
однако это бросает меня в цикл...
Надеюсь, что гуру-джанго могут объяснить это для меня!
Ответы
Ответ 1
Это звучит странно.
Ваша последняя попытка должна работать, но что я обычно делаю - поставьте
urlpatterns = patterns('',
(r'^$', lambda r: HttpResponseRedirect('myapp/')),
...
)
Это масштабируется лучше, когда вы начинаете добавлять новые приложения.
Ответ 2
Я знаю, что этот вопрос задавался 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'),
)
Ответ 3
Поскольку я не видел ответа для django 2.0, я думал, что предоставлю один. Вы должны использовать ''
в качестве корневого URL. Вот пример из документации Django 2.0
urlpatterns = [
path('', main_views.homepage),
path('help/', include('apps.help.urls')),
path('credit/', include(extra_patterns)),
]
Ответ 4
Просто введите пустое регулярное выражение: r ''
Я тестировал здесь, и он работал отлично.
urlpatterns = patterns('',
url(r'', include('homepage.urls')),
url(r'^homepage/', include('homepage.urls')),
url(r'^admin/', include(admin.site.urls)),
)
Надеюсь, что это поможет!
Ответ 5
Я знаю, что ответ задерживается, но в последнее время у меня была моя доля охоты. Это то, что я пытался с CBV..
в Project 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'),
]
Ответ 6
Я также хотел получить корень своего домена, чтобы он напрямую указывал на представление вспомогательного приложения.
Сначала я создал подпрограмму с помощью этой команды:
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),
]
И файл views.py
просто содержит тестовый код.
from django.http import HttpResponse
def index(request):
return HttpResponse("TEST app index")
Таким образом, ваши запросы к корневому домену направляются в ваше вспомогательное приложение. Надеюсь, это кому-нибудь поможет. Этот код был протестирован с Django 2.1.4.