Pregunta

En mi aplicación Gae, uso webapp2.RequestHandler.initialize para hacer cosas personalizadas a la solicitud.
Hace hasta unos días, el cambio de os.environ['PATH_INFO'], influyó en llamando a sí misma .Request.Path en la solicitud de solicitud y reflejó la ruta de solicitud modificada. (Y esto todavía funciona bien en el SDK)

ahora ya no funciona más.Y, por supuesto, estoy teniendo grandes problemas debido a eso. Entiendo que esto podría ser un caso de borde, pero ¿cuáles son las razones por las que esto cambió?

El código afectado:

class BaseHandler(webapp2.RequestHandler):

    def initialize(self, request, response):    
        ns, path = get_namespace(os.environ)
        namespace_manager.set_namespace(ns)
        os.environ['namespace'] = ns

        # request.path reflects the incoming path

        path = os.environ.get('PATH_INFO')
        prefix = '/%s'%ns

        if ns and path.startswith(prefix):
            # the request.path has to be changed here...

            newpath = path[len(prefix):]
            # here i change the path_info in os.environ to the new 
            # path
            os.environ['PATH_INFO'] = newpath or '/'

        super(BaseHandler, self).initialize(request, response)

        # request.path and self.request.path here are still unchanged.
        # up to a few days ago here the path was reflecting the changes

¿Fue útil?

Solución

os.environ contiene las variables de entorno de estilo CGI.Las aplicaciones WSGI, como WebApp (2) pueden obtener su información desde allí (o no, dependiendo del contenedor), pero son bienvenidas, y incluso es probable, para copiar, no hacer referencia a los datos originales.No hay razón para asumir que manipular os.environ, afectará su aplicación WSGI, y lo hace es una mala idea por varias razones:

  1. rompe la abstracción
  2. Puede que no sea Threadsafe
  3. es solo desagradable
  4. En su lugar, modifique directamente el objeto Solicitud (por ejemplo, asignando a request.path), si debe, o mejor, almacene la información relevante en los atributos en el controlador de solicitud de que sus submarinos puedan acceder.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top