2010-10-26 14 views
12

que estaba leyendo a través del doc Frasco - y encontré this:Locales de contexto: ¿cómo hacen que las variables de contexto locales sean globales?

... Para las aplicaciones web es crucial para reaccionan a los datos de un cliente envía al servidor . En Flask, esta información es proporcionada por el objeto de solicitud global. Si tiene alguna experiencia con Python, se estará preguntando cómo el objeto puede ser global y cómo el Flask se las arregla para mantener la seguridad de los hilos. La respuesta son locales de contexto ...

Ahora entendía los locales del contexto para ser cosas como la declaración with (sin duda eso es lo que el python 2.6 doc parece sugerir). Estoy luchando para ver cómo esto te permitiría tener vars accesibles globalmente que residen en un espacio de nombres local. ¿Cómo funciona esto conceptualmente?

También: los globales generalmente se consideran sucios. Lo tomo, entonces ¿por qué está bien?

+3

Está bien porque el exfoliante las variables globales abajo muy a fondo. – aaronasterling

Respuesta

4

En realidad, son objetos proxy para los objetos reales, de modo que cuando hace referencia a uno, obtiene acceso al objeto para su hilo actual.

Un ejemplo sería el objeto request. Puede ver que se configura en globlals.py y luego se importa en el __init__.py para el matraz.

El beneficio de esto es que se puede acceder a la solicitud sólo por hacer

from flask import request 

y escribir métodos como

@app.route('/') 
def hello_world(): 
    return "Hello World!" 

sin tener que pasar la solicitud alrededor como un parámetro.

Esto está haciendo uso de algunas de las bibliotecas de códigos reutilizables de Werkzeug.

+0

Disculpe si estoy siendo denso: pero si lo hago correctamente, empujan el contexto en una especie de 'estructura de pila' y luego pueden enrutar apropiadamente la llamada de atributo al objeto vinculado correcto basado en esta pila. – Malang

+1

Si toma una copia de la [fuente de Werkzeug] (http://pypi.python.org/packages/source/W/Werkzeug/Werkzeug-0.6.2.tar.gz) y busca en 'local.py' Verás que la clase 'Local' utiliza básicamente un diccionario con la identificación actual de la secuencia como la clave para almacenar y recuperar los objetos correctos de forma transparente. Este es el límite de lo que puedo deducir sin establecer algunas pruebas para descubrir qué está haciendo el código. – mikej

+0

No creo que una pila sea necesaria para lo anterior. Esto es sólo una suposición, pero la pila puede agregar una capa adicional relacionada con este comentario en la documentación a la que vinculó: * Lo hace de una manera inteligente que una aplicación puede invocar a otra aplicación sin romper. * – mikej

-2

espacios de nombres en Python son básicamente los diccionarios que podría hacer

globals()['foo']=bar
+0

+1 punto bueno:) – Malang

+0

¿Por qué se ha votado? Ojalá S/O obligara a los votantes a votar a dejar una explicación. Podría ser un buen aprendizaje. Puede que me haya perdido algo, pero si uso la ID de hilo en su lugar para 'foo' parece una variable global perfecta por hilo, que es esencialmente la misma idea que la respuesta aceptada.Python incorporado 'dict' es seguro para subprocesos. –

Cuestiones relacionadas