2011-09-01 8 views
7

He escrito un complemento que envía una señal para activar mi código. Sin embargo, no envía el objeto de solicitud de usuario a mi código. Estoy buscando una forma de recuperar la solicitud actual sin modificar la aplicación principal. No puedo encontrar ninguna documentación relacionada con la solicitud global (como $_SERVER['REMOTE_ADDR'] en PHP).¿Está disponible la variable Solicitud global en Python/Django?

Me gustaría saber si hay alguna variable para hacer eso en Python/Django.

Respuesta

0

Como sé que, a definir su vista de Django usando una serie de métodos como:

def detail(request, some_param): 
    # [...] 

El parámetro request contiene información acerca de la petición HTTP. request.META['HTTP_X_FORWARDED_FOR'] por ejemplo, devuelve la dirección IP del cliente.

Si su complemento tiene algo que ver con las solicitudes, sus clases y funciones probablemente se crearán/invocarán desde su vista. Esto significa que debe pasarle el objeto actual request, ya que no tiene sentido tener un objeto de solicitud global alrededor. En PHP, esto es posible, ya que cada solicitud hace que todo el código se ejecute desde cero, pero en las solicitudes de Django se envían por un servidor y se envían en el marco utilizando objetos HttpRequest. Consulte también this parte de la documentación de Django para obtener más información.

+0

Ya hay existe, y lo que tenemos que hacer es plug-in que activan por que las opiniones, pero que vistas refugio No envío el objeto de solicitud a mi función. Tampoco puedo modificar el comportamiento del código (vistas) de la aplicación principal. Entonces, tengo que buscar otra solución. – scalopus

+0

Esto es casi imposible, vea mi publicación actualizada. Django puede manejar múltiples solicitudes a la vez, por lo que no puede existir un estado global sino específico de la solicitud. Quizás podamos encontrar una solución si proporciona más información sobre lo que hace su complemento, cómo está estructurado o incluso si publica algún código. –

13

Django no proporciona un objeto de solicitud global (en realidad sería un subproceso local, no global). Pero hay algunas técnicas que puede usar para obtener el mismo efecto usted mismo: http://nedbatchelder.com/blog/201008/global_django_requests.html

+0

Esta es en realidad la respuesta más precisa. Cómo llegar a la solicitud fuera de una vista. La solución es un poco hackosa (la instalación de middleware capturando el objeto de solicitud para cada hilo en un diccionario), y todo esto anima a pasar la solicitud hacia abajo en lugar de recuperarla globalmente. Parece que una gran cantidad de 'ModeloAdmin.save_model (...)' reemplaza al futuro (y peor aún 'ModelAdmin.save_related (...)'. –

0

AFAIK no está disponible, excepto que lo pone a disposición.

Usted puede copiar + pegar los fragmentos previstos en las otras respuestas, o puede utilizar esta biblioteca: https://pypi.python.org/pypi/django-crequest

Middleware para hacer solicitud actual siempre disponible.

Cuestiones relacionadas