Gunicorn: 自定义 Worker 导致问题

创建于 2017-07-11  ·  4评论  ·  资料来源: benoitc/gunicorn

你好,

我正在尝试设置一个自定义工作程序以从服务器检索客户端证书信息,然后将其放入我的 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 标头和所有内容。

这是一个错误吗? 还是我只是做错了什么? 我想我不应该自己在本地修改代码只是为了迫使事情工作......

Feedback Requested

最有用的评论

我认为您需要将字符串传递给worker_class 。 如此变化

worker_class = CustomSyncWorker

worker_class = 'mypackage.client_auth_worker.CustomSyncWorker'

会解决你的问题。

所有4条评论

我认为您需要将字符串传递给worker_class 。 如此变化

worker_class = CustomSyncWorker

worker_class = 'mypackage.client_auth_worker.CustomSyncWorker'

会解决你的问题。

请注意,这已经记录在http://docs.gunicorn.org/en/stable/settings.html#worker -class

或者,您可以通过为 Gunicorn 提供一个指向 gunicorn.workers.base.Worker 子类的 Python 路径来提供您自己的工人。 这种替代语法将加载 gevent 类:gunicorn.workers.ggevent.GeventWorker。

当然,如果您有更好的建议,我们可以随时改进文档。

感谢您的报告!

我相信我已经尝试过,但它没有用,但是,我不确定,我可能以不同的方式编写了字符串(例如"mypackage.client_auth_worker:CustomSyncWorker"格式)。 我今天晚些时候回家时必须检查一下。

除此之外,我建议在文档中或至少在其他地方(无论您认为合适的地方)放一个直接示例,因为我已经看过该文档并且不清楚这是我应该做的情况一个python配置文件。 我最终做了一堆反复试验,导致我得到了一个工作版本,我在注释掉打印输出后发布了这个版本。

谢谢你这么快回复我!

好的,确认,有效。 感谢您的帮助!

此页面是否有帮助?
0 / 5 - 0 等级