87 votes

Django: Comment rediriger un message et transmettre ses données

Lors du traitement d'une requête POST dans la Django views.py fichier, j'ai parfois besoin de le rediriger vers une autre url. Cette url, je suis rediriger vers est gérée par une autre fonction de la même Django views.py fichier. Est-il un moyen de le faire et de maintien de l'original POST de données?

Mise à JOUR: Plus d'explications sur le pourquoi je veux faire ce. J'ai deux applications web (appelons-les AppA et AppB) qui acceptent des données saisies dans un champ de texte par l'utilisateur. Lorsque l'utilisateur clique sur le bouton envoyer, les données sont traitées et les résultats détaillés sont affichés. L'AppA et AppB attendre les différents types de données. Parfois, un utilisateur à tort postes AppB type de données de l'AppA. Quand cela arrive, je veux rediriger vers AppB et de montrer l'AppB résultats ou au moins l'avoir remplie avec les données entrées dans l'AppA.

Aussi:

  • Le client souhaite deux applications, plutôt que de les combiner en un seul.

  • Je ne peux pas montrer le code qu'il appartient à un client.

Mise à JOUR 2: J'ai décidé que ce BAISER est le meilleur principe ici. J'ai combiné les deux applications en une seule ce qui rend les choses plus simples et plus robustes; je devrais être en mesure de convaincre le client c'est le meilleur moyen d'y aller aussi. Merci pour tous les beaux commentaires. Si j'allais à maintenir deux apps comme décrit ensuite je pense que les séances de la façon de le faire - merci à Matthieu J Morrison pour ce qui suggère que. Grâce à Dzida que son commentaire m'a fait penser à la conception et à la simplification.

63voto

Lukasz Dziedzia Points 4134

Si vous face à un tel problème il y a peu de chances que vous aviez compliqué votre conception.

C'est une restriction de HTTP POST de données ne peut pas aller avec les redirections.

Pouvez-vous décrire ce que vous voulez accomplir et peut-être alors nous pouvons réfléchir à la solution élégante.

Si vous ne souhaitez pas utiliser les sessions que Matthieu a suggéré, vous pouvez passer POST params en arriver à la nouvelle page (tenir compte de certaines limitations telles que la sécurité et la longueur maximale d'OBTENIR des paramètres de chaîne de requête).

Mise à JOUR de votre mise à jour:) Il semble étrange pour moi que vous avez 2 applications web et les applications d'utiliser un views.py (suis-je le droit?). De toute façon envisager de transmettre vos données de POST à se rendre à la bonne vue (dans le cas où les données ne sont pas sensibles, bien sûr).

59voto

Matthew J Morrison Points 2319

Je pense que je serais probablement gérer cette situation serait d'enregistrer les données post dans la session, puis l'enlever quand je n'ai plus besoin d'elle. De cette façon, je peux accéder à l'original post de données après une redirection même si ce post est parti.

Est-ce pour ce que vous essayez de faire?

Voici un exemple de code de ce que je suggère: (gardez à l'esprit que c'est du code non testé)

def some_view(request):
    #do some stuff
    request.session['_old_post'] = request.POST
    return HttpResponseRedirect('next_view')

def next_view(request):
    old_post = request.session.get('_old_post')
    #do some stuff using old_post

Une autre chose à garder à l'esprit... si vous faites cela et aussi de télécharger des fichiers, je ne voudrais pas faire de cette façon.

23voto

Lloeki Points 1092

Vous devez utiliser une redirection temporaire HTTP 1.1 (307). Malheureusement, django redirect () et HTTPResponse (Permanent) Redirect renvoient uniquement un 301 ou 302. (voir le module django.http )

Vous devez l'implémenter vous-même:

 from django.http import HttpResponse, iri_to_uri
class HttpResponseTemporaryRedirect(HttpResponse):
    status_code = 307

    def __init__(self, redirect_to):
        HttpResponse.__init__(self)
        self['Location'] = iri_to_uri(redirect_to)
 

0voto

Jack M. Points 8224

Si vous utilisez une redirection après le traitement de la POSTE à l' AppB, vous pouvez réellement obtenir loin avec l'appel de l' AppB méthode de l' AppA méthode.

Un Exemple:

def is_appa_request(request):
    ## do some magic.
    return False or True
is_appb_request = is_appa_request

def AppA(request):
    if is_appb_request(request):
       return AppB(request)
    ## Process AppA.
    return HttpResponseRedirect('/appa/thank_you/')

def AppB(request):
    if is_appa_request(request):
       return AppA(request)
    ## Process AppB.
    return HttpResponseRedirect('/appb/thank_you/')

Cela devrait donner une expérience transparente pour l'utilisateur final, et le client qui fait appel à vous ne sera probablement jamais en connaître la différence.

Si vous n'êtes pas la redirection après le POST, n'êtes-vous pas inquiet au sujet de dupliquer les données à l'utilisateur d'actualiser la page?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X