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

Reply via email to