Computer

Einfache „Hello World“ Python3 Webanwendung mit FastCGI und Flask

Zuersteinmal muss ich eine Warnung aussprechen. Ich bin absolut kein Profi, sondern nur ein Neuling, der sich gerade durch dieses Problem gewurschtelt hat. Weil ich sämtliche Infos in allen Ecken und Enden des Netzes suchen musste, dachte ich mir, dass ich es jetzt mal alles zusammen trage.

Ich gehe davon aus, dass ihr Ubuntu 14.04 (sollte auch auf neueren funktionieren) und Apache2 installiert habt.

Gateway einrichten

Um Python in Apache zu integrieren, braucht man ein Gateway Interface. Mehr Infos dazu gibt es hier.

Da CGI (Common Gateway Interface) nicht zu empfehlen ist, verwenden wir FastCGI und installieren deshalb libapache2-mod-fcgid. Mod-fcgid ist ein Fork von mod_fastcgi, das anscheinend Lizenzprobleme hat.

sudo apt-get install libapache2-mod-fcgid

Für Terminalfremdlinge: Öffnen: Strg + Alt + T; Copy/Paste: Strg + Shift + C/V.

Das Modul müsste auch automatisch aktiviert werden. Falls man Zweifel hat, kann man einfach

sudo a2enmod fcgid

probieren.

Ordner anlegen

Geht nun zu „/var/www/html“. Hoffentlich habt ihr schon Schreibrechte, falls nicht findet ihr hier die Anleitung. Legt nun erst einen Ordner „python“ und darin einen „test“.

Pip3 installieren

Pip3 ist ein Werkzeug mit dem man einfach Pythonpakete mitsamt deren Abhängigkeiten installieren kann. Wir brauchen es bald.

sudo apt-get install python3-pip

Virtual Environment „venv“

Eigentlich ist es superpraktisch jetzt eine virtuelle Umgebung einzurichten, um unterschiedliche Projekte und deren Abhängigkeiten zu separieren, aber zur Zeit gibt es da anscheinend einen Bug und pip3 funktioniert dann nicht. Mehr dazu erfahrt ihr auf ubuntuusers.de.

Installation von Flup und Flask

Nun installieren wir flup und flask. Flask ist ein minimales Python Webframework, während flup einen WSGI Server zur Verfügung stellt. Ich verwende hier flup6, da flup nur mit Python2 kompatibel ist und flipflop und flup-py3 irgendwie nicht richtig funktionierten.

sudo pip3 install flup6
sudo pip3 install https://github.com/mitsuhiko/flask/tarball/master

Das Python Script

Legt nun in /var/www/html/python/test die Datei test.py an und fügt folgenden Inhalt ein:


from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

Das fcgi Script

Legt weiterhin in /var/www/html/python/test noch die Datei test.fcgi an


#!/usr/bin/python3
from flup.server.fcgi import WSGIServer
from test import app

if __name__ == '__main__':
    WSGIServer(app).run()

und macht diese ausführbar:

chmod +x /var/www/python/test/test.fcgi

Die .htaccess

Nun fehlt noch eine Datei namens .htaccess:

Options +ExecCGI
AddHandler fcgid-script .fcgi

Wer mit Linux nicht vertraut ist, wird sich wundern, dass diese sofort wieder verschwindet. Unter Linux werden alle Dateien und Ordner, die mit einem Punkt beginnen verrsteckt. Über „Ansicht -> verborgene Dateien anzeigen“ kann man diese im Nautilus File Manager sichtbar machen.

Fertig

Nun müsste das Programm unter „http://localhost/python/test/test.fcgi/“ zu sehen sein. Achtung: Der letzte „/“ ist wichtig.

Schönere URL

Um das „test.fcgi“ aus der URL zu entfernen, kann man noch die .htaccess folgendermaßen abändern:

<IfModule mod_fcgid.c>
   AddHandler fcgid-script .fcgi
   <Files ~ (\.fcgi)>
       SetHandler fcgid-script
       Options +FollowSymLinks +ExecCGI
   </Files>
</IfModule>

<IfModule mod_rewrite.c>
   Options +FollowSymlinks
   RewriteEngine On
   RewriteBase /python/test/
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^(.*)$ test.fcgi/$1 [QSA,L]
</IfModule>

Und test.fcgi muss dann so aussehen:

#!/usr/bin/python3

from flup.server.fcgi import WSGIServer
from test import app

class ScriptNameStripper(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        environ['SCRIPT_NAME'] = '/python/test'
        return self.app(environ, start_response)

app = ScriptNameStripper(app)

if __name__ == '__main__':
    WSGIServer(app).run()

Mehr dazu erfahrt ihr hier unter „Configuring Apache“.

Debugging

Sämtliche Fehlermeldungen des Pythonscriptes finden sich im Errorlog von Apache2 unter /var/log/apache2/error.log

Während der Entwicklung

Vielleicht fällt euch bald auf, dass Änderungen, die man an der test.py vornimmt nicht ankommen. Das liegt daran, dass FastCGI nicht jedesmal eine neue Pythoninstanz lädt. Was sonst ein Vorteil in Sachen Geschwindigkeit ist, ist während der Entwicklung von Apps nervig. Das kann man aber einfach umschiffen, indem man CGI verwendet.

Zuerst aktiviert man CGI

sudo a2enmod cgi
sudo service apache2 restart

Dann ändert man die .htaccess folgendermaßen ab:

AddHandler cgi-script .cgi .pl
Options +FollowSymLinks +ExecCGI

<IfModule mod_rewrite.c>
  Options +FollowSymlinks
  RewriteEngine On
  RewriteBase /python/test/
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ test.cgi/$1 [QSA,L]
</IfModule>

und erstellt eine Datei Namens test.cgi:

#!/usr/bin/python3
from wsgiref.handlers import CGIHandler
import cgitb
from test import app
cgitb.enable()
class ScriptNameStripper(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        environ['SCRIPT_NAME'] = '/python/test'
        return self.app(environ, start_response)

app = ScriptNameStripper(app)
CGIHandler().run(app)

Schöner Coden

Wer diverse Standards einhalten möchte, sollte sich das noch zu Gemüte führen.

Weiter

Wer jetzt richtig anfangen möchte zu programmieren, macht hier weiter.

Ein Gedanke zu “Einfache „Hello World“ Python3 Webanwendung mit FastCGI und Flask

  1. Tom

    Richtig gut! Ich hätte es nur cool gefunden, wenn du noch auf einzelne (wichtige) Zeilen und ihre Bedeutung/was sie machen eingegangen wärst.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.