2010-11-10 5 views
2

Tous les exemples que je peux trouver d'urlpatterns pour les sites django ont une entrée séparée pour les URL entrantes qui n'ont pas de barre oblique, ou le dossier racine. Ensuite, ils gèrent des sous-dossiers sur chaque ligne individuelle. Je ne comprends pas pourquoi simpleDjango urlpatterns problème frustrant avec les barres obliques

/? 

expression régulière ne permet pas ces être sur une ligne simple.

Considérons ce qui suit, appelons le projet Django Baloney et le nom de l'application est Cheese. Ainsi, dans le projet urls.py nous avons quelque chose comme ceci pour permettre aux applications urls.py de gérer les demandes est ...

urlpatterns = patterns('', 
    (r'^cheese/', include('Baloney.Cheese.urls')), 
) 

puis à l'intérieur des applications de fromage urls.py, je ne comprends pas pourquoi une simple ligne ne déclencherait pas aussi vrai pour tous les sous-chemins url entrants, y compris une valeur vide ...

urlpatterns = patterns('', 
    (r'^(?P<reqPath>.*)/?$', views.cheeseapp_views), 
) 

au lieu de cela, il correspond au cas en blanc, mais pas le cas d'une valeur actuelle. Alors ...

http://baloneysite.com/cheese/  --> MATCHES THE PATTERN 
http://baloneysite.com/cheese/swiss --> DOES NOT MATCH 

Fondamentalement, je veux capturer la variable reqPath pour inclure ce qui est là (même en blanc ou « »), mais non une barre oblique de fin s'il y a un. Les URL sont des limes dynamiques extraites de la base de données, donc je fais tout le suivi jusqu'au contenu dans mes vues et j'ai juste besoin des motifs d'URL pour transmettre les valeurs. Je sais que les travaux suivants, mais ne comprends pas pourquoi tout cela ne peut pas être placé sur une ligne avec le /? expression régulière avant le signe $ final.

(r'^$', views.cheeseapp_views, {'reqPath':''}), 
(r'^(?P<reqPath>.*)/$', views.cheeseapp_views), 

Appréciez toute idée.

+0

Je ne peux pas répondre à votre question, mais je suis sûr que vous vouliez dire r '^ (? P . *?) /? $'. Sinon, votre barre oblique sera toujours incluse dans reqPath. – cababunga

+0

Je le fais "tout le temps" et ça marche toujours. Avez-vous coller ici votre code exact? –

+0

cababunga - qu'est-ce que le point d'interrogation supplémentaire après. * Faire? . * est regex pour 0 ou un nombre de caractères. ??? – sansjoe

Répondre

9

J'ai juste essayé un échantillon similaire et cela a fonctionné comme vous l'avez écrit. Pas besoin de/?,. * Correspondrait de toute façon. Quelle est l'erreur exacte que vous obtenez? Peut-être que vous avez votre vue sans le paramètre de demande? C'est à dire. views.cheeseapp_views devrait être quelque chose comme:

def cheeseapp_views(request, reqPath): 
    ... 

Edit:

Le modèle que vous suggérez prises la barre oblique de queue dans reqPath parce que * l'opérateur est avide (jetez un oeil à docs.python.org/library/ re.html). Essayez ceci à la place:

(r'^(?P<reqPath>.*?)/?$', views.cheeseapp_views) 

Notez c'est. *? au lieu de. * pour le rendre non-gourmand.

+0

Je ne veux pas que le. * Inclue le slash final s'il y en a un. Le /? ne fonctionne pas et ma question est pourquoi pas. domaine.com/baloney/cheese/-> veulent que cela corresponde et reqPath aurait = '' domain.com/baloney/cheese/ANYTHINGELSE-OR/9382091/etcetc/ -> que cela corresponde et que reqPath aurait = 'N'IMPORTE QUEL OR/9382091/etcetc » Je ne comprends pas pourquoi le modèle i proposé ne permet pas ... (r^(? P . *) /? $ ', views.cheeseapp_views) – sansjoe

+0

OK , première chose - l'expression rationnelle que vous avez donnée correspond à l'URL. Lorsque vous avez dit "NE CORRESPOND PAS" à votre question, je pensais que cela ne correspondait pas du tout, c'est-à-dire que vous obteniez "Page non trouvée (404)" de Django. C'est ce que j'avais en tête quand j'ai répondu. Deuxièmement, le modèle que vous avez suggéré capture la barre oblique finale dans reqPath car l'opérateur * est gourmand (consultez http://docs.python.org/library/re.html). Essayez ceci à la place: '(r '^ (? P . *?) /? $', Views.cheeseapp_views)' - notez que c'est. *? au lieu de. * pour le rendre non-gourmand. –

+0

remercie un million pour cette excellente réponse et réponse. Si vous postez votre commentaire en guise de réponse, je le signalerai comme LA réponse à cette question. J'ai scanné la page de documentation de Python de RE, mais je n'ai jamais atteint ce niveau de détail important. J'apprécie beaucoup. – sansjoe

Questions connexes