Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Was fehlt?

Es liegt in der Natur der Sache: Ein Wiki ist niemals fertig. Wir geben uns große Mühe, mit der Entwicklung Schritt zu halten; lassen Supportanfragen direkt in neue Artikel einfließen … aber auch wir sind nicht perfekt. Wenn du hier nicht fündig wirst: Nicht schmollen - Bescheid sagen! Unter hallo@uberspace.de steht dir unser Team gerne bereit. Hand drauf!

cool:django
Alle Anleitungen in diesem Wiki beziehen sich auf Uberspace 6. Die Dokumentation für U7 findest du im neuen Manual. Im Lab findest du außerdem von Usern erstellte Anleitungen für verschiedene Projekte.

Mit dem Django-Framework entwickeln

Django ist ein beliebtes Framework für Webapplikationen auf Python-Basis - und natürlich auch bei Uberspace problemlos zu benutzen, da du ja deine eigenen Python-Module installieren kannst. Wir benutzen hier in der Doku Python 2.7 (Aufruf über python2.7).

Django installieren

Erstmal gilt es, die PATH-Variable um ~/.local/bin zu erweitern, damit später die installierten Module gefunden werden.

[silvia@krypton ~]$ sed -i s/'$HOME\/bin'/'$HOME\/bin:$HOME\/.local\/bin'/g .bash_profile 

Damit das auch schon in dieser Shell-Session Gültigkeit hat, anschließend nochmal einlesen.

[silvia@krypton ~]$ source .bash_profile 

Und können wir zur eigentlichen Aufgabe übergehen; Django zu installieren. Nichts leichter als das - mit pip-2.7.

[silvia@krypton ~]$ pip-2.7 install django --user
Collecting django
  Downloading Django-1.11.10-py2.py3-none-any.whl (6.9MB)
    100% |████████████████████████████████| 7.0MB 83kB/s
Collecting pytz (from django)
  Downloading pytz-2018.3-py2.py3-none-any.whl (509kB)
    100% |████████████████████████████████| 512kB 1.3MB/s
Installing collected packages: pytz, django
Successfully installed django-1.11.10 pytz-2018.3
[silvia@krypton ~]$

Django-Projekt anlegen und konfigurieren

Die Dokumentation empfiehlt, Django-Projekte ausdrücklich außerhalb des DocumentRoots anzulegen, und dieser Empfehlung folgen wir gerne. Wir nennen unser Projekt hier im Beispiel MyDjangoProject und möchten es in unserem Home-Verzeichnis anlegen. Also los:

[silvia@krypton ~]$ django-admin.py startproject MyDjangoProject

Als nächstes muss die settings.py bearbeitet werden. Hier findest du unter anderem die Timezone- und Spracheinstellungen. Unser Projekt heißt ja, wie eben festgelegt, MyDjangoProject, also …

[silvia@krypton ~]$ cd ~/MyDjangoProject
[silvia@krypton MyDjangoProject]$ nano MyDjangoProject/settings.py

Gehen wir mal davon aus, dass wir in Europa sind …

[...]
 
TIME_ZONE = 'Europe/Berlin'
 
[...]

… und Deutsch sprechen …

[...]
LANGUAGE_CODE = 'de-de'
[...]
wichtig ist es außerdem, USE_X_FORWARDED_HOST zu setzen, sonst kommt Gunicorn nicht durch den Webserver, der hier ja als Proxy arbeitet, hindurch:
[...]
 
USE_X_FORWARDED_HOST = True
 
[...]

Damit Django im produktiven Betrieb auch auf die eingehenden Anfragen reagiert, ist es inzwischen nötig, die ALLOWED_HOSTS-Variable auf den FQDN (Fully Qualified Domain Name) zu setzen, für den Django zuständig sein soll. In diesem Fall lautet dieser django.silvia.krypton.uberspace.de und ist somit identisch mit der URL, die wir im nächsten Schritt in als DJANGOURL verwenden:

[...]
 
ALLOWED_HOSTS = [
  'django.silvia.krypton.uberspace.de'
] 
 
[...]

Das war's erstmal an Konfiguration - bitte speichern und schließen.

Mediendateien für den Admin-Bereich kopieren

… eins haben wir noch vergessen: Die static files. Die liegen nämlich nach der Django-Installation außerhalb des DocumentRoots, so dass der Apache nicht drankommt. Die Django-Dokumentation empfiehlt, sie entweder mit einem Symlink in den DocumentRoot zu bringen oder sie dorthin zu kopieren. Die erste Variante ist bei Uberspace keine Option: Da das Home-Verzeichnis für den Webserver aus Sicherheitsgründen bewusst nicht lesbar ist, könnte der Webserver dem Symlink nicht folgen. Wir müssen die Dateien also kopieren.

Vorher müssen wir uns allerdings Gedanken machen, unter welcher Adresse das Projekt erreichbar sein soll. Da wir faul sind benutzen wir hierfür eine Variable - DJANGOURL. In unserem Beispiel soll das Projekt unter django.silvia.krypton.uberspace.de erreichbar sein, also einen eigenen DocumentRoot spendiert bekommen. Das hat den Vorteil, dass es vollkommen unabhängig von deinem ~/html-Ordner läuft.

[silvia@krypton ~]$ DJANGOURL=django.$USER.$(hostname)

Hier kannst du übrigens alles an Subdomains benutzen, was du aufgeschaltet hast. Wenn du eine eigene Domain dafür nutzt, hat das den charmanten Nebeneffekt, dass du eigene HTTPS-Zertifikate benutzen kannst.

… lieber noch mal nachsehen, ob das geklappt hat:

[silvia@krypton ~]$ echo $DJANGOURL
django.silvia.krypton.uberspace.de

Variable gesetzt? Prima. Dann kann's losgehen:

[silvia@krypton ~]$ mkdir -p /var/www/virtual/$USER/$DJANGOURL/static/
[silvia@krypton ~]$ cp -a ~/.local/lib/python2.7/site-packages/django/contrib/admin/static/admin /var/www/virtual/$USER/$DJANGOURL/static/

Datenbank initialisieren

Nun wird die Datenbank mit migrate initialisiert, wozu wir das manage.py-Script benutzen, das dann auch gleich den Superuser für das Admin-Interface anlegt. Alles in diesen drei Schritten:

[silvia@krypton MyDjangoProject]$  python2.7 manage.py migrate auth
[silvia@krypton MyDjangoProject]$  python2.7 manage.py  migrate --run-syncdb
[silvia@krypton MyDjangoProject]$  python2.7 manage.py createsuperuser

Deployment mit Gunicorn

Es gibt nun verschiedene Varianten, Django ins Web zu bringen: Mit dem eingebauten Development-Webserver oder mit WSGI. Bei WSGI gibt es momentan zwei Möglichkeiten: uWSGI und Gunicorn. Wir wollen hier mal mit Gunicorn arbeiten, uWSGI sollte es aber genau so gut tun. Der Development-Webserver ist nicht für den Produktivbetrieb gedacht.

Gunicorn installieren

Auch die Installation von Gunicorn ist nicht sonderlich kompliziert:

[silvia@krypton MyDjangoProject]$ pip-2.7 install gunicorn --user

… das war's schon.

deamon einrichten

Gunicorn braucht einen eigenen Port auf dem es laufen kann. Nachdem du dir einen nach den Regeln ausgesucht und überprüft hast, ob er frei ist, können wir loslegen. Damit wir es später etwas leichter haben, richten wir uns hier mal eine Variable DJANGOPORT ein.

Für die Faulen unter uns:

[silvia@krypton MyDjangoProject]$ DJANGOPORT=$(( $RANDOM % 4535 + 61000)); netstat -tulpen | grep $DJANGOPORT && echo "versuch's nochmal"

… wenn hier keine Ausgabe versuch's nochmal erscheint, passt alles. Wenn versuch's nochmal kommt - versuch's noch mal :)

Als nächstes ein Daemon, damit wir gunicorn bequem über die Daemontools steuern können.

[silvia@krypton ~]$ test -d ~/service || uberspace-setup-svscan 
[silvia@krypton ~]$ uberspace-setup-service gunicorn gunicorn --error-logfile - --reload --chdir /home/$USER/MyDjangoProject --bind 127.0.0.1:$DJANGOPORT MyDjangoProject.wsgi:application 

… vorsichtshalber schauen wir direkt mal in die Logs:

[silvia@krypton ~]$ tail ~/service/gunicorn/log/main/current | tai64nlocal 
2014-07-24 14:26:56.372297500 2014-07-24 14:26:56 [18606] [INFO] Starting gunicorn 19.0.0
2014-07-24 14:26:56.372824500 2014-07-24 14:26:56 [18606] [INFO] Listening at: http://127.0.0.1:<deinPort> (18606)
2014-07-24 14:26:56.372956500 2014-07-24 14:26:56 [18606] [INFO] Using worker: sync
2014-07-24 14:26:56.374943500 2014-07-24 14:26:56 [18629] [INFO] Booting worker with pid: 18629

… na das sieht doch gut aus!

RewriteRule mit Proxy

Unser Gunicorn läuft jetzt auf einem eigenen Port, der aber nach außen hin nicht erreichbar ist. Das erledigen wir nun über eine RewriteRule mit Proxy mit einer eigenen .htaccess-Datei.

Hier gibt's nun die Lorbeeren für unsere vorherige Arbeit mit den Variablen. Wenn du DJANGORUL und DJANGOPORT gesetzt hast, wie oben beschrieben, kannst du den folgenden Absatz einfach übernehmen:

[silvia@krypton ~]$ cat <<__EOF__> /var/www/virtual/$USER/$DJANGOURL/.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteBase /
RewriteRule ^(.*)$ http://127.0.0.1:$DJANGOPORT/\$1 [P]
 
RequestHeader set X-Forwarded-Proto https env=HTTPS
__EOF__

Ausprobieren

Ruf das Projekt einfach im Browser auf - im konkreten Fall wäre das https://django.silvia.krypton.uberspace.de/. Da es hier wohl etwas leer aussehen wird ist für uns wohl eher der Admin-Bereich interessant. Du kannst ihn unter https://django.silvia.krypton.uberspace.de/admin/ erreichen. Die Zugangsdaten für den Admin-Bereich hast du im Schritt Datenbank initialisieren ja selbst angegeben - mit diesen Daten kannst du dich hier jetzt einloggen.

Wenn du Dateien in deinem Projekt änderst, vergiss nicht, gunicorn neu zu starten.

Wie geht es weiter?

Unser Part bei der Sache ist, wie du Django bei Uberspace zum Laufen bekommst, also sozusagen der administrative Teil. Dein eigener Job ist es nun, Django-Applikationen zu entwickeln - da legen wir dir dir das offizielle Tutorial ans Herz.

cool/django.txt · Zuletzt geändert: 2018/03/29 07:02 von uber