Gunicorn: Benutzerdefinierter Worker verursacht Probleme

Erstellt am 11. Juli 2017  ·  4Kommentare  ·  Quelle: benoitc/gunicorn

Hallo,

Ich versuche, einen benutzerdefinierten Worker einzurichten, um Client-Zertifikatsinformationen vom Server abzurufen und sie dann wie folgt in meine Flask-App zu übertragen:

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)

Ich bekomme immer folgende Ausnahme:

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

Ich habe mehrere Dinge versucht, um dies zu beheben, zum Beispiel habe ich versucht, ein worker_class_str in der gunicorn_options.py Datei zu setzen, was das Problem nicht behebt. Ich habe dann angefangen, im Code des eigentlichen Pakets zu wühlen und habe festgestellt, dass, als ich die Datei gunicorn/arbiter.py modifiziert habe, um die Zeile auskommentieren zu können: self.log.info("Using worker: %s", self.cfg.worker_class_str) alles funktioniert einwandfrei, der CustomSyncWorker wird einwandfrei geladen und macht seinen Job, wie es den X-USER-Header und alles setzen soll.

Ist das ein Fehler? Oder mache ich einfach etwas drastisch falsch? Ich denke, ich sollte es nicht auf mich nehmen, den Code lokal zu ändern, nur um die Dinge zum Laufen zu bringen ...

Feedback Requested

Hilfreichster Kommentar

Ich denke, Sie müssen eine Zeichenfolge an worker_class . Also ändern

worker_class = CustomSyncWorker

zu

worker_class = 'mypackage.client_auth_worker.CustomSyncWorker'

würde dein Problem lösen.

Alle 4 Kommentare

Ich denke, Sie müssen eine Zeichenfolge an worker_class . Also ändern

worker_class = CustomSyncWorker

zu

worker_class = 'mypackage.client_auth_worker.CustomSyncWorker'

würde dein Problem lösen.

Beachten Sie, dass dies bereits unter http://docs.gunicorn.org/en/stable/settings.html#worker -class . dokumentiert ist

Optional können Sie Ihren eigenen Worker bereitstellen, indem Sie Gunicorn einen Python-Pfad zu einer Unterklasse von gunicorn.workers.base.Worker geben. Diese alternative Syntax lädt die Klasse gevent: gunicorn.workers.ggevent.GeventWorker.

Natürlich können wir die Dokumentation jederzeit verbessern, wenn Sie einen besseren Vorschlag haben.

Vielen Dank für den Bericht!

Ich glaube, ich habe das versucht, und es hat nicht funktioniert, bin mir jedoch nicht sicher und habe den String möglicherweise anders geschrieben (wie in einem "mypackage.client_auth_worker:CustomSyncWorker" Format). Muss ich heute nachsehen, wenn ich nach Hause komme.

Abgesehen davon würde ich empfehlen, ein direktes Beispiel in die Dokumentation aufzunehmen oder zumindest woanders (wo immer Sie es für angebracht halten), einfach weil ich diese Dokumentation gesehen hatte und es nicht klar war, dass ich das im Fall von hätte tun sollen eine Python-Konfigurationsdatei. Am Ende habe ich eine Menge Trial-and-Error gemacht, was dazu führte, dass ich eine funktionierende Version erhielt, die ich nach dem Kommentieren des Ausdrucks gepostet habe.

Danke, dass Sie sich so schnell bei mir gemeldet haben!

OK, bestätigt, das hat funktioniert. Danke für die Hilfe!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen