python-3.x - 防止 Bottle 的后端服务器插件(gunicorn)拦截命令行参数
问题描述
当我运行以下代码时:
import argparse
from bottle import Bottle, run
app = Bottle()
@app.get('/')
def get_fn():
return 'Testing'
def command_line():
parser = argparse.ArgumentParser()
parser.add_argument('-k', '--sslkey', nargs='?', default=None,
help='SSL key file')
parser.add_argument('-c', '--sslcrt', nargs='?', default=None,
help='SSL certificate file')
return parser.parse_args()
if __name__ == "__main__":
args = command_line()
run(app=app, server='gunicorn',
host='0.0.0.0', port=8888,
debug=False, quiet=True,
keyfile=args.sslkey, certfile=args.sslcrt)
我收到unrecognized argument
错误:
python3 ./tst.py --sslcrt ''
usage: tst.py [-h] [-v] [-c CONFIG] [-b ADDRESS] [--backlog INT] [-w INT]
[-k STRING] [--threads INT] [--worker-connections INT]
[--max-requests INT] [--max-requests-jitter INT] [-t INT]
[--graceful-timeout INT] [--keep-alive INT]
[--limit-request-line INT] [--limit-request-fields INT]
[--limit-request-field_size INT] [--reload]
[--reload-engine STRING] [--reload-extra-file FILES] [--spew]
[--check-config] [--preload] [--no-sendfile] [--reuse-port]
[--chdir CHDIR] [-D] [-e ENV] [-p FILE] [--worker-tmp-dir DIR]
[-u USER] [-g GROUP] [-m INT] [--initgroups]
[--forwarded-allow-ips STRING] [--access-logfile FILE]
[--disable-redirect-access-to-syslog]
[--access-logformat STRING] [--error-logfile FILE]
[--log-level LEVEL] [--capture-output] [--logger-class STRING]
[--log-config FILE] [--log-config-dict LOGCONFIG_DICT]
[--log-syslog-to SYSLOG_ADDR] [--log-syslog]
[--log-syslog-prefix SYSLOG_PREFIX]
[--log-syslog-facility SYSLOG_FACILITY] [-R]
[--statsd-host STATSD_ADDR] [--statsd-prefix STATSD_PREFIX]
[-n STRING] [--pythonpath STRING] [--paste STRING]
[--proxy-protocol] [--proxy-allow-from PROXY_ALLOW_IPS]
[--keyfile FILE] [--certfile FILE] [--ssl-version SSL_VERSION]
[--cert-reqs CERT_REQS] [--ca-certs FILE]
[--suppress-ragged-eofs] [--do-handshake-on-connect]
[--ciphers CIPHERS] [--paste-global CONF]
tst.py: error: unrecognized arguments: --sslcrt
如果我在没有任何参数的情况下运行相同的脚本,它就可以正常工作。
args
目前我的解决方法是在调用之前重置权限run()
:
import argparse, sys
from copy import copy
from bottle import Bottle, run
app = Bottle()
@app.get('/')
def get_fn():
return 'Testing'
def command_line():
parser = argparse.ArgumentParser()
parser.add_argument('-k', '--sslkey', nargs='?', default=None,
help='SSL key file')
parser.add_argument('-c', '--sslcrt', nargs='?', default=None,
help='SSL certificate file')
return parser.parse_args()
if __name__ == "__main__":
args = copy(command_line())
# must reset the args, otherwise gunicorn will go nuts
sys.argv = sys.argv[:1]
run(app=app, server='gunicorn',
host='0.0.0.0', port=8888,
debug=False, quiet=True,
keyfile=args.sslkey, certfile=args.sslcrt)
使用此解决方法,我的脚本可以按预期工作:
python3 ./tst.py --sslcrt ''
[2019-05-01 11:01:01 +0100] [29198] [INFO] Starting gunicorn 19.9.0
[2019-05-01 11:01:01 +0100] [29198] [INFO] Listening at: http://0.0.0.0:8888 (29198)
[2019-05-01 11:01:01 +0100] [29198] [INFO] Using worker: sync
[2019-05-01 11:01:01 +0100] [29239] [INFO] Booting worker with pid: 29239
有没有更明智的方法来做到这一点?
解决方案
推荐阅读
- python - 这行 Python 代码有问题吗?
- c++ - 我无法构建由 C++ 编写的特征工程库
- c - 在 c 套接字编程中接收反向数据
- python - 我需要帮助才能用 Python 重新启动游戏
- docker - Kafka 重新启动时,Logstash 失去与 Kafka 的输入连接
- c# - 在 2 个网站的多个应用程序上使用 ASP.NET 标识
- java - 尝试在回收站视图中实现搜索
- python - InvalidArgumentError: indices[120,0] = 3080 is not in [0, 32) [[{{node embedding_6/embedding_lookup}}]]
- wordpress - wp_mail 如何每小时发送 50 封电子邮件?
- python - Psycopg2 查询从 args 中删除 \n