diff options
| author | ianb <devnull@localhost> | 2005-04-22 03:21:08 +0000 |
|---|---|---|
| committer | ianb <devnull@localhost> | 2005-04-22 03:21:08 +0000 |
| commit | 53795f8ce0212cae100d983edd837d0496ca9c1e (patch) | |
| tree | 48f666a4b7f71d6577dd0017d4b45d05d8cac0c2 /docs/Paste.txt | |
| parent | 36593a8d40cd1417d2927a78cdbe621090b6e8a5 (diff) | |
| download | paste-53795f8ce0212cae100d983edd837d0496ca9c1e.tar.gz | |
Renamed doc
Diffstat (limited to 'docs/Paste.txt')
| -rw-r--r-- | docs/Paste.txt | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/docs/Paste.txt b/docs/Paste.txt new file mode 100644 index 0000000..e822215 --- /dev/null +++ b/docs/Paste.txt @@ -0,0 +1,232 @@ +Python Paste +============ + +This is a WSGI_ version of WebKit. In addition to supporting WSGI, it +also is a simplification and refactoring of Webware. + +.. _WSGI: http://www.python.org/peps/pep-0333.html + +License +------- + +Paste is distributed under the `Python Software Foundation`__ +license. This is a BSD/MIT-style license. + +.. __: http://www.python.org/psf/license.html + +Quick Start +----------- + +First, grab WSGIUtils, at http://www.owlfish.com/software/wsgiutils/, +or download it directly from +http://www.owlfish.com/software/wsgiutils/downloads/WSGI%20Utils-0.5.tar.gz + +You can use other servers with Paste, but WSGIUtils is pretty easy +and built on SimpleHTTPServer. Run ``python setup.py install`` to +install it. + +Right now it's best NOT to install Paste with ``setup.py``, but just +to run it out of the checkout. An easy way to do that:: + + ./scripts/app-setup create webkit_zpt /path/to/put/files + cd /path/to/put/files + /path/to/paste/scripts/server -v + +And it will be running a server on http://localhost:8080/ + +Compatibility +------------- + +This system is intended to be largely compatible with current Webware +applications. This is only an intention; use with real-world +applications will help us refine this compatibility. + +Some parts that aren't being brought over: + +* Configuration. Right now configuration is a little inconsistent. + +* Contexts. These were half-formed in Webware, and didn't really + provide much benefit. There are much more general and useful ways + to deal with URLs. + +* URL introspection. I tried to get some of it, but there's way too + many ways of refactoring the URL in Webware, and I didn't deal with + all of them. The environment (``request.environ()``) may look + different than in Webware -- it matches the WSGI expectations. It's + certainly possible -- and hopefully clearer -- to do introspection + in Paste, but it might not be backward compatible (but still file + bugs if you find problems). + +Discussion +---------- + +Discussion should take place on the Webware mailing list, +webware-discuss@lists.sf.net and webware-devel@list.sf.net + +Configuration +------------- + +Configuration is done with normal Python files. Global variables +become configuration values. So a configuration file might look +like:: + + host = 'localhost' + port = 8080 + webkit_dir = '/path/to/dir' + database_name = 'app_data' + +And so on. There's a default configuration file in +``paste/default_config.conf`` which will also serve as +documentation. Your configuration overrides those values. The +extension is arbitrary at this point. + +Some important configuration values: + +``config_file``: + Load the given configuration file. + +``server``: + The (string) name of the server you want to use. Right now there + is ``"wsgiutils"`` and ``"twisted"``. + +``webkit_dir``: + The base directory to find Webware servlets. (In the future other + frameworks will also be supported.) + +``debug``: + If true, then errors will be displayed in the browser. + +``reload``: + If true, then we'll monitor for any changed modules and restart + the server if those are found. + +``verbose``: + If true, talk a lot. + +Use +--- + +These are some manual ways to set up a WSGI server, but +``scripts/server`` is the easiest. + +This script takes takes options that turn into configuration +parameters. If there's a ``port`` configuration value you can also +use the ``--port=X`` command-line option. ``-`` is also replaced with +``_``. + +Another option is ``-f config_file.conf`` which loads the given +configuration file. This might be the only option you need, if you +put all the other settings in the configuration file. + +Note that ``--verbose``, ``--reload`` and ``--debug`` do not require +an argument. + +Multiple Applications / Manual Setup +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Right now integration of multiple applications into a single server is +kind of an unsolved problem, but manual application setup would be the +way to go about it... + +CGI +~~~ + +The ``cgiserver`` script is included. It's not particularly good, +but it's there for you. To use it, you'll set up your own CGI script, +like:: + + #!/usr/bin/env python + # maybe import sys and modify sys.path + from paste import cgiserver + from paste.webkit import wsgiwebkit + app = wsgiwebkit.webkit('/path/to/app') + cgiserver.run_with_cgi(app) + +Twisted +~~~~~~~ + +This package includes ``twisted_wsgi``, which is a WSGI adapter +written by Peter Hunt. The canonical location for this file is: +http://st0rm.hopto.org:8080/wsgi/ (note -- Twisted 2.0 will include +native WSGI support; there's been reports of bugs in the version we +are currently shipping). + +This is closer to the normal Webware environment than CGI. To set up +this server use:: + + #!/usr/bin/env python + # maybe import sys and modify sys.path + from paste import twisted_wsgi + from paste.webkit import wsgiwebkit + app = wsgiwebkit.webkit('/path/to/app') + twisted_wsgi.serve_application(app, 8080) + +Note, the twisted server is dependent on wsgiref which can be found at +http://cvs.eby-sarna.com/wsgiref + + +Multi-threaded +~~~~~~~~~~~~~~ + +WSGIUtils_ includes a SimpleHTTPServer_-based multi-threaded server. +This is an architecture very similar to Webware's AppServer. Twisted +may be the better approach, but who knows? + +.. _WSGIUtils: http://www.owlfish.com/software/wsgiutils/ +.. _SimpleHTTPServer: http://python.org/doc/current/lib/module-SimpleHTTPServer.html + +To set up this server use:: + + #!/usr/bin/env python + from wsgiutils import wsgiServer + from paste.webkit import wsgiwebkit + app_root='/path/to/app' + app = wsgiwebkit.webkit(app_root) + server = wsgiServer.WSGIServer(('127.0.0.1', 8080), {'/': app}) + server.serve_forever() + +Interactive +~~~~~~~~~~~ + +This allows you to test an application without running any web server. +While you can use this several ways (e.g., for acceptance tests), this +is a simple way:: + + #!/usr/bin/env python + # maybe import sys and modify sys.path + from paste import wsgilib + from paste.webkit import wsgiwebkit + app = wsgiwebkit.webkit('/path/to/app') + def run(url): + print wsgilib.interactive(application, url) + if __name__ == '__main__': + import sys + url = sys.argv[1] + run(url) + +Then you run this script with the URL you want to access; the headers +and page will be printed out. This can also be used at the +interactive prompt, e.g., ``python -i interactiveapp.py``, and you can +use pdb_ or other debugging tools with this. + +.. _pdb: http://python.org/doc/current/lib/module-pdb.html + +Comparison of architectures +--------------------------- + +WSGI WebKit's implementation of ``Page`` (and ``HTTPServlet``) +implements a ``__call__`` method, which is all that is required to +make a servlet into a WSGI application. The __call__ method creates +the transaction (``wktransaction.Transaction``), which in turn creates +the request (``wkrequest.HTTPRequest``) and response +(``wkresponse.HTTPResponse``). Then there's a bit of back-and-forth + +There are also session and application objects, which are largely +dummy objects that provide some of the interface that was previously +implemented by those objects. In WSGI WebKit these features +(forwarding and sessions) are implemented in middleware. + +This is in contrast to normal Webware, where the ``AppServer`` starts +the connection, hands it off to ``Application``, which creates +``Transaction``, ``HTTPRequest``, and ``HTTPResponse``, then finds the +servlet and runs it with those objects. |
