17 votes

La variable Global Request est-elle disponible dans Python/Django ?

J'ai écrit un plugin qui envoie un signal pour activer mon code. Cependant, il n'envoie pas l'objet user-request à mon code. Je cherche un moyen de récupérer la requête en cours sans modifier l'application principale. Je ne trouve aucune documentation relative aux requêtes globales (telles que $_SERVER['REMOTE_ADDR'] en PHP).

Je voudrais savoir s'il existe une variable pour faire cela en Python/Django.

22voto

Ned Batchelder Points 128913

Django ne fournit pas d'objet de requête global (il s'agirait en fait d'un thread local, pas d'un global). Mais il existe quelques techniques que vous pouvez utiliser pour obtenir le même effet vous-même : http://nedbatchelder.com/blog/201008/global_django_requests.html

3voto

guettli Points 3284

AFAIK, il n'est pas disponible, sauf si vous le rendez disponible.

Vous pouvez copier/coller les extraits fournis dans les autres réponses, ou utiliser cette bibliothèque : https://pypi.python.org/pypi/django-crequest

Middleware pour rendre la demande actuelle toujours disponible.

1voto

woryzower Points 532

Vous pouvez l'attacher à la demande en cours par le biais d'un middleware et le récupérer en retour https://github.com/jedie/django-tools/blob/master/django_tools/middlewares/ThreadLocal.py

1voto

x-yuri Points 616

Sur la base de la réponse de Ned Batchelder, j'ai élaboré une solution. Bien que je ne la recommande pas pour autre chose que le débogage et le dépannage. Il y a une meilleure solution sur la page liée.

Mettre le module m1 à un projet Root :

import inspect
def get_request():
    for f in inspect.stack():
        f_code = inspect.getmembers(f.frame, inspect.iscode)[0][1]
        f_locals = [v for (n, v) in inspect.getmembers(f.frame) if n == 'f_locals'][0]
        co_varnames = [v for (n, v) in inspect.getmembers(f_code) if n == 'co_varnames'][0]
        if 'request' in co_varnames:
            return f_locals['request']

Puis dans n'importe quel autre fichier :

import m1
print(m1.get_response().path)

Vous devriez vous assurer que vous n'introduisez pas cycles de référence . Je n'ai pas compris dans quelles conditions particulières je dois faire quoi exactement. Non pas que cela soit important dans mon cas. Mais votre kilométrage peut varier.

0voto

Teekin Points 4544

Une solution consiste à django-middleware-global-request .

Il fournit un moyen d'obtenir la requête de n'importe où, une fois que la requête a été construite par Django en premier lieu. Il retourne None si aucun objet de requête n'est disponible, par exemple lors d'une exécution dans un système de gestion de l'information. manage.py shell .

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