Use gunicorn instead of werkzeug

Flask use werkzeug as default WSGI container, but it cannot support
production requirement and leads to crash in some cases. So use
gunicorn instead of it.

Change-Id: I2e542ab79c755c2407ae695a6de29c063233269b
Closes-Bug: #1641242
This commit is contained in:
Lin Yang 2016-11-11 17:55:18 -08:00
parent e621c9f3dc
commit 48f4c30b21
4 changed files with 29 additions and 3 deletions

View File

@ -11,4 +11,4 @@ python-dateutil==2.5.3
pytz==2016.7 pytz==2016.7
requests==2.11.1 requests==2.11.1
six==1.10.0 six==1.10.0
Werkzeug==0.11.11 gunicorn==19.6.0

View File

@ -52,4 +52,4 @@ source-dir = releasenotes/source
[entry_points] [entry_points]
console_scripts = console_scripts =
valence = valence.run:main valence = valence.cmd.api:main

0
valence/cmd/__init__.py Normal file
View File

View File

@ -14,16 +14,42 @@
# under the License. # under the License.
import logging import logging
import gunicorn.app.base
from gunicorn.six import iteritems
from valence.api.route import app as application from valence.api.route import app as application
from valence import config as cfg from valence import config as cfg
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
class StandaloneApplication(gunicorn.app.base.BaseApplication):
def __init__(self, app, options=None):
self.options = options or {}
self.application = app
super(StandaloneApplication, self).__init__()
def load_config(self):
config = dict([(key, value) for key, value in iteritems(self.options)
if key in self.cfg.settings and value is not None])
for key, value in iteritems(config):
self.cfg.set(key.lower(), value)
def load(self):
return self.application
def main(): def main():
application.run(host=cfg.bind_host, port=cfg.bind_port, debug=cfg.debug) options = {
'bind': '%s:%s' % (cfg.bind_host, cfg.bind_port)
}
StandaloneApplication(application, options).run()
LOG.info(("Valence Server on http://%(host)s:%(port)s"), LOG.info(("Valence Server on http://%(host)s:%(port)s"),
{'host': cfg.bind_host, 'port': cfg.bind_port}) {'host': cfg.bind_host, 'port': cfg.bind_port})
if __name__ == '__main__': if __name__ == '__main__':
main() main()