こんにちは、
サーバーからクライアント証明書情報を取得し、それを次のようにFlaskアプリに取り込むようにカスタムワーカーを設定しようとしています。
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)
次の例外が発生し続けます。
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
これを修正するために複数のことを試みました。たとえば、 gunicorn_options.py
ファイルにworker_class_str
を設定しようとしましたが、問題は解決しませんでした。 次に、実際のパッケージのコードを調べ始めました。 gunicorn/arbiter.py
ファイルを変更して次の行をコメントアウトすると、 self.log.info("Using worker: %s", self.cfg.worker_class_str)
すべて正常に機能し、CustomSyncWorkerは正常に読み込まれます。 X-USERヘッダーとすべてを設定することになっているようにその仕事をします。
これはバグですか? それとも私は劇的に間違ったことをしているだけですか? 物事を強制的に機能させるためだけにコードをローカルで変更することを自分自身に任せるべきではないと思います...
worker_class
文字列を渡す必要があると思います。 だから変化する
worker_class = CustomSyncWorker
に
worker_class = 'mypackage.client_auth_worker.CustomSyncWorker'
あなたの問題を解決するでしょう。
また、これはhttp://docs.gunicorn.org/en/stable/settings.html#worker-classですでに文書化されていることに注意してください。
オプションで、gunicorn.workers.base.WorkerのサブクラスへのPythonパスをGunicornに与えることで、独自のワーカーを提供できます。 この代替構文は、geventクラスgunicorn.workers.ggevent.GeventWorkerをロードします。
もちろん、より良い提案があれば、いつでもドキュメントを改善することができます。
報告ありがとうございます!
私はそれを試したと思いますが、うまくいきませんでしたが、確信が持てず、文字列を別の方法で記述した可能性があります( "mypackage.client_auth_worker:CustomSyncWorker"
形式など)。 今日遅くに家に帰ったらチェックしなければなりません。
それとは別に、私がそのドキュメントを見たことがあり、それが私がすべきことであることが明確ではなかったという理由だけで、ドキュメントまたは少なくともどこか(適切だと思う場所)に直接例を入れることをお勧めしますPython構成ファイル。 試行錯誤を繰り返した結果、印刷物をコメントアウトした後に投稿した作業バージョンを入手しました。
早く返事をくれてありがとう!
OK、確認しました、それはうまくいきました。 お手伝いありがとう!
最も参考になるコメント
worker_class
文字列を渡す必要があると思います。 だから変化するに
あなたの問題を解決するでしょう。