Barry Warsaw pushed to branch master at mailman / Mailman
Commits: 2a4cade6 by Barry Warsaw at 2017-02-10T11:58:53-05:00 Add a very experimental gunicorn REST runner. - - - - - 7cd3d7e9 by Eric Searcy at 2017-02-10T11:58:53-05:00 Update WSGI functions to take necessary arguments * gunicorn.py needs to initialize mailman once, not per request. * make_application takes environment and response arguments, which it passes to the callable WSGI application (in this case, the instance of the RootedAPI class). (wsgiref does something similar, but wsgi_server only needs a copy of the application, and it passes the same two arguments to that object internally. Note, in my opinion wsgiapp.py's make_application has a misleading name, since it doesn't behave like a normal make_application (it's not invoked by a WSGI server). I've left it as-is, though, since it is public. - - - - - 0ba2a4ad by Barry Warsaw at 2017-02-10T12:28:36-05:00 Gunicorn REST support. Closes #287 - - - - - 06cce837 by Barry Warsaw at 2017-02-10T12:45:56-05:00 Experimental Gunicorn support. - - - - - a23f2cf7 by Barry Warsaw at 2017-02-10T18:29:41+00:00 Merge branch 'gunicorn' into 'master' Experimental Gunicorn support Closes #287 See merge request !247 - - - - - 3 changed files: - + contrib/gunicorn.py - src/mailman/docs/NEWS.rst - src/mailman/rest/wsgiapp.py Changes: ===================================== contrib/gunicorn.py ===================================== --- /dev/null +++ b/contrib/gunicorn.py @@ -0,0 +1,61 @@ +# Copyright (C) 2015-2017 by the Free Software Foundation, Inc. +# +# This file is part of GNU Mailman. +# +# GNU Mailman is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. +# +# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along with +# GNU Mailman. If not, see <http://www.gnu.org/licenses/>. + +"""Experimental Gunicorn based REST server. + +To use this do the following: + +* Install gunicorn as a Python 3 application (in a venv if necessary). +* Copy this file into your Python's site-packages under the name mmgunicorn.py +* Create a mailman.cfg with at least the following in it: + + [runner.rest] + start: no + +* Start Mailman as normal: `mailman start` +* Set the MAILMAN_CONFIG_FILE environment variable to the location of your + mailman.cfg file from above. +* Run: gunicorn mmgunicorn:run +""" + +from public import public + + +_initialized = False + + +@public +def run(environ, start_response): + """Create the WSGI application. + + Use this if you want to integrate Mailman's REST server with an external + WSGI server, such as gunicorn. Be sure to set the $MAILMAN_CONFIG_FILE + environment variable. + """ + # Imports are here to evaluate them lazily, prevent circular imports, and + # make flake8 happy. + global _initialized + if not _initialized: + from mailman.core.initialize import initialize + # First things first, initialize the system before any other imports or + # other operations. It must only be initialized once though. + initialize(propagate_logs=True) + _initialized = True + # Hook things up to WSGI. + from mailman.rest.wsgiapp import make_application + app = make_application() + return app(environ, start_response) ===================================== src/mailman/docs/NEWS.rst ===================================== --- a/src/mailman/docs/NEWS.rst +++ b/src/mailman/docs/NEWS.rst @@ -195,6 +195,8 @@ REST integers, since the latter are not compatible with all versions of JavaScript. (Closes #121) * REST clients must minimally support HTTP/1.1. (Closes #288) + * Experimental Gunicorn support. See ``contrib/gunicorn.py`` docstring for + details. With assistance from Eric Searcy. (Closes #287) * The new template system is introduced for API 3.1. See ``src/mailman/rest/docs/templates.rst`` for details. (Closes #249) * When creating a user via REST using an address that already exists, but ===================================== src/mailman/rest/wsgiapp.py ===================================== --- a/src/mailman/rest/wsgiapp.py +++ b/src/mailman/rest/wsgiapp.py @@ -216,11 +216,7 @@ class RootedAPI(API): @public def make_application(): - """Create the WSGI application. - - Use this if you want to integrate Mailman's REST server with your own WSGI - server. - """ + """Return a callable WSGI application object.""" return RootedAPI(Root()) View it on GitLab: https://gitlab.com/mailman/mailman/compare/03e04a93efa312bfec58dd267959d401e9bcf22b...a23f2cf7aa69ebdc08843db99a6a766bc7696797
_______________________________________________ Mailman-checkins mailing list Mailman-checkins@python.org Unsubscribe: https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org