Gunicorn: Trabajador personalizado que causa problemas

Creado en 11 jul. 2017  ·  4Comentarios  ·  Fuente: benoitc/gunicorn

Hola,

Estoy tratando de configurar un trabajador personalizado para recuperar la información del certificado del cliente del servidor y luego ingresarla en mi aplicación Flask así:

gunicorn_options.py:

import multiprocessing
import os
from mypackage.client_auth_worker import CustomSyncWorker

def config_dir():
    return os.path.dirname(os.path.realpath(__file__))

bind = "0.0.0.0:8000"
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = CustomSyncWorker
timeout = 30
ca_certs = os.path.join(config_dir(), 'ca.cert.pem')
certfile = os.path.join(config_dir(), 'server.cert.pem')
keyfile = os.path.join(config_dir(), 'server.key.pem')
cert_reqs = 2
do_handshake_on_connect = True

custom_auth_worker.py:

from gunicorn.workers.sync import SyncWorker

class CustomSyncWorker(SyncWorker):
    def handle_request(self, listener, req, client, addr):
        subject = dict(client.getpeercert().get('subject')[0])
        headers = dict(req.headers)
        headers['X-USER'] = subject.get('commonName')
        print(headers)
        req.headers = list(headers.items())
        super(CustomSyncWorker, self).handle_request(listener, req, client, addr)

Sigo recibiendo la siguiente excepción:

File "/Users/me/.virtualenvs/mypackage/lib/python3.5/site-packages/gunicorn/arbiter.py", line 162, in start
    self.log.info("Using worker: %s", self.cfg.worker_class_str)
  File "/Users/me/.virtualenvs/mypackage/lib/python3.5/site-packages/gunicorn/config.py", line 68, in __getattr__
    raise AttributeError("No configuration setting for: %s" % name)
AttributeError: No configuration setting for: worker_class_str

Intenté varias cosas para solucionar esto, por ejemplo, intenté configurar un worker_class_str en el archivo gunicorn_options.py , que no resolvió el problema. Luego comencé a buscar en el código del paquete real y descubrí que cuando modifiqué el archivo gunicorn/arbiter.py para comentar la línea: self.log.info("Using worker: %s", self.cfg.worker_class_str) todo funciona perfectamente bien, CustomSyncWorker está bien cargado y hace su trabajo, ya que se supone que debe configurar el encabezado X-USER y todo.

¿Es esto un error? ¿O simplemente estoy haciendo algo drásticamente mal? Supongo que no debería asumir la responsabilidad de modificar el código localmente solo para forzar que las cosas funcionen ...

Feedback Requested

Comentario más útil

Creo que necesitas pasar una cadena a worker_class . Tan cambiante

worker_class = CustomSyncWorker

para

worker_class = 'mypackage.client_auth_worker.CustomSyncWorker'

resolvería tu problema.

Todos 4 comentarios

Creo que necesitas pasar una cadena a worker_class . Tan cambiante

worker_class = CustomSyncWorker

para

worker_class = 'mypackage.client_auth_worker.CustomSyncWorker'

resolvería tu problema.

Y tenga en cuenta que esto ya está documentado en http://docs.gunicorn.org/en/stable/settings.html#worker -class

Opcionalmente, puede proporcionar su propio trabajador dándole a Gunicorn una ruta de Python a una subclase de gunicorn.workers.base.Worker. Esta sintaxis alternativa cargará la clase gevent: gunicorn.workers.ggevent.GeventWorker.

Por supuesto, siempre podríamos mejorar la documentación si tiene una sugerencia mejor.

¡Gracias por el informe!

Creo que lo había intentado y no funcionó, sin embargo, no estoy seguro y es posible que haya escrito la cadena de manera diferente (como en un formato "mypackage.client_auth_worker:CustomSyncWorker" ). Tendré que comprobarlo hoy más tarde cuando llegue a casa.

Aparte de eso, recomendaría poner un ejemplo directo en la documentación o al menos en otro lugar (donde crea que es apropiado) simplemente porque había visto esa documentación y no estaba claro que eso es lo que debería haber hecho en el caso de un archivo de configuración de Python. Terminé haciendo un montón de prueba y error, lo que resultó en que obtuve una versión funcional que publiqué después de comentar la impresión.

¡Gracias por responderme tan rápido!

OK, confirmado, funcionó. ¡Gracias por la ayuda!

¿Fue útil esta página
0 / 5 - 0 calificaciones