2010-06-27 28 views
0

Je voudrais appeler une fonction dans ma vue ou n'importe quel module d'ailleurs et le faire mettre à jour le corps de la réponse. Mon idée initiale est de mettre en œuvre un middleware process_response pour mettre à jour le corps de la réponse, et configurer un rappel qui reçoit les signaux envoyés dans mes appels de fonction, mais quand j'essaye, le récepteur ne se déclenche jamais (j'ai testé le singal/récepteur en dehors de la classe middleware/module et il fonctionne très bienDjango peut-il recevoir des signaux dans le middleware ou modifier globalement l'objet de réponse?

Exemple:..

# in module that defines the signal 
module.signal.send(msg='this is a message to append on the response body') 

# in view or model 
signal.connect(callback) 

# in middleware.py 
def callback(self, sender, *kwargs): 
    self.body_text = kwargs.pop('msg') 

def process_response(self, request, response): 
    response.body = response.body + self.body_text 
    return response 
+0

Comment obtenez-vous l'objet de réponse dans le rappel? –

+0

Eh mauvais échantillon de code. La méthode réside dans la classe middleware et définirait une propriété d'instance qui pourrait être utilisée pour mettre à jour le corps de la réponse dans la méthode 'process_response'. –

+0

Ça ne va pas marcher. L'intergiciel est instancié par processus et non par requête. –

Répondre

0

Si vous voulez vraiment faire cela, vous pouvez utiliser request comme entremetteur

nous La requête a démarré/terminé les signaux pour enregistrer/désenregistrer un nouvel écouteur qui ajoutera ce texte à un attribut de votre objet de requête.

Ensuite, dans votre middleware process_response, il vous suffit de vérifier cet attribut. Toutefois, vous devez également faire attention à l'état de la réponse. Il n'y a pas vraiment de raison de mettre quelque chose dans le corps de la réponse s'il s'agit d'une redirection, par exemple.

+0

Ce n'est pas une mauvaise solution. Pour le moment, je n'utilise que des vars globaux dans mon module personnalisé, ce qui me donne l'impression d'être saccadé, mais c'est principalement pour le développement et le débogage, donc je ne m'inquiète pas trop pour ça. –