Benutzer-Werkzeuge

Webseiten-Werkzeuge


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.

Uberspace 6 basiert auf CentOS 6, welches ab Ende 2020 keine Updates mehr bekommt. Wir raten dir, bis dahin auf Uberspace 7 umzuziehen. Eine Anleitung zum Umzug findest Du hier: uberspace2uberspace

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
cool:django [2018/03/29 07:02]
uber
cool:django [2020/04/14 16:36] (aktuell)
uberspace
Zeile 1: Zeile 1:
-====== Mit dem Django-Framework entwickeln ====== +Hier stand bisher unsere Anleitung, um Django auf deinem ​Uberspace zu installieren. ​Da Uberspace ​Ende 2020 ausläuft ​(siehe obenraten wir dringend ​davon abnoch neue Projekte ​auf einem 6er Uberspace ​zu startenStattdessen empfehlen ​wir, neue Projekte auf einem neuen Uberspace 7 zu beginnenEine passende ​[[https://lab.uberspace.de/​guide_django.html|Django-Anleitung]] findest ​du im [[https://lab.uberspace.de/​|Lab]].
- +
-[[http://​www.djangoproject.com/​|Django]] ist ein beliebtes Framework für Webapplikationen ​auf Python-Basis - und natürlich auch bei Uberspace ​problemlos ​zu benutzen, da du ja [[development:​python#​module|deine eigenen Python-Module ​installieren]] kannstWir 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.  +
- +
-<code bash> +
-[silvia@krypton ~]$ sed -i s/'​$HOME\/​bin'/'​$HOME\/​bin:​$HOME\/​.local\/​bin'/​g .bash_profile  +
-</​code>​ +
- +
-Damit das auch schon in dieser Shell-Session Gültigkeit hat, anschließend nochmal einlesen. +
- +
- +
-<code bash> +
-[silvia@krypton ~]$ source .bash_profile  +
-</​code>​ +
-  +
-Und können wir zur eigentlichen Aufgabe übergehen; Django zu installieren. Nichts leichter als das - mit ''​pip-2.7''​. +
- +
-<code bash> +
-[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 ~]$ +
-</​code>​  +
- +
- +
-==== 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 [[system:​home|Home-Verzeichnis]] anlegen. Also los: +
- +
-<code bash> +
-[silvia@krypton ~]$ django-admin.py startproject MyDjangoProject +
-</​code>​ +
- +
-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 ... +
- +
-<code bash> +
-[silvia@krypton ~]$ cd ~/​MyDjangoProject +
-[silvia@krypton MyDjangoProject]$ nano MyDjangoProject/​settings.py +
-</​code>​ +
- +
-Gehen wir mal davon ausdass wir in Europa sind ... +
- +
-<code bash>  +
-[...] +
- +
-TIME_ZONE = '​Europe/​Berlin'​ +
- +
-[...] +
-</​code>​ +
- +
-... und Deutsch sprechen ... +
- +
-<code bash> +
-[...] +
-LANGUAGE_CODE = '​de-de'​ +
-[...] +
-</​code>​ +
- +
-<note important>​**wichtig** ist es außerdem, ''​USE_X_FORWARDED_HOST''​ zu setzen, sonst kommt Gunicorn nicht durch den Webserver, [[https://​docs.djangoproject.com/​en/​dev/​ref/​settings/#​use-x-forwarded-host|der hier ja als Proxy arbeitet]], hindurch:</​note>​ +
- +
-<code bash> +
-[...] +
- +
-USE_X_FORWARDED_HOST = True +
- +
-[...] +
-</​code>​ +
- +
-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 sollIn 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:​ +
- +
-<code bash> +
-[...] +
- +
-ALLOWED_HOSTS = [ +
-  '​django.silvia.krypton.uberspace.de'​ +
-]  +
- +
-[...] +
-</​code>​ +
- +
-Das war's erstmal an Konfiguration - bitte speichern und schließen. +
-==== Mediendateien für den Admin-Bereich kopieren ==== +
- +
-... eins haben wir noch vergessen: Die [[https://​docs.djangoproject.com/​en/​1.8/​howto/​deployment/​wsgi/​modwsgi/#​serving-the-admin-files|static files]]. Die liegen nämlich nach der Django-Installation außerhalb des DocumentRootsso dass der Apache nicht drankommt. Die Django-Dokumentation empfiehlt, sie entweder mit einem Symlink in den DocumentRoot ​zu bringen oder sie dorthin zu kopierenDie erste Variante ist bei Uberspace keine Option: Da das [[system:​home|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 ​[[https://wiki.uberspace.de/​domain:​subdomain|DocumentRoot]] spendiert bekommenDas hat den Vorteil, dass es vollkommen unabhängig von deinem ~/html-Ordner läuft.  +
- +
-<code bash> +
-[silvia@krypton ~]$ DJANGOURL=django.$USER.$(hostname) +
-</​code>​ +
- +
-Hier kannst du übrigens alles an [[domain:​subdomain|Subdomains]] benutzen, [[domain:​verwalten|was du aufgeschaltet hast]]. Wenn du eine eigene Domain dafür nutzt, hat das den charmanten Nebeneffekt,​ dass du [[webserver:​https|eigene HTTPS-Zertifikate]] benutzen kannst. +
- +
-... lieber noch mal nachsehen, ob das geklappt hat: +
- +
-<code bash> +
-[silvia@krypton ~]$ echo $DJANGOURL +
-django.silvia.krypton.uberspace.de +
-</​code>​ +
- +
- +
-Variable gesetzt? Prima. Dann kann's losgehen: +
- +
-<code bash> +
-[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/​ +
-</​code>​ +
- +
-==== 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:  +
- +
-<code bash> +
-[silvia@krypton MyDjangoProject]$ ​ python2.7 manage.py migrate auth +
-</​code>​ +
- +
-<code bash> +
-[silvia@krypton MyDjangoProject]$ ​ python2.7 manage.py ​ migrate --run-syncdb +
-</​code>​ +
- +
-<code bash> +
-[silvia@krypton MyDjangoProject]$ ​ python2.7 manage.py createsuperuser +
-</​code>​ +
- +
-===== Deployment mit Gunicorn ===== +
- +
-Es gibt nun verschiedene Varianten, ​Django ​ins Web zu bringen: Mit dem eingebauten Development-Webserver oder mit [[https://​docs.djangoproject.com/​en/​1.8/​howto/​deployment/​wsgi/​|WSGI]]. Bei WSGI gibt es momentan zwei Möglichkeiten:​ [[http://​projects.unbit.it/​uwsgi/​|uWSGI]] und [[http://​gunicorn.org|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:​ +
- +
-<code bash> +
-[silvia@krypton MyDjangoProject]$ pip-2.7 install gunicorn --user +
-</​code>​ +
- +
-... das war's schon. +
- +
-==== deamon einrichten ==== +
- +
-Gunicorn braucht einen eigenen Port auf dem es laufen kann. Nachdem ​du dir [[system:​ports|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: +
- +
-<code bash> +
-[silvia@krypton MyDjangoProject]$ DJANGOPORT=$(( $RANDOM % 4535 + 61000)); netstat -tulpen | grep $DJANGOPORT && echo "​versuch'​s nochmal"​ +
-</​code>​ +
- +
-... 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 [[https://wiki.uberspace.de/​system:​daemontools|Daemontools]] steuern können. +
- +
-<code bash> +
-[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  +
-</​code>​ +
- +
-... vorsichtshalber schauen wir direkt mal in die Logs: +
- +
-<code bash> +
-[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 +
-</​code>​ +
- +
-... 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 [[webserver:​htaccess#​rewriterule_mit_proxy|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:​ +
- +
-<code bash>  +
-[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__ +
-</​code>​ +
- +
-===== 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|Datenbank initialisieren]] ja selbst angegeben - mit diesen Daten kannst du dich hier jetzt einloggen. +
- +
-Wenn du Dateien in deinem Projekt änderst, vergiss nicht, [[system:​daemontools#​wenn_der_daemon_laeuft|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 [[https://​docs.djangoproject.com|offizielle Tutorial]] ans Herz.+
cool/django.txt · Zuletzt geändert: 2020/04/14 16:36 von uberspace