Halo,
Saya mencoba mengatur pekerja khusus untuk mengambil informasi sertifikat klien dari server dan kemudian memasukkannya ke aplikasi Flask saya seperti:
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)
Saya terus mendapatkan pengecualian berikut:
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
Saya mencoba beberapa hal untuk memperbaikinya, misalnya, saya mencoba menyetel worker_class_str
di file gunicorn_options.py
, yang tidak menyelesaikan masalah. Saya kemudian mulai menggali kode paket yang sebenarnya dan saya menemukan bahwa ketika saya memodifikasi file gunicorn/arbiter.py
untuk mengomentari baris: self.log.info("Using worker: %s", self.cfg.worker_class_str)
semuanya bekerja dengan baik, CustomSyncWorker dimuat dengan baik dan melakukan tugasnya seperti yang seharusnya mengatur header X-USER dan semuanya.
Apakah ini bug? Atau apakah saya hanya melakukan sesuatu yang salah secara drastis? Saya pikir saya tidak boleh memaksakan diri untuk memodifikasi kode secara lokal hanya untuk memaksa semuanya berfungsi ...
Saya pikir Anda perlu meneruskan string ke worker_class
. Jadi berubah
worker_class = CustomSyncWorker
ke
worker_class = 'mypackage.client_auth_worker.CustomSyncWorker'
akan memecahkan masalah Anda.
Dan perhatikan bahwa ini sudah didokumentasikan di http://docs.gunicorn.org/en/stable/settings.html#worker -class
Secara opsional, Anda dapat menyediakan pekerja Anda sendiri dengan memberikan Gunicorn jalur Python ke subkelas gunicorn.workers.base.Worker. Sintaks alternatif ini akan memuat kelas gevent: gunicorn.workers.ggevent.GeventWorker.
Tentu saja, kami selalu dapat meningkatkan dokumentasi jika Anda memiliki saran yang lebih baik.
Terima kasih atas laporannya!
Saya yakin saya telah mencobanya, dan itu tidak berhasil, namun, saya tidak yakin dan saya mungkin telah menulis string secara berbeda (seperti dalam format "mypackage.client_auth_worker:CustomSyncWorker"
). Saya harus memeriksa ketika saya pulang nanti hari ini.
Selain itu, saya akan merekomendasikan untuk memasukkan contoh langsung ke dalam dokumentasi atau setidaknya di tempat lain (di mana pun menurut Anda tepat) hanya karena saya telah melihat dokumentasi itu dan tidak jelas bahwa itulah yang seharusnya saya lakukan dalam kasus file konfigurasi python. Saya akhirnya melakukan banyak percobaan dan kesalahan yang mengakibatkan saya mendapatkan versi yang berfungsi yang saya posting setelah mengomentari hasil cetakan.
Terima kasih telah kembali padaku begitu cepat!
Oke, dikonfirmasi, itu berhasil. Terima kasih atas bantuannya!
Komentar yang paling membantu
Saya pikir Anda perlu meneruskan string ke
worker_class
. Jadi berubahke
akan memecahkan masalah Anda.