2009-10-20 8 views
57

J'ai deux applications situées sur deux ordinateurs distincts. Sur l'ordinateur A, dans le fichier urls.py j'ai une ligne comme ce qui suit:django sans slash ne redirige pas

(r'^cast/$', 'mySite.simulate.views.cast') 

Et cette URL travail pour les deux mySite.com/cast/ et mySite.com/cast. Mais sur l'ordinateur BI ont une URL similaire écrite comme de:

(r'^login/$', 'mySite.myUser.views.login') 

Pour une raison quelconque sur l'ordinateur B le url mySite.com/login/fonctionnera, mais mySite.com/login se bloque et ne directement à son mySite.com/login/ comme il sera sur l'ordinateur A. Est il y a quelque chose qui m'a manqué? Les deux fichiers url.py me semblent identiques.

Répondre

73

vérifier votre APPEND_SLASH paramètre dans le fichier settings.py

more info in the django docs

+2

« Quand il est réglé sur True, si l'URL de la requête ne correspond à aucun des motifs dans l'URLconf et ne se termine pas par une barre oblique, une redirection HTTP est émise vers la même URL avec une barre oblique ajoutée Notez que la redirection peut entraîner la perte de toute donnée soumise dans une requête POST. ". "Le paramètre APPEND_SLASH n'est utilisé que si CommonMiddleware est installé ...". Je préfère la réponse de Michael Gendin pour une solution plus propre. – Wtower

+0

Cela ne fonctionne pas si vous utilisez une URL "catch all" supplémentaire à la dernière entrée de vos URLs. La réponse de speedplane @ fonctionnera même dans ces situations. Mais, bien sûr, ceci est plus simple et devrait être utilisé s'il n'y a pas d'entrées de type "catch all". – np8

139

Ou vous pouvez écrire vos urls comme ceci:

(r'^login/?$', 'mySite.myUser.views.login') 

Le signe d'interrogation après le slash rend facultatif regexp. Utilisez-le si, pour certaines raisons, vous ne souhaitez pas utiliser le paramètre APPEND_SLASH.

+6

Appelez-moi naïf - mais pourquoi cette réponse n'a-t-elle pas obtenu un million de upvotes et une entrée dans la django faq? –

+35

Assez sûr que vous ne voulez pas faire cela pour des raisons de référencement - préférable de rediriger vers une URL canonique que d'avoir deux URL valides. –

+35

Si vous développez une API RESTful à l'aide de Django, cela peut être une bonne solution lorsque les développeurs postent des données directement sur l'URL du point de terminaison. Lors de l'utilisation de 'APPEND_SLASH', si elles l'ont envoyé accidentellement sans slash, et que votre urlconf est WITH avec une barre oblique finale, elles recevraient une exception à propos de la perte de données lors de la redirection des requêtes POST. – OrPo

0

J'ai eu le même problème. Dans mon cas, il était un reste vicié de certains ancienne version en urls.py, avant de staticfiles:

url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'), 
    'django.views.static.serve', 
    kwargs={'document_root': settings.MEDIA_ROOT}), 

MEDIA_URL était vide, donc ce modèle tout adapté.

2

J'ai eu le même problème aussi. Ma solution a été mise un (| /) avant la ligne de fin de mon expression régulière.

url(r'^artists/(?P[\d]+)(|/)$', ArtistDetailView.as_view()),

9

Cette améliore la réponse de Gendin @ Michael. Sa réponse sert la même page avec deux URL distinctes. Il serait préférable d'avoir login Rediriger automatiquement à login/, et servir ensuite celle-ci comme la page principale:

from django.conf.urls import patterns 
from django.views.generic import RedirectView 

urlpatterns = patterns('', 
    # Redirect login to login/ 
    (r'^login$', RedirectView.as_view(url = '/login/')), 
    # Handle the page with the slash. 
    (r'^login/', "views.my_handler"), 
) 
+2

Ceci est une façon très agréable et évidente! – Nevertheless

Questions connexes