Django installieren: Unterschied zwischen den Versionen
Tim00 (Diskussion | Beiträge) KKeine Bearbeitungszusammenfassung Markierungen: mobile edit mobile web edit |
|||
(19 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
== Allgemeines == | |||
Django (https://www.djangoproject.com/) ist ein Python Framework. | |||
Es wurde im Juli 2005 unter einer BSD-Lizenz veröffentlicht. | |||
Es gibt mehrere Möglichkeiten, Django bei Hostsharing zu betreiben: | |||
* mit Passenger und WSGI: das ist der empfohlene Weg. | |||
* mit FastCGI und WSGI via flup: wenn man es kompliziert machen will. | |||
Für die Passenger-Variante gibt es auch ein Ansible Skript: https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/django | |||
==Installation Djangobibliothek== | ==Installation Djangobibliothek== | ||
Die Djangobibliotheken werden in einer Virtualenv-Umgebung installiert. Voraussetzung ist ein auf dem System installiertes python mit einem virtualenv-Paket | Die Djangobibliotheken werden in einer Virtualenv-Umgebung installiert. Voraussetzung ist ein auf dem System installiertes python mit einem virtualenv-Paket | ||
Zunächst wird die Virtualenvumgebung erstellt: | Zunächst wird die Virtualenvumgebung erstellt: | ||
< | <syntaxhighlight lang=bash> | ||
xyz00- | xyz00-meinuser:~$ virtualenv -p /usr/bin/python3 djangoenv | ||
Already using interpreter /usr/bin/python3 | Already using interpreter /usr/bin/python3 | ||
Using base prefix '/usr' | Using base prefix '/usr' | ||
Zeile 10: | Zeile 22: | ||
Also creating executable in djangoenv/bin/python | Also creating executable in djangoenv/bin/python | ||
Installing setuptools, pkg_resources, pip, wheel...done. | Installing setuptools, pkg_resources, pip, wheel...done. | ||
</ | </syntaxhighlight> | ||
Dann werden die Django-Bibliotheken in die eben erstellte Virtualenvumgebung installiert. | Dann werden die Django-Bibliotheken in die eben erstellte Virtualenvumgebung installiert. | ||
< | <syntaxhighlight lang=bash line> | ||
xyz00- | xyz00-meinuser:~$ source djangoenv/bin/activate | ||
(djangoenv) xyz00- | (djangoenv) xyz00-meinuser:~$ pip3 install django | ||
... | ... | ||
Successfully installed django- | Successfully installed asgiref-3.3.4 django-3.2 pytz-2021.1 sqlparse-0.4.1 typing-extensions-3.7.4.3 | ||
</syntaxhighlight> | |||
Testen, ob Django installiert ist: | Testen, ob Django installiert ist: | ||
< | <syntaxhighlight lang=python> | ||
(djangoenv) xyz00- | (djangoenv) xyz00-meinuser:~$ djangoenv/bin/python | ||
Python 3. | Python 3.7.3 (default, Jan 22 2021, 20:04:44) | ||
[GCC | [GCC 8.3.0] on linux | ||
Type "help", "copyright", "credits" or "license" for more information. | Type "help", "copyright", "credits" or "license" for more information. | ||
>>> import django | >>> import django | ||
>>> django.VERSION | |||
(3, 2, 0, 'final', 0) | |||
>>> | >>> | ||
</ | </syntaxhighlight> | ||
Mit Ctrl-D kann die Konsole wieder verlassen werden. | Mit Ctrl-D kann die Konsole wieder verlassen werden. | ||
Alternativ kann die aktuell installierte Version von Django so angezeigt werden: | |||
<syntaxhighlight lang=bash> | |||
(djangoenv) xyz00-meinuser:~$ python -m django --version | |||
3.2 | |||
</syntaxhighlight> | |||
Nun kann man die Virtualenvumgebung wieder verlassen: | Nun kann man die Virtualenvumgebung wieder verlassen: | ||
(djangoenv) xyz00- | (djangoenv) xyz00-meinuser:~$ deactivate | ||
==Django-Projekt== | == Django-Projekt anlegen == | ||
Dann wird das Django Projekt | Dann wird das Django Projekt als Domain-Admin angelegt: | ||
Jetzt soll die Datenbank initialisiert werden, die in djangoprojekt/ | <syntaxhighlight lang=bash> | ||
< | xyz00-meinuser:~$ source djangoenv/bin/activate | ||
(djangoenv) xyz00- | (djangoenv) xyz00-meinuser:~$ django-admin startproject djangoprojekt | ||
(djangoenv) xyz00-meinuser:~$ cd djangoprojekt | |||
</syntaxhighlight> | |||
Jetzt soll die Datenbank initialisiert werden, die in djangoprojekt/djangoprojekt/settings.py definiert ist (per Default erstmal eine sqlite Datenbank): | |||
<syntaxhighlight lang=bash> | |||
(djangoenv) xyz00-meinuser:~$ python manage.py migrate | |||
Operations to perform: | Operations to perform: | ||
Apply all migrations: admin, auth, contenttypes, sessions | Apply all migrations: admin, auth, contenttypes, sessions | ||
Zeile 67: | Zeile 85: | ||
Applying auth.0011_update_proxy_permissions... OK | Applying auth.0011_update_proxy_permissions... OK | ||
Applying sessions.0001_initial... OK | Applying sessions.0001_initial... OK | ||
</ | </syntaxhighlight> | ||
Jetzt kann man unter Verwendung des Pythons der Virtualenv testen, ob Django läuft. | Jetzt kann man unter Verwendung des Pythons der Virtualenv testen, ob Django läuft. | ||
< | <syntaxhighlight lang=bash> | ||
(djangoenv) xyz00- | (djangoenv) xyz00-meinuser:~$ python manage.py runserver | ||
Watching for file changes with StatReloader | Watching for file changes with StatReloader | ||
Performing system checks... | Performing system checks... | ||
System check identified no issues (0 silenced). | System check identified no issues (0 silenced). | ||
Django version | Django version 3.2, using settings 'djangoprojekt.settings' | ||
Starting development server at http://127.0.0.1:8000/ | Starting development server at http://127.0.0.1:8000/ | ||
Quit the server with CONTROL-C. | Quit the server with CONTROL-C. | ||
</ | </syntaxhighlight> | ||
Es muss noch die Domain in die <code>~/djangoprojekt/djangoprojekt/settings.py</code> eingetragen werden: | |||
<syntaxhighlight lang=bash> | |||
(djangoenv) xyz00-meinuser:~$ export domain=example.com | |||
(djangoenv) xyz00-meinuser:~$ sed -i "s/ALLOWED_HOSTS = \[\]/ALLOWED_HOSTS = ['$domain','www.$domain']/g" djangoprojekt/settings.py | |||
</syntaxhighlight> | |||
Außerdem sind diese beiden Zeilen am Ende von der settings.py Datei einzufügen: | |||
<syntaxhighlight lang=python> | |||
< | import os | ||
(djangoenv) xyz00- | STATIC_ROOT = os.path.join(BASE_DIR, 'static') | ||
</syntaxhighlight> | |||
</ | |||
Dann sollten noch die statischen Dateien gesammelt und erstellt werden: | |||
<syntaxhighlight lang=bash> | |||
(djangoenv) xyz00-meinuser:~$ python manage.py collectstatic | |||
</syntaxhighlight> | |||
== Nutzung mit Passenger und WSGI == | |||
Dies ist der empfohlene Weg, wie Python Anwendungen bei Hostsharing betrieben werden können: | |||
Im Domain-Verzeichnis "~/doms/example.com/" wird eine Datei ".htaccess" mit der Passenger-Konfiguration abgelegt: | |||
<syntaxhighlight lang=apache line> | |||
PassengerFriendlyErrorPages off | |||
PassengerPython /home/pacs/xyz00/users/meinuser/djangoenv/bin/python3 | |||
SetEnv PYTHONPATH /home/pacs/xyz00/users/meinuser/djangoprojekt | |||
</syntaxhighlight> | |||
Die Verzeichnisse "subs/www" und "subs-ssl/www" werden gelöscht. | |||
Die Datei .htaccess im Verzeichnis "htdocs-ssl" wird ebenfalls gelöscht. | |||
In "htdocs-ssl" wird ein symbolischer Link auf das static Verzeichnis angelegt: | |||
<syntaxhighlight lang=bash> | |||
xyz00-meinuser$ cd ~/doms/example.com/htdocs-ssl | |||
xyz00-meinuser$ ln -s ~/djangoprojekt/static | |||
</syntaxhighlight> | |||
In "app-ssl" wird eine Datei "passenger_wsgi.py" mit folgendem Inhalt abgelegt: | |||
<syntaxhighlight lang=python> | |||
from djangoprojekt.wsgi import application | |||
</syntaxhighlight> | |||
Das Django Projekt ist nun unter https://example.com erreichbar. | |||
==Nutzung mit FastCGI und WSGI via flup== | ==Nutzung mit FastCGI und WSGI via flup== | ||
Wenn man doch nicht Passenger einsetzen will, geht es auch kompliziert über FastCGI: | |||
Zunächst legt man das FastCGI-Skript (django.fcgi) an und legt es im fastcgi-ssl Verzeichnis ab und macht es ausführbar: | Zunächst legt man das FastCGI-Skript (django.fcgi) an und legt es im fastcgi-ssl Verzeichnis ab und macht es ausführbar: | ||
< | <syntaxhighlight lang=bash> | ||
xyz00- | xyz00-meinuser:~$ export djangoenv=$HOME/djangoenv | ||
xyz00- | xyz00-meinuser:~$ cd doms/example.com | ||
xyz00- | xyz00-meinuser:~$ cat > fastcgi-ssl/django.fcgi <<FINISH | ||
#!$djangoenv/bin/python | #!$djangoenv/bin/python | ||
Zeile 102: | Zeile 161: | ||
from django.core.handlers.wsgi import WSGIHandler | from django.core.handlers.wsgi import WSGIHandler | ||
os.chdir("$ | os.chdir("$HOME/djangoprojekt") | ||
os.environ['DJANGO_SETTINGS_MODULE']= "djangoprojekt.settings" | os.environ['DJANGO_SETTINGS_MODULE']= "djangoprojekt.settings" | ||
sys.path.insert(0, "$ | sys.path.insert(0, "$HOME/djangoprojekt") | ||
sys.path.insert(0, "$ | sys.path.insert(0, "$HOME/djangoprojekt/djangoprojekt") | ||
django.setup(set_prefix=False) | django.setup(set_prefix=False) | ||
Zeile 111: | Zeile 170: | ||
FINISH | FINISH | ||
xyz00- | xyz00-meinuser:~$ chmod a+x fastcgi-ssl/django.fcgi | ||
</ | </syntaxhighlight> | ||
Außerdem muss flup installiert werden: | Außerdem muss flup installiert werden: | ||
< | <syntaxhighlight lang=bash> | ||
xyz00- | xyz00-meinuser:~$ source djangoenv/bin/activate | ||
(djangoenv) xyz00- | (djangoenv) xyz00-meinuser:~$ pip3 install flup | ||
</ | </syntaxhighlight> | ||
Um die voreingestellte leere Seite von Django zu sehen, muss noch die nicht existierende admin App auskommentiert werden: | Um die voreingestellte leere Seite von Django zu sehen, muss noch die nicht existierende admin App auskommentiert werden: | ||
< | <syntaxhighlight lang=bash> | ||
xyz00- | xyz00-meinuser:~$ cd doms/example.com/djangoprojekt | ||
xyz00- | xyz00-meinuser:~$ sed -i "s~path('admin/'~#path('admin/'~g" djangoprojekt/urls.py | ||
</ | </syntaxhighlight> | ||
Das Djangoprojekt sollte jetzt unter https://example.com/fastcgi-bin/django.fcgi erreichbar sein. | Das Djangoprojekt sollte jetzt unter https://example.com/fastcgi-bin/django.fcgi erreichbar sein. | ||
Tipp: Manchmal werden Änderungen in den Quellen, insbesondere der settings.py nicht übernommen. Dann hilft es den Zeitstempel der Datei django.fcgi mit touch zu aktualisieren: | Tipp: Manchmal werden Änderungen in den Quellen, insbesondere der settings.py nicht übernommen. Dann hilft es den Zeitstempel der Datei django.fcgi mit touch zu aktualisieren: | ||
< | <syntaxhighlight lang=bash> | ||
xyz00- | xyz00-meinuser:~$ touch doms/example.com/fastcgi-ssl/django.fcgi | ||
</ | </syntaxhighlight> | ||
Alternativ kann der Prozess gestoppt werden: | Alternativ kann der Prozess gestoppt werden: | ||
< | <syntaxhighlight lang=output> | ||
xyz00- | xyz00-meinuser:~$ ps xaf | grep django.fcgi | ||
8091 pts/1 S+ 0:00 | \_ grep django.fcgi | 8091 pts/1 S+ 0:00 | \_ grep django.fcgi | ||
7195 ? Sl 0:01 | \_ /.../djangoenv/bin/python django.fcgi | 7195 ? Sl 0:01 | \_ /.../djangoenv/bin/python django.fcgi | ||
xyz00- | xyz00-meinuser:~$ kill 7195 | ||
</ | </syntaxhighlight> | ||
===Apache Weiterleitung=== | ===Apache Weiterleitung=== | ||
Zeile 145: | Zeile 204: | ||
Hierfür wird eine .htaccess im entsprechenden Domainverzeichnis angelegt: | Hierfür wird eine .htaccess im entsprechenden Domainverzeichnis angelegt: | ||
< | <syntaxhighlight lang=bash> | ||
xyz00- | xyz00-meinuser:~$ cd doms/example.com | ||
xyz00- | xyz00-meinuser:~$ cat > .htaccess <<FINISH | ||
RewriteEngine On | RewriteEngine On | ||
RewriteCond %{REQUEST_FILENAME} !-f | RewriteCond %{REQUEST_FILENAME} !-f | ||
RewriteRule ^(.*)$ /fastcgi-bin/django.fcgi/$1 [QSA,L] | RewriteRule ^(.*)$ /fastcgi-bin/django.fcgi/$1 [QSA,L] | ||
FINISH | FINISH | ||
</ | </syntaxhighlight> | ||
Nun sollte die Seite unter (www.)example.com erreichbar sein. | Nun sollte die Seite unter (www.)example.com erreichbar sein. | ||
== Links == | |||
*[https://www.djangoproject.com/ Webseite des Django Projekts] | |||
*[https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/django Ansible Playbook für Hostsharing] | |||
---- | |||
[[Kategorie:Installationsanleitungen]] | [[Kategorie:Installationsanleitungen]] | ||
[[Kategorie:Ansible Playbook]] | |||
[[Kategorie:Glossar]] | [[Kategorie:Glossar]] | ||
[[Kategorie:Python]] | |||
[[Kategorie:Django]] | |||
[[Kategorie:Passenger]] | |||
[[Kategorie:Python]] |
Aktuelle Version vom 14. Juni 2024, 11:26 Uhr
Allgemeines
Django (https://www.djangoproject.com/) ist ein Python Framework.
Es wurde im Juli 2005 unter einer BSD-Lizenz veröffentlicht.
Es gibt mehrere Möglichkeiten, Django bei Hostsharing zu betreiben:
- mit Passenger und WSGI: das ist der empfohlene Weg.
- mit FastCGI und WSGI via flup: wenn man es kompliziert machen will.
Für die Passenger-Variante gibt es auch ein Ansible Skript: https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/django
Installation Djangobibliothek
Die Djangobibliotheken werden in einer Virtualenv-Umgebung installiert. Voraussetzung ist ein auf dem System installiertes python mit einem virtualenv-Paket
Zunächst wird die Virtualenvumgebung erstellt:
xyz00-meinuser:~$ virtualenv -p /usr/bin/python3 djangoenv
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in djangoenv/bin/python3
Also creating executable in djangoenv/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.
Dann werden die Django-Bibliotheken in die eben erstellte Virtualenvumgebung installiert.
xyz00-meinuser:~$ source djangoenv/bin/activate
(djangoenv) xyz00-meinuser:~$ pip3 install django
...
Successfully installed asgiref-3.3.4 django-3.2 pytz-2021.1 sqlparse-0.4.1 typing-extensions-3.7.4.3
Testen, ob Django installiert ist:
(djangoenv) xyz00-meinuser:~$ djangoenv/bin/python
Python 3.7.3 (default, Jan 22 2021, 20:04:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.VERSION
(3, 2, 0, 'final', 0)
>>>
Mit Ctrl-D kann die Konsole wieder verlassen werden.
Alternativ kann die aktuell installierte Version von Django so angezeigt werden:
(djangoenv) xyz00-meinuser:~$ python -m django --version
3.2
Nun kann man die Virtualenvumgebung wieder verlassen:
(djangoenv) xyz00-meinuser:~$ deactivate
Django-Projekt anlegen
Dann wird das Django Projekt als Domain-Admin angelegt:
xyz00-meinuser:~$ source djangoenv/bin/activate
(djangoenv) xyz00-meinuser:~$ django-admin startproject djangoprojekt
(djangoenv) xyz00-meinuser:~$ cd djangoprojekt
Jetzt soll die Datenbank initialisiert werden, die in djangoprojekt/djangoprojekt/settings.py definiert ist (per Default erstmal eine sqlite Datenbank):
(djangoenv) xyz00-meinuser:~$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying sessions.0001_initial... OK
Jetzt kann man unter Verwendung des Pythons der Virtualenv testen, ob Django läuft.
(djangoenv) xyz00-meinuser:~$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
Django version 3.2, using settings 'djangoprojekt.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Es muss noch die Domain in die ~/djangoprojekt/djangoprojekt/settings.py
eingetragen werden:
(djangoenv) xyz00-meinuser:~$ export domain=example.com
(djangoenv) xyz00-meinuser:~$ sed -i "s/ALLOWED_HOSTS = \[\]/ALLOWED_HOSTS = ['$domain','www.$domain']/g" djangoprojekt/settings.py
Außerdem sind diese beiden Zeilen am Ende von der settings.py Datei einzufügen:
import os
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
Dann sollten noch die statischen Dateien gesammelt und erstellt werden:
(djangoenv) xyz00-meinuser:~$ python manage.py collectstatic
Nutzung mit Passenger und WSGI
Dies ist der empfohlene Weg, wie Python Anwendungen bei Hostsharing betrieben werden können:
Im Domain-Verzeichnis "~/doms/example.com/" wird eine Datei ".htaccess" mit der Passenger-Konfiguration abgelegt:
PassengerFriendlyErrorPages off
PassengerPython /home/pacs/xyz00/users/meinuser/djangoenv/bin/python3
SetEnv PYTHONPATH /home/pacs/xyz00/users/meinuser/djangoprojekt
Die Verzeichnisse "subs/www" und "subs-ssl/www" werden gelöscht. Die Datei .htaccess im Verzeichnis "htdocs-ssl" wird ebenfalls gelöscht.
In "htdocs-ssl" wird ein symbolischer Link auf das static Verzeichnis angelegt:
xyz00-meinuser$ cd ~/doms/example.com/htdocs-ssl
xyz00-meinuser$ ln -s ~/djangoprojekt/static
In "app-ssl" wird eine Datei "passenger_wsgi.py" mit folgendem Inhalt abgelegt:
from djangoprojekt.wsgi import application
Das Django Projekt ist nun unter https://example.com erreichbar.
Nutzung mit FastCGI und WSGI via flup
Wenn man doch nicht Passenger einsetzen will, geht es auch kompliziert über FastCGI:
Zunächst legt man das FastCGI-Skript (django.fcgi) an und legt es im fastcgi-ssl Verzeichnis ab und macht es ausführbar:
xyz00-meinuser:~$ export djangoenv=$HOME/djangoenv
xyz00-meinuser:~$ cd doms/example.com
xyz00-meinuser:~$ cat > fastcgi-ssl/django.fcgi <<FINISH
#!$djangoenv/bin/python
import os, sys
import django
from flup.server.fcgi import WSGIServer
from django.core.handlers.wsgi import WSGIHandler
os.chdir("$HOME/djangoprojekt")
os.environ['DJANGO_SETTINGS_MODULE']= "djangoprojekt.settings"
sys.path.insert(0, "$HOME/djangoprojekt")
sys.path.insert(0, "$HOME/djangoprojekt/djangoprojekt")
django.setup(set_prefix=False)
WSGIServer(WSGIHandler()).run()
FINISH
xyz00-meinuser:~$ chmod a+x fastcgi-ssl/django.fcgi
Außerdem muss flup installiert werden:
xyz00-meinuser:~$ source djangoenv/bin/activate
(djangoenv) xyz00-meinuser:~$ pip3 install flup
Um die voreingestellte leere Seite von Django zu sehen, muss noch die nicht existierende admin App auskommentiert werden:
xyz00-meinuser:~$ cd doms/example.com/djangoprojekt
xyz00-meinuser:~$ sed -i "s~path('admin/'~#path('admin/'~g" djangoprojekt/urls.py
Das Djangoprojekt sollte jetzt unter https://example.com/fastcgi-bin/django.fcgi erreichbar sein.
Tipp: Manchmal werden Änderungen in den Quellen, insbesondere der settings.py nicht übernommen. Dann hilft es den Zeitstempel der Datei django.fcgi mit touch zu aktualisieren:
xyz00-meinuser:~$ touch doms/example.com/fastcgi-ssl/django.fcgi
Alternativ kann der Prozess gestoppt werden:
xyz00-meinuser:~$ ps xaf | grep django.fcgi
8091 pts/1 S+ 0:00 | \_ grep django.fcgi
7195 ? Sl 0:01 | \_ /.../djangoenv/bin/python django.fcgi
xyz00-meinuser:~$ kill 7195
Apache Weiterleitung
Nun wird das Djangoprojekt unter www.example.com verfügbar gemacht. Hierfür wird eine .htaccess im entsprechenden Domainverzeichnis angelegt:
xyz00-meinuser:~$ cd doms/example.com
xyz00-meinuser:~$ cat > .htaccess <<FINISH
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /fastcgi-bin/django.fcgi/$1 [QSA,L]
FINISH
Nun sollte die Seite unter (www.)example.com erreichbar sein.