web-dev-qa-db-fra.com

Django URLS, comment mapper root sur app?

Je suis assez nouveau pour Django, mais je connais bien la programmation Web en Python et en Java avec différents frameworks . .com/myapp.

J'ai défini les URL et les vues dans mon fichier urls.conf qui n'est actuellement pas découplé de l'application (cela ne vous dérange pas). 

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

Tout cela fonctionne comme un charme. Si quelqu'un accède à www.monsite.com/monapp, il appuiera sur ma vue d'index, ce qui provoquera une redirection HTTP vers l'URL "correcte" par défaut.

Alors, comment puis-je ajouter un motif qui fera la même chose que (r '^ myapp/$', 'index') mais sans le/myapp - c'est-à-dire que www.monsite.com devrait suffire?

Je penserais que ce serait très basique ... J'ai essayé d'ajouter une ligne comme celle-ci:

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

mais cela me met dans une boucle ... 

J'espère que les gourous de Django pourront clarifier cela pour moi!

47
Hoof

Cela semble étrange.

Votre dernière tentative devrait marcher, mais ce que je fais normalement - mettre 

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

Cela évolue mieux lorsque vous commencez à ajouter de nouvelles applications.

60
Guard

Comme je n’ai pas trouvé de réponse pour Django 2.0, j’ai pensé en fournir une. vous devez utiliser '' en tant qu'URL racine. Voici un exemple tiré de Django 2.0 docs

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

Il suffit de mettre une expression régulière brute vide: r ''

J'ai testé ici et cela a fonctionné parfaitement.

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

J'espère que ça aide!

4
Fabio Nolasco

Je sais que la réponse est tardive, mais j'ai récemment eu ma part de chasse. C’est ce que j’ai essayé avec CBV .. Dans le projet urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', include('app_name.urls', namespace='app_name')),
]

PS: Il est toujours recommandé d'utiliser un espace de noms. Donne un bon avantage plus tard.

Dans l'application urls.py

urlpatterns = [
    url(r'^$', views.IndexPageView.as_view(), name='index'),
]
1
Vipin Mohan

Je souhaitais également que la racine de mon domaine pointe directement sur une vue d'une sous-application.

Au début, j'ai créé l'application secondaire avec cette commande:

python3 manage.py startapp main offer_Finder/main

Dans votre cas ce serait:

python3 manage.py startapp myApp project/somedirectory/myApp

assurez-vous que le répertoire existe: mkdir -p project/somedirectory/myApp

Voici la structure de mon projet: Structure du projet

Dans mon cas, j'ai ces répertoires: 

offer_Finder_project/offer_Finder/main        # sub app  
offer_Finder_project/offer_Finder/            # main source directory  

dans offer_Finder_project/offer_Finder/urls.py j'ai ce code:

from Django.contrib import admin
from Django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('offer_Finder.main.urls')),
]

Et dans offer_Finder_project/offer_Finder/main/urls.py j'ai ce code:

from Django.urls import path
from . import views

urlpatterns = [
    path('', views.index),
]

Et le fichier views.py contient simplement du code de test.

from Django.http import HttpResponse

def index(request):
    return HttpResponse("TEST app index")

De cette façon, vos requêtes sur votre domaine racine sont dirigées vers votre sous-application . J'espère que cela aidera quelqu'un . Ce code a été testé avec Django 2.1.4.

0
John Behm