13

I'm trying to get Python working with Apache, however I'm failing to have success with either CGI or mod_python.

Does anyone know a good tutorial or something?

Thanks.

1 Answer 1

17

mod_python is basically non-maintained - you should look into mod_wsgi. Install the package libapache2-mod-wsgi, then issue sudo a2enmod wsgi to enable it.

Just as a quick example to get it running, stuff something like this in your /etc/apache2/sites-enabled/default:

WSGIScriptAlias /test /path/to/python/file.py

And in the file /path/to/python/file.py:

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return "Hello World"

After re-starting Apache2, any request to /test will turn into a call of application() in your python file.

For further reading, look into WSGI (WebServer Gateway Interface), the way Python integrates with web-servers.

Bonus / Update:

Python (unsurprisingly) has a small WSGI server in the standard library for testing. If you add this in the bottom of your file, you can run it as any old executable for testing purposes, and then let Apache take over for production:

if __name__ == '__main__':
    from wsgiref.simple_server import make_server

    httpd = make_server('', 8080, application)
    print "Serving on http://localhost:8080"

    httpd.serve_forever()
6
  • I got the following as an error, out of the apache log. As far as I can tell, it thinks it's not getting a string.
    – Vallery
    Mar 6, 2011 at 1:08
  • [Sat Mar 05 17:06:14 2011] [error] [client 127.0.0.1] mod_wsgi (pid=2844): Exception occurred processing WSGI script '/var/www/file.py'. [Sat Mar 05 17:06:14 2011] [error] [client 127.0.0.1] Traceback (most recent call last): [Sat Mar 05 17:06:14 2011] [error] [client 127.0.0.1] File "/var/www/file.py", line 2, in application [Sat Mar 05 17:06:14 2011] [error] [client 127.0.0.1] start_response(200, [('Content-Type', 'text/plain')]) [Sat Mar 05 17:06:14 2011] [error] [client 127.0.0.1] TypeError: expected byte string object for status, value of type int found
    – Vallery
    Mar 6, 2011 at 1:08
  • Ah. My bad. I'm used to frameworks doing all the tricky stuff for me ;). I've updated the 200 to '200 OK' per python.org/dev/peps/pep-0333 Mar 7, 2011 at 15:20
  • Great, that works. Last question: how do I make it display in html? My browser shows the return in plaintext, ignoring the markup.
    – Vallery
    Mar 7, 2011 at 22:50
  • 1
    Wait, got it: change text/plain to text/html.
    – Vallery
    Mar 7, 2011 at 22:52

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .