1.1 --- a/docs/anatomy.html Tue Apr 19 22:32:46 2005 +0000
1.2 +++ b/docs/anatomy.html Sun Apr 24 15:43:10 2005 +0000
1.3 @@ -34,13 +34,11 @@
1.4 style="text-align: center; vertical-align: middle; background-color: rgb(193, 255, 102); border-top-style: solid; border-left-style: solid; border-right-style: solid; border-top-width: 1px; border-left-width: 1px; border-right-width: 1px;">Application
1.5 </th>
1.6 <td style="text-align: center;"><span class="explanation">This
1.7 -defines what the user sees.
1.8 - </span></td>
1.9 +defines what the user sees. </span></td>
1.10 <td align="center" valign="undefined">Most new code will be
1.11 written in the application.</td>
1.12 - <td align="center" valign="undefined">The application is
1.13 -described in
1.14 - <a href="resources.html">this part of the documentation</a>.</td>
1.15 + <td align="center" valign="undefined">Applications are
1.16 +described in <a href="resources.html">this part of the documentation</a>.</td>
1.17 </tr>
1.18 <tr>
1.19 <th
1.20 @@ -52,8 +50,7 @@
1.21 adapter or writing a short module.</td>
1.22 <td align="center" valign="undefined">Adapters are explained in
1.23 the <a href="deploying.html">deployment
1.24 -documentation</a>.
1.25 - </td>
1.26 +documentation</a>. </td>
1.27 </tr>
1.28 <tr>
1.29 <th
1.30 @@ -66,8 +63,7 @@
1.31 <td align="center" valign="undefined">Server environments are
1.32 covered
1.33 in the <a href="deploying.html">deployment
1.34 -documentation</a>.
1.35 - </td>
1.36 +documentation</a>. </td>
1.37 </tr>
1.38 </tbody>
1.39 </table>
2.1 --- a/docs/deploying.html Tue Apr 19 22:32:46 2005 +0000
2.2 +++ b/docs/deploying.html Sun Apr 24 15:43:10 2005 +0000
2.3 @@ -18,73 +18,23 @@
2.4 <p>What adapter or "glue" code does is to set up your applications main
2.5 resource object and to hook that object up with the underlying server
2.6 environment. For the <code>MyApplication</code> <a
2.7 - href="resources.html">example</a> it typically looks something like
2.8 + href="resources.html">example</a>, together with a simple environment,
2.9 +looks something like
2.10 this:</p>
2.11 -<pre>from WebStack.Adapters.BaseHTTPRequestHandler import deploy # import the support for the server environment<br />from MyApplication import MyResource # import the main resource class<br />deploy(MyResource()) # connect a resource object to the server environment</pre>
2.12 +<pre>from WebStack.Adapters.BaseHTTPRequestHandler import deploy # import the support for the server environment<br />from MyApplication import MyResource # import the main resource class<br />print "Serving..."<br />deploy(MyResource()) # connect a resource object to the server environment</pre>
2.13 <p>In the case of BaseHTTPRequestHandler, which is a module in the
2.14 Python standard library, you can just run this code, making sure that
2.15 the <code>MyApplication</code> module or package is on your <code>PYTHONPATH</code>.
2.16 Then, you can visit <code>http://localhost:8080</code> in your
2.17 browser and see the result.</p>
2.18 -<h2>More Demanding Adapter Code</h2>
2.19 +<h3>More Demanding Adapter Code</h3>
2.20 <p>Unfortunately, not all server environments can be connected up with
2.21 applications this easily. Some environments require special classes and
2.22 -functions to be defined in the adapter code in order for the
2.23 +functions to be defined in the adapter code in order for
2.24 applications to
2.25 -be properly integrated into the environments. Here is a summary which
2.26 -indicates the server environments or frameworks which need most work:</p>
2.27 -<table border="1" cellpadding="5" cellspacing="0">
2.28 - <tbody>
2.29 - <tr>
2.30 - <th>Framework</th>
2.31 - <th>Adapter Code Requirements</th>
2.32 - <th>Deployment Process</th>
2.33 - </tr>
2.34 - <tr>
2.35 - <td>BaseHTTPRequestHandler</td>
2.36 - <td>Simple - see above</td>
2.37 - <td>Run the adapter code directly</td>
2.38 - </tr>
2.39 - <tr>
2.40 - <td>CGI</td>
2.41 - <td>Simple - see above</td>
2.42 - <td>Web server runs the adapter code</td>
2.43 - </tr>
2.44 - <tr>
2.45 - <td>Java Servlet</td>
2.46 - <td>Must subclass <code>HttpServlet</code></td>
2.47 - <td>Application must be deployed using supplied tools</td>
2.48 - </tr>
2.49 - <tr>
2.50 - <td>mod_python</td>
2.51 - <td>Must implement <code>handler</code> function</td>
2.52 - <td>Web server runs the adapter code (which must be declared
2.53 -within Apache)</td>
2.54 - </tr>
2.55 - <tr>
2.56 - <td>Twisted</td>
2.57 - <td>Simple - see above</td>
2.58 - <td>Run the adapter code directly</td>
2.59 - </tr>
2.60 - <tr>
2.61 - <td>Webware</td>
2.62 - <td><= 0.8.1: Must implement <code>InstallInWebKit</code>
2.63 -function<br />
2.64 -> 0.8.1: Simple, but must provide a <code>urlParser</code> object</td>
2.65 - <td>Application must be deployed within WebKit</td>
2.66 - </tr>
2.67 - <tr>
2.68 - <td>WSGI</td>
2.69 - <td>Simple - see above</td>
2.70 - <td>Web server runs the adapter code</td>
2.71 - </tr>
2.72 - <tr>
2.73 - <td>Zope</td>
2.74 - <td>Must provide lots of Zope administative classes and functions</td>
2.75 - <td>Application must be deployed within Zope</td>
2.76 - </tr>
2.77 - </tbody>
2.78 -</table>
2.79 +be properly integrated into those environments. A summary of the
2.80 +requirements of each environment can be found in <a
2.81 + href="writing-adapters.html">"Writing Adapters"</a>.</p>
2.82 <h2>The Deployment Process</h2>
2.83 <ul>
2.84 <li><a href="writing-adapters.html">Writing Adapters</a></li>
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3.2 +++ b/docs/design.html Sun Apr 24 15:43:10 2005 +0000
3.3 @@ -0,0 +1,26 @@
3.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3.5 +<html xmlns="http://www.w3.org/1999/xhtml">
3.6 +<head>
3.7 + <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type" />
3.8 + <title>Application Design Considerations</title>
3.9 + <meta name="generator"
3.10 + content="amaya 8.1a, see http://www.w3.org/Amaya/" />
3.11 + <link href="styles.css" rel="stylesheet" type="text/css" />
3.12 +</head>
3.13 +<body>
3.14 +<h1>Application Design Considerations</h1>
3.15 +<p>When writing an application, we
3.16 +must consider a number of factors which
3.17 +have an impact on the code (and other things) that we will need to
3.18 +provide as
3.19 +part of the finished product or service.</p>
3.20 +<ul>
3.21 + <li><a href="paths.html">URLs and Paths</a></li>
3.22 + <li><a href="methods.html">Request Methods</a></li>
3.23 + <li><a href="parameters.html">Request Parameters and Uploads</a></li>
3.24 + <li><a href="responses.html">Responses and Presentation</a></li>
3.25 + <li><a href="state.html">Cookies, Sessions and Persistent
3.26 +Information</a></li>
3.27 +</ul>
3.28 +</body>
3.29 +</html>
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
4.2 +++ b/docs/resource-creation.html Sun Apr 24 15:43:10 2005 +0000
4.3 @@ -0,0 +1,82 @@
4.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4.5 +<html xmlns="http://www.w3.org/1999/xhtml">
4.6 +<head>
4.7 + <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type" />
4.8 + <title>How Resources are Created</title>
4.9 + <meta name="generator"
4.10 + content="amaya 8.1a, see http://www.w3.org/Amaya/" />
4.11 + <link href="styles.css" rel="stylesheet" type="text/css" />
4.12 +</head>
4.13 +<body>
4.14 +<h1>How Resources are Created
4.15 +</h1>
4.16 +<p>In the <code>MyApplication</code>
4.17 +<a href="resources.html">example</a>,
4.18 +the only
4.19 +thing we need to
4.20 +consider is
4.21 +what our code does, not how objects are created from the <code>MyResource</code>
4.22 +class and how the <code>respond</code>
4.23 +method is invoked. However, the mechanisms behind all these things are
4.24 +not magic - the <a href="deploying.html">adapter
4.25 +code</a> is responsible for all of
4.26 +this. Let us
4.27 +turn the diagram of components on its side and investigate what happens
4.28 +when a request is sent to the application from a user:</p>
4.29 +<table class="layers"
4.30 + style="width: 80%; text-align: left; margin-left: auto; margin-right: auto;"
4.31 + border="0" cellpadding="5" cellspacing="0">
4.32 + <tbody>
4.33 + <tr>
4.34 + <th
4.35 + style="border-width: 1px 1px 0px; text-align: center; vertical-align: middle; background-color: rgb(192, 192, 192); width: 30%; border-top-style: solid; border-left-style: solid;">Server
4.36 +environment</th>
4.37 + <th
4.38 + style="border-width: 1px; text-align: center; vertical-align: middle; border-left-style: solid; border-top-style: solid; width: 30%; background-color: rgb(102, 203, 255);">Adapter
4.39 + </th>
4.40 + <th
4.41 + style="text-align: center; vertical-align: middle; border-top-style: solid; border-left-style: solid; border-right-style: solid; border-top-width: 1px; border-left-width: 1px; border-right-width: 1px; background-color: rgb(193, 255, 102); width: 40%;">Application
4.42 + </th>
4.43 + </tr>
4.44 + <tr>
4.45 + <td
4.46 + style="background-color: rgb(192, 192, 192); border-left-style: solid; border-left-width: 1px;"
4.47 + align="undefined" valign="undefined"><span class="method">The request
4.48 +is received and sent to
4.49 +the adapter... </span></td>
4.50 + <td
4.51 + style="background-color: rgb(102, 203, 255); border-left-style: solid; border-left-width: 1px;"
4.52 + align="undefined" valign="undefined"><span class="method">The adapter
4.53 +creates a resource object
4.54 +in the application... </span></td>
4.55 + <td
4.56 + style="background-color: rgb(193, 255, 102); border-left-style: solid; border-right-style: solid; border-left-width: 1px; border-right-width: 1px;"
4.57 + align="undefined" valign="undefined"><span class="method">A resource
4.58 +object is
4.59 +created and initialised. </span></td>
4.60 + </tr>
4.61 + <tr>
4.62 + <td
4.63 + style="background-color: rgb(192, 192, 192); border-left-style: solid; border-bottom-style: solid; border-left-width: 1px; border-right-width: 1px; border-bottom-width: 1px;"><br />
4.64 + </td>
4.65 + <td
4.66 + style="background-color: rgb(102, 203, 255); border-left-style: solid; border-bottom-style: solid; border-left-width: 1px; border-bottom-width: 1px;"
4.67 + align="undefined" valign="undefined"><span class="method">The adapter
4.68 +calls the <code>respond</code> method on the new resource...</span></td>
4.69 + <td
4.70 + style="background-color: rgb(193, 255, 102); border-left-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-width: 1px; border-right-width: 1px; border-bottom-width: 1px;"
4.71 + align="undefined" valign="undefined"><span class="method">The code
4.72 +within the resource's <code>respond</code> method is executed. </span></td>
4.73 + </tr>
4.74 + </tbody>
4.75 +</table>
4.76 +<p>In more
4.77 +complicated applications, there may
4.78 +be a
4.79 +need to create our own resource objects explicitly, but this is not
4.80 +particularly interesting to think about at this point - see <a
4.81 + href="paths-filesystem.html">"Treating the Path Like
4.82 +a Filesystem"</a> for a
4.83 +discussion of multiple resource objects.</p>
4.84 +</body>
4.85 +</html>
5.1 --- a/docs/resources.html Tue Apr 19 22:32:46 2005 +0000
5.2 +++ b/docs/resources.html Sun Apr 24 15:43:10 2005 +0000
5.3 @@ -10,62 +10,72 @@
5.4 <body>
5.5 <h1>Applications and Resources</h1>
5.6 At its simplest a WebStack application is just a single Python
5.7 -class that we call a "resource". We can either create a module file <code>MyApplication.py</code>
5.8 -(for example) or a
5.9 -package directory <code>MyApplication</code> (for example) containing
5.10 -a module file <code>__init__.py</code>, and we write into that file a
5.11 -definition
5.12 -of the resource as follows:
5.13 -<pre>class MyResource:<br /> def respond(self, trans):<br /> [Examine the transaction, decide what the user wants to do.]<br /> [Perform some kind of action with the information supplied.]<br /> [Produce some kind of response which tells the user what happened.]</pre>
5.14 -<p>It is in this kind of resource class that we write the
5.15 +class that we call a "resource". This class can be defined inside a
5.16 +normal Python module or package, so let us start by doing the following:<br />
5.17 +<ol>
5.18 + <li>Create a new directory for
5.19 +our application; choose any name since we just want an empty space in
5.20 +which to put new files.</li>
5.21 + <li>Create a file called <code>MyApplication.py</code>
5.22 +- this is our module.</li>
5.23 +</ol>
5.24 +We are going to call our resource <code>MyResource</code>
5.25 +and in principle it will have a structure that looks like this:
5.26 +<pre>class MyResource:<br /> def respond(self, trans):<br /> [Examine the transaction, decide what the user wants to do.]<br /> [Perform some kind of action with the information supplied.]<br /> [Produce some kind of response which tells the user what happened.]</pre>
5.27 +<p>It is in this kind of resource
5.28 +class that we write the
5.29 actual application code or at least the beginnings of it. When a user
5.30 of the application sends us a request,
5.31 -the <code>respond</code> method will be called and the code
5.32 +the <code>respond</code> method
5.33 +will be called and the code
5.34 within it executed. The parts of the pseudo-code in
5.35 the above text which aren't valid Python
5.36 -(ie. the bits in square brackets) will use the <code>trans</code>
5.37 +(ie. the bits in square brackets) will, when we have written them, use
5.38 +the <code>trans</code>
5.39 object to find out what any given user of the application has sent us,
5.40 and to send information back
5.41 to the
5.42 user in response.</p>
5.43 <h2>Starting Simple</h2>
5.44 -<p>The simplest way to turn this into a working application is to
5.45 +<p>The simplest way to turn this
5.46 +into a working application is to
5.47 ignore the first two activities mentioned in the pseudo-code and just
5.48 to produce some kind of
5.49 -response. Here is how we might do that (in our module file <code>MyApplication.py</code>
5.50 -or <code>MyApplication/__init__.py</code>):</p>
5.51 +response. Here is how we can make our application do something:</p>
5.52 +<ol>
5.53 + <li>Edit the module
5.54 +file <code>MyApplication.py</code>.</li>
5.55 + <li>Write into it the following
5.56 +code which defines <code>MyResource</code>:</li>
5.57 +</ol>
5.58 <pre>class MyResource:<br /> def respond(self, trans):<br /> out = trans.get_response_stream()<br /> print >>out, "Hello world."</pre>
5.59 -<p>To deploy this, we need an adapter - see <a href="deploying.html">"Deploying
5.60 -a WebStack Application"</a> for something which will work with this
5.61 -example.
5.62 -</p>
5.63 -<h2>How Resources are Created
5.64 -</h2>
5.65 -<p>In the above example, the only thing we need to
5.66 -consider is
5.67 -what our code does, not how resource objects are created and invoked
5.68 -(that is
5.69 -done in the <a href="deploying.html">adapter code</a>). In more
5.70 -complicated applications, there may
5.71 -be a
5.72 -need to create our own resource objects explicitly, but this is not
5.73 -particularly interesting to think about at this point - see <a
5.74 - href="paths-filesystem.html">"Treating the Path Like
5.75 -a Filesystem"</a> for a
5.76 -discussion of multiple resource objects.</p>
5.77 -<h2>Design Considerations</h2>
5.78 -<p>When writing an application, we
5.79 -must consider a number of factors which
5.80 -have an impact on the code (and other things) that we will need to
5.81 -provide as
5.82 -part of the finished product or service.</p>
5.83 +<h2>Testing the Resource</h2>
5.84 +<p>To test this resource we need to deploy it, and to do that we need
5.85 +an
5.86 +adapter. Here is a quick way of writing an adapter and testing this
5.87 +code:</p>
5.88 +<ol>
5.89 + <li> Create a file called <code>MyAdapter.py</code> - you
5.90 +can choose another name if you want - this will be where the adapter
5.91 +code lives.</li>
5.92 + <li>Copy the example adapter in <a href="deploying.html">"Deploying
5.93 +a WebStack Application"</a> and write it into <code>MyAdapter.py</code>.</li>
5.94 + <li>Now, with two files in your directory, <code>MyApplication.py</code>
5.95 +and <code>MyAdapter.py</code>, you may run <code>MyAdapter.py</code>
5.96 +as follows:</li>
5.97 +</ol>
5.98 +<pre>python MyAdapter.py</pre>
5.99 +<p>This should start the adapter program and print the following
5.100 +message:</p>
5.101 +<pre>Serving...</pre>
5.102 +<p>You should now be able to visit <code>http://localhost:8080</code>
5.103 +in your
5.104 +browser and see the message printed by your application:</p>
5.105 +<pre>Hello world.</pre>
5.106 +<h2>About Resources</h2>
5.107 <ul>
5.108 - <li><a href="paths.html">URLs and Paths</a></li>
5.109 - <li><a href="methods.html">Request Methods</a></li>
5.110 - <li><a href="parameters.html">Request Parameters and Uploads</a></li>
5.111 - <li><a href="responses.html">Responses and Presentation</a></li>
5.112 - <li><a href="state.html">Cookies, Sessions and Persistent
5.113 -Information</a></li>
5.114 + <li><a href="resource-creation.html">How Resources are Created</a></li>
5.115 + <li><a href="design.html">Application Design Considerations</a></li>
5.116 </ul>
5.117 </body>
5.118 </html>
6.1 --- a/docs/styles.css Tue Apr 19 22:32:46 2005 +0000
6.2 +++ b/docs/styles.css Sun Apr 24 15:43:10 2005 +0000
6.3 @@ -57,3 +57,14 @@
6.4 text-align: center;
6.5 }
6.6
6.7 + .method { border-style: dotted;
6.8 + border-width: 1px;
6.9 + padding: 0.25em;
6.10 + font-weight: normal;
6.11 + display: block;
6.12 + position: relative;
6.13 + background-color: rgb(238, 238, 238);
6.14 + left: 1em;
6.15 + top: 1em;
6.16 + }
6.17 +
7.1 --- a/docs/writing-adapters.html Tue Apr 19 22:32:46 2005 +0000
7.2 +++ b/docs/writing-adapters.html Sun Apr 24 15:43:10 2005 +0000
7.3 @@ -1,36 +1,29 @@
7.4 -<?xml version="1.0" encoding="iso-8859-1"?>
7.5 -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
7.6 - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
7.7 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
7.8 <html xmlns="http://www.w3.org/1999/xhtml">
7.9 <head>
7.10 <title>Writing Adapters</title>
7.11 - <meta name="generator" content="amaya 8.1a, see http://www.w3.org/Amaya/" />
7.12 + <meta name="generator"
7.13 + content="amaya 8.1a, see http://www.w3.org/Amaya/" />
7.14 <link href="styles.css" rel="stylesheet" type="text/css" />
7.15 </head>
7.16 -
7.17 <body>
7.18 <h1>Writing Adapters</h1>
7.19 -
7.20 -<p>Depending on how "simple" the adapter code is allowed to be for a given
7.21 -server environment (see the <a href="deploying.html">table</a> for a
7.22 +<p>Depending on how "simple" the adapter code is allowed to be for a
7.23 +given
7.24 +server environment (see the <a href="#table">table</a> for a
7.25 summary), you will either need to write a small piece of code which
7.26 -initialises and deploys your application, or to produce a more complicated
7.27 +initialises and deploys your application, or to produce a more
7.28 +complicated
7.29 piece of code which satisfies some more demanding server requirements.</p>
7.30 -
7.31 <h2>Simple Adapters - Using the deploy Function</h2>
7.32 -
7.33 -<p>When deploying an application, it is possible to use a one-shot deployment
7.34 +<p>When deploying an application, it is possible to use a one-shot
7.35 +deployment
7.36 function for BaseHTTPRequestServer, CGI, Twisted and WSGI. The
7.37 <code>deploy</code> function is called as follows:</p>
7.38 -<pre>deploy(resource)
7.39 -deploy(resource, authenticator) # where authenticators are used</pre>
7.40 -
7.41 +<pre>deploy(resource)<br />deploy(resource, authenticator) # where authenticators are used</pre>
7.42 <p>For some frameworks, an address may be specified:</p>
7.43 -<pre>deploy(resource, address=(host_string, port_integer))
7.44 -deploy(resource, authenticator, address=(host_string, port_integer))</pre>
7.45 -
7.46 +<pre>deploy(resource, address=(host_string, port_integer))<br />deploy(resource, authenticator, address=(host_string, port_integer))</pre>
7.47 <p>Here is a summary of which frameworks require address information:</p>
7.48 -
7.49 <table border="1" cellpadding="5" cellspacing="0">
7.50 <tbody>
7.51 <tr>
7.52 @@ -55,13 +48,72 @@
7.53 </tr>
7.54 </tbody>
7.55 </table>
7.56 -
7.57 -<h2>Complicated Adapters - Providing Framework-Specific Objects</h2>
7.58 -
7.59 -<p>The remaining frameworks (Java Servlet, mod_python, Webware and Zope) do
7.60 -not support the <code>deploy</code> function due to the way applications are
7.61 -typically integrated into the various server mechanisms. In these cases, it
7.62 -may be worth investigating the examples provided and using their adapter code
7.63 -as a template for the code for your own applications.</p>
7.64 +<h2><a name="table" />Complicated Adapters - Providing
7.65 +Framework-Specific Objects</h2>
7.66 +<p>The remaining frameworks (Java Servlet, mod_python, Webware and
7.67 +Zope) do
7.68 +not support the <code>deploy</code> function due to the way
7.69 +applications are
7.70 +typically integrated into the various server mechanisms. In these
7.71 +cases, it
7.72 +may be worth investigating the examples provided and using their
7.73 +adapter code
7.74 +as a template for the code for your own applications. Here is a summary
7.75 +which
7.76 +indicates the server environments or frameworks which need most work:</p>
7.77 +<table border="1" cellpadding="5" cellspacing="0">
7.78 + <tbody>
7.79 + <tr>
7.80 + <th>Framework</th>
7.81 + <th>Adapter Code Requirements</th>
7.82 + <th>Deployment Process</th>
7.83 + </tr>
7.84 + <tr>
7.85 + <td>BaseHTTPRequestHandler</td>
7.86 + <td>Simple - see above</td>
7.87 + <td>Run the adapter code directly</td>
7.88 + </tr>
7.89 + <tr>
7.90 + <td>CGI</td>
7.91 + <td>Simple - see above</td>
7.92 + <td>Web server runs the adapter code</td>
7.93 + </tr>
7.94 + <tr>
7.95 + <td>Java Servlet</td>
7.96 + <td>Must subclass <code>HttpServlet</code></td>
7.97 + <td>Application must be deployed using supplied tools</td>
7.98 + </tr>
7.99 + <tr>
7.100 + <td>mod_python</td>
7.101 + <td>Must implement <code>handler</code> function</td>
7.102 + <td>Web server runs the adapter code (which must be declared
7.103 +within Apache)</td>
7.104 + </tr>
7.105 + <tr>
7.106 + <td>Twisted</td>
7.107 + <td>Simple - see above</td>
7.108 + <td>Run the adapter code directly</td>
7.109 + </tr>
7.110 + <tr>
7.111 + <td>Webware</td>
7.112 + <td><= 0.8.1: Must implement <code>InstallInWebKit</code>
7.113 +function<br />
7.114 +> 0.8.1: Simple, but must provide a <code>urlParser</code> object</td>
7.115 + <td>Application must be deployed within WebKit</td>
7.116 + </tr>
7.117 + <tr>
7.118 + <td>WSGI</td>
7.119 + <td>Simple - see above</td>
7.120 + <td>Web server runs the adapter code</td>
7.121 + </tr>
7.122 + <tr>
7.123 + <td>Zope</td>
7.124 + <td>Must provide lots of Zope administative classes and functions</td>
7.125 + <td>Application must be deployed within Zope</td>
7.126 + </tr>
7.127 + </tbody>
7.128 +</table>
7.129 +<p>See <a href="deploying-applications.html">"Deploying an Application"</a>
7.130 +for more details of the deployment process for each environment.</p>
7.131 </body>
7.132 </html>