title: Flask hello world using apache and mod_wsgi shows files in webroot only
body: <p>I'm attempting to run the basic hello.py from the flask site over apache2 using wsgi. Here is what my code looks like:</p>
  
  <p>/var/www/flask_dev/hello.py</p>
  
  <pre><code>from flask import Flask
  app = Flask(__name__)
  
  @app.route('/')
  def hello_world():
      return 'Hello World!'
  
  if __name__ == '__main__':
      app.run()
  </code></pre>
  
  <p>/var/www/flask_dev/start.wsgi</p>
  
  <pre><code>from hello import app as application
  
  import sys
  sys.stdout = sys.stderr
  </code></pre>
  
  <p>/etc/apache2/sites-available/flask_dev.conf</p>
  
  <pre><code>#Listen 80
  ServerName example.com
  
  &lt;VirtualHost *:80&gt;
      # The ServerName directive sets the request scheme, hostname and port that
      # the server uses to identify itself. This is used when creating
      # redirection URLs. In the context of virtual hosts, the ServerName
      # specifies what hostname must appear in the request's Host: header to
      # match this virtual host. For the default virtual host (this file) this
      # value is not decisive as it is used as a last resort host regardless.
      # However, you must set it for any further virtual host explicitly.
      #ServerName www.example.com
  
      ServerAdmin webmaster@localhost
      #ServerName example.com
  
      WSGIDaemonProcess hello user=&lt;myuser&gt; group=&lt;myusersgroup&gt; threads=5 python-path=/var/www/flask_dev
  
      WSGIScriptAlias / /var/www/flask_dev/start.wsgi
      &lt;Directory /var/www/flask_dev&gt;
             WSGIProcessGroup hello
             WSGIApplicationGroup %{GLOBAL}
             Order deny,allow
             Allow from all
      &lt;/Directory&gt;
  
      # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
      # error, crit, alert, emerg.
      # It is also possible to configure the loglevel for particular
      # modules, e.g.
      #LogLevel info ssl:warn
  
      ErrorLog ${APACHE_LOG_DIR}/error.log
      CustomLog ${APACHE_LOG_DIR}/access.log combined
  
      # For most configuration files from conf-available/, which are
      # enabled or disabled at a global level, it is possible to
      # include a line for only one particular virtual host. For example the
      # following line enables the CGI configuration for this host only
      # after it has been globally disabled with "a2disconf".
      #Include conf-available/serve-cgi-bin.conf
  &lt;/VirtualHost&gt;
  
  # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
  </code></pre>
  
  <p>/etc/hosts</p>
  
  <pre><code>127.0.0.1    example.com
  </code></pre>
  
  <p>After I run <code>sudo a2ensite flask_dev</code> and <code>sudo service apache2 reload (or restart)</code>, going to <code>www.example.com</code> just gives the files in the webroot. ~~I've checked the error log and it looks like mod_wsgi and mod_python are starting up. Does anyone know what else I'm missing?~~</p>
  
  <p><strong>Edit 1</strong>
  I'm now able to see messages from the error log, and it looks like I am affected by <a href="https://bugs.launchpad.net/ubuntu/+source/libapache2-mod-python/+bug/1073147">https://bugs.launchpad.net/ubuntu/+source/libapache2-mod-python/+bug/1073147</a> on Ubuntu 12.04.</p>
  
  <p>I will try recompiling later to the correct Python version to see if it fixes the error. For now, while this error occurs, I'm still seeing the files listed when I visit example.com.</p>
  
  <p>error.log</p>
  
  <pre><code>[Mon Jan 13 11:28:06 2014] [notice] caught SIGTERM, shutting down
  [Mon Jan 13 11:28:07 2014] [error] python_init: Python version mismatch, expected '2.7.2+', found '2.7.3'.
  [Mon Jan 13 11:28:07 2014] [error] python_init: Python executable found '/usr/bin/python'.
  [Mon Jan 13 11:28:07 2014] [error] python_init: Python path being used '/usr/lib/python2.7/:/usr/lib/python2.7/plat-linux2:/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/lib-old:/usr/lib/python2.7/lib-dynload'.
  [Mon Jan 13 11:28:07 2014] [notice] mod_python: Creating 8 session mutexes based on 6 max processes and 25 max threads.
  [Mon Jan 13 11:28:07 2014] [notice] mod_python: using mutex_directory /tmp 
  [Mon Jan 13 11:28:07 2014] [warn] mod_wsgi: Compiled for Python/2.7.2+.
  [Mon Jan 13 11:28:07 2014] [warn] mod_wsgi: Runtime using Python/2.7.3.
  [Mon Jan 13 11:28:07 2014] [notice] Apache/2.2.22 (Ubuntu) mod_python/3.3.1 Python/2.7.3 mod_wsgi/3.3 configured -- resuming normal operations
  </code></pre>
  
  <p><strong>Edit 2</strong> Updating to 13.04 has solved the version info. Now when I go to example.com I get a 403 forbidden error. When I tail the error.log I see:</p>
  
  <pre><code>[Mon Jan 13 21:03:41.464815 2014] [:error] [pid 10999:tid 3014634304] [client 127.0.0.1:35067] Attempt to invoke directory as WSGI application: /var/www/flask_dev/
  </code></pre>
  
  <p>I've tried adding <code>AddHandler cgi-script py</code> to my flask_dev.conf, but that doesn't seem to work either.</p>
  
  <p>Has anyone gotten this kind of error with a WSGI application before and know of a workaround for this?</p>
  
  <p>Thanks in advance.</p>
  
  <p><strong>Edit 3</strong>
  All source code works now</p>