it-swarm.com.ru

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'),

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

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

47
Hoof

Это звучит странно.

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

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

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

60
Guard

Я знаю, что этот вопрос был задан 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'),
)
93
Kamal Alseisy

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

urlpatterns = [
    path('', main_views.homepage),
    path('help/', include('apps.help.urls')),
    path('credit/', include(extra_patterns)),
]
11
Amen

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

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

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

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

4
Fabio Nolasco

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

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

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

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.

0
John Behm