Flacon de rediriger plusieurs itinéraires
Je suis en train de mettre en œuvre une redirection modèle, similaire à ce que StackOverflow n':
@route('/<int:id>/<username>/')
@route('/<int:id>/')
def profile(id, username=None):
user = User.query.get_or_404(id)
if user.clean_username != username:
return redirect(url_for('profile', id=id, username=user.clean_username))
return render_template('user/profile.html', user=user)
Voici un tableau simple de ce qui devrait se produire:
URL Redirects/points to
====================================================
/user/123 /user/123/clean_username
/user/123/ /user/123/clean_username
/user/123/foo /user/123/clean_username
/user/123/clean_username /user/123/clean_username
/user/123/clean_username/ /user/123/clean_username/
/user/125698 404
Maintenant, je peux accéder au profil avec /user/1/foo
, mais /user/1
produit un BuildError
. J'ai essayé de la alias=True
argument mot-clé et quelque chose avec defaults
, mais je ne suis pas tout à fait sûr ce n'est pas de travail.
Comment aurais-je un itinéraire rediriger vers l'autre?
- Je ne sais pas si je suis absent quelque chose.. mais qui ne devrait pas l'être à l'intérieur d'une classe et d'avoir un
self
paramètre? (en supposant que vous utilisez flacon chic) Autre chose qui pourrait être mal si vous êtes en utilisant des modèles est que vous devez ajouter le modèle de nom de url_for (flask.pocoo.org/docs/blueprints/#building-urls). - Si vous êtes l'obtention d'un
BuildError
ensuite, il ya quelque chose de mal avec votre appel àurl_for
. Pouvez-vous fournir le traceback? - C'est un exemple simplifié qui illustre bien le problème. À l'aide de plans ou de Flacon Chic n'aurait pas vraiment changer quoi que ce soit.
- vous pouvez poster votre
app.url_map
? cela devrait vous aider à comprendre ce qui faiturl_for
de s'étouffer. - Donc, euh... que l'on devrait obtenir le bounty?
- Eh bien, il s'est avéré que mon problème était dû à une erreur stupide de ma part, donc je ne suis pas sûr.
- Si nous sommes d'être littérale, je ne crois
strict_slashes
fait la différence ici,/user/123/foo
redirige vers/user/123/foo/
. c'est le/user/123/foo/
url, ce qui n'apparaît pas dans votre tableau, qui exécutera votre fonction et est censé rediriger vers la bonne url.
Vous devez vous connecter pour publier un commentaire.
le débogage des itinéraires de:
Mise à jour: répondre à la principale question "quel est le problème avec mes parcours", de la façon la plus simple de debug qui est de l'utilisation
app.url_map
; e.g:Dans ce cas, cela confirme que le point de terminaison est correctement réglé.
Voici un exemple mettant en valeur à la fois simple
flask
etflask-classy
:Ils ont différents points de terminaison, qui vous devez prendre en compte pour
url_for
:Sans
flask-classy
le nom du point de terminaison est le nom de la fonction, mais comme vous l'avez constaté, ce qui est différent lors de l'utilisation declassy
, et vous pouvez regarder le nom du point de terminaison avecurl_map()
ou de céder votre itinéraire avec@route(..., endpoint='name')
.moins redirections:
Pour répondre à l'url que vous avez posté, tout en minimisant la quantité de redirection, vous devez utiliser
strict_slashes=False
, ce sera assurez-vous de traiter les demandes qui ne sont pas terminées avec un/
au lieu de les rediriger avec un301
rediriger vers leur/
terminée par contrepartie:voici le résultat:
Comportement de
strict_slashes
:Je crois que c'est exactement ce que votre test de la matrice est sur 🙂
strict_slashes
soit.Vous avez presque obtenu.
defaults
est ce que vous voulez. Voici comment cela fonctionne:defaults
est undict
avec des valeurs par défaut pour tous les paramètres de la route qui ne sont pas à la règle. Ici, dans la deuxième route décorateur, il n'y a pas deusername
paramètre de la règle, de sorte que vous avez à mettre dansdefaults
.Bien, il ressemble mon code d'origine a effectivement travaillé. Flacon Chic a la question ici (et depuis que cette question a un bounty, je ne peux pas le supprimer).
J'ai oublié que le Flacon Chic renomme les routes, donc au lieu de
url_for('ClassName:profile')
, je dois sélectionner le ultrapériphériques décorateur route:Une autre solution serait de spécifier explicitement un point de terminaison de la route:
app.url_map
.app.url_map
. Il est même assez imprime les routes!Je ne comprends pas pourquoi vous rediriger. Vous n'avez pas gagner quoi que ce soit avec la redirection, et comme vous l'avez mentionné vous-même, vous vous retrouvez juste l'interrogation de la base de données plusieurs fois. Vous n'utilisez pas le nom d'utilisateur de manière significative, donc, juste l'ignorer.
Cela permettra de satisfaire tous vos exemples donnés.