<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <link>http://mikewatkins.ca/tags/wsgi/</link>
  <atom:link href="http://mikewatkins.ca/tags/wsgi/feeds/rss" type="application/rss+xml" rel="self"/>
  <lastBuildDate>Wed, 21 Jan 2009 19:59:32 GMT</lastBuildDate>
  <title>mike watkins dot ca</title>
  <description>XML Feed for mike watkins dot ca</description>
  <language>en</language>
  <generator>Parlez/0.1</generator>
<item>
  <title>QP and WSGI</title>
  <link>http://mikewatkins.ca/2009/01/21/qp-and-wsgi/</link>
  <description><![CDATA[
<div class="document">
<p>QP doesn't use WSGI itself in the operation of its own built-in web and SCGI
servers, but the framework does make it easy to drive QP applications via
WSGI if you have a need to. Here's a quick how-to.</p>
<p>Exposing the QP application as a WSGI app is simple. Create a driver file
(let's name it <tt class="docutils literal"><span class="pre">runwsgi.py</span></tt>) and place it in your Python path. Myself I prefer to put such files in my QP application's &quot;site&quot; directory.</p>
<div class="highlight"><pre><span class="c"># this is runwsgi.py</span>
<span class="kn">from</span> <span class="nn">qp.lib.site</span> <span class="kn">import</span> <span class="n">Site</span>
<span class="n">site</span> <span class="o">=</span> <span class="n">Site</span><span class="p">(</span><span class="s">&#39;songs&#39;</span><span class="p">)</span>
<span class="n">application</span> <span class="o">=</span> <span class="n">site</span><span class="o">.</span><span class="n">get_publisher</span><span class="p">()</span>
</pre></div>
<p>You can then run a WSGI server (such as <tt class="docutils literal"><span class="pre">Spawning</span></tt>) from the command line:</p>
<pre class="literal-block">
% spawn -t 0 -p 8000 qp.sites.songs.runwsgi.application
</pre>
<p>Or we can extend <tt class="docutils literal"><span class="pre">runwsgi.py</span></tt> to <em>also</em> provide a self-contained WSGI server:</p>
<div class="highlight"><pre><span class="c">#! /usr/bin/env python</span>
<span class="c"># this is runwsgi.py</span>
<span class="kn">from</span> <span class="nn">qp.lib.site</span> <span class="kn">import</span> <span class="n">Site</span>
<span class="n">site</span> <span class="o">=</span> <span class="n">Site</span><span class="p">(</span><span class="s">&#39;songs&#39;</span><span class="p">)</span>
<span class="n">application</span> <span class="o">=</span> <span class="n">site</span><span class="o">.</span><span class="n">get_publisher</span><span class="p">()</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="kn">from</span> <span class="nn">wsgiref.simple_server</span> <span class="kn">import</span> <span class="n">make_server</span>
    <span class="n">host</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">site</span><span class="o">.</span><span class="n">get_http_address</span><span class="p">()</span>
    <span class="n">httpd</span> <span class="o">=</span> <span class="n">make_server</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">application</span><span class="p">)</span>
    <span class="n">hp</span> <span class="o">=</span> <span class="n">httpd</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">getsockname</span><span class="p">()</span>
    <span class="k">print</span><span class="p">(</span><span class="s">&quot;Serving HTTP on </span><span class="si">%s</span><span class="s"> port </span><span class="si">%d</span><span class="s">...&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">hp</span><span class="p">[</span><span class="mf">0</span><span class="p">],</span> <span class="n">hp</span><span class="p">[</span><span class="mf">1</span><span class="p">]))</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">httpd</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span>
    <span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">Stopping server(s)&quot;</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">site</span><span class="o">.</span><span class="n">is_durus_running</span><span class="p">():</span>
            <span class="n">site</span><span class="o">.</span><span class="n">stop_durus</span><span class="p">()</span>
</pre></div>
<p>We can execute this directly; the application will use the same host and port
defined in our application's configuration.</p>
<div class="highlight"><pre>% ./runwsgi.py
</pre></div>
<div class="admonition-python-3-compatibility admonition">
<p class="first admonition-title">Python 3 Compatibility</p>
<p>In keeping with my blog's objective of only publishing examples that are compatible with both Python 2.x and 3.x, I need to point out that the QP code presented certainly will run on Python 3.0 but the wsgi servers (spawning and the reference WSGI server) noted will not.</p>
<p class="last">While QP and the rest of its stack is compatible with Python &gt;= 2.4 (yes, that means Python 3.x too), the reference implementation of WSGI supplied with Python 3.0 is broken. As far as I know the only working WSGI server implementation for Python 3 at present is <tt class="docutils literal"><span class="pre">mod_wsgi</span></tt>, <a class="reference external" href="http://code.google.com/p/modwsgi/">available for Apache here</a>.</p>
</div>
</div>

]]></description>
  <guid isPermaLink="false">tag:mikewatkins.ca,2007-10-10:journal:mw:entry:689</guid>
  <pubDate>Wed, 21 Jan 2009 19:59:32 GMT</pubDate>
  <category>python</category>
  <category>qp</category>
  <category>wsgi</category>
  <category>tutorial</category>
</item>
</channel></rss>
