Django installieren: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
 
(24 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
===Installation Djangobibliothek===
== Allgemeines ==
Die Djangobibliotheken werden in einer Virtualenv-Umgebung installiert. Vorraussetzung ist ein auf dem System installiertes python mit einem virtualenv-Paket
 
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:
Zunächst wird die Virtualenvumgebung erstellt:
<pre>
<syntaxhighlight lang=bash>
xyz00-doms:~$ virtualenv djangoenv
xyz00-meinuser:~$ virtualenv -p /usr/bin/python3 djangoenv
New python executable in djangoenv/bin/python
Already using interpreter /usr/bin/python3
Installing setuptools............done.
Using base prefix '/usr'
</pre>
New python executable in djangoenv/bin/python3
Also creating executable in djangoenv/bin/python
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.
<pre>
<syntaxhighlight lang=bash line>
xyz-doms:~$ djangoenv/bin/easy_install django
xyz00-meinuser:~$ source djangoenv/bin/activate
Searching for django
(djangoenv) xyz00-meinuser:~$ pip3 install django
Reading http://pypi.python.org/simple/django/
...
Reading http://www.djangoproject.com/
Successfully installed asgiref-3.3.4 django-3.2 pytz-2021.1 sqlparse-0.4.1 typing-extensions-3.7.4.3
Best match: Django 1.3
</syntaxhighlight>
.
 
.
.
Finished processing dependencies for django
</pre>
Testen, ob Django installiert ist:
Testen, ob Django installiert ist:
<pre>
<syntaxhighlight lang=python>
xyz-doms:~$ djangoenv/bin/python
(djangoenv) xyz00-meinuser:~$ djangoenv/bin/python
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)  
Python 3.7.3 (default, Jan 22 2021, 20:04:44)
[GCC 4.4.5] on linux2
[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)
>>>  
>>>  
</pre>
</syntaxhighlight>
Mit Ctrl-D kann die Konsole wieder verlassen werden.
Mit Ctrl-D kann die Konsole wieder verlassen werden.


===Django-Projekt===
Alternativ kann die aktuell installierte Version von Django so angezeigt werden:
Dann wird das Django Projekt im Bereich einer Domain abgelegt.
<syntaxhighlight lang=bash>
<pre>
(djangoenv) xyz00-meinuser:~$ python -m django --version
xyz-doms:~$ cd ~/doms/example.com/
3.2
xyz-doms:~$ /path_to_djangoenv/djangoenv/bin/django-admin.py startproject djangoprojekt
</syntaxhighlight>
</pre>
 
Nun kann man die Virtualenvumgebung wieder verlassen:
(djangoenv) xyz00-meinuser:~$ deactivate
 
== Django-Projekt anlegen ==
Dann wird das Django Projekt als Domain-Admin angelegt:
 
<syntaxhighlight lang=bash>
xyz00-meinuser:~$ source djangoenv/bin/activate
(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:
  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
</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.
<pre>
<syntaxhighlight lang=bash>
xyz00: /path_to_djangoenv/djangoenv/bin/python manage.py runserver  
(djangoenv) xyz00-meinuser:~$ python manage.py runserver
Validating models...
Watching for file changes with StatReloader
Performing system checks...


0 errors found
System check identified no issues (0 silenced).
Django version 1.3, using settings 'mysite.settings'
Django version 3.2, using settings 'djangoprojekt.settings'
Development server is running 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.
</pre>
</syntaxhighlight>
... und die ''settings.py'' an die Hostsharing-Pfade angepasst.
 
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
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>


===Nutzung mit FastCGI===
Die Verzeichnisse "subs/www" und "subs-ssl/www" werden gelöscht.
Zunächst richtet man den FastCGI-Skript (django.fcgi) ein und legt es im fastcgi-Verzeichnis ab und macht es ausführbar:
Die Datei .htaccess im Verzeichnis "htdocs-ssl" wird ebenfalls gelöscht.


<pre>
In "htdocs-ssl" wird ein symbolischer Link auf das static Verzeichnis angelegt:
#!/path_to_djangoenv/djangoenv/bin/python
<syntaxhighlight lang=bash>
xyz00-meinuser$ cd ~/doms/example.com/htdocs-ssl
xyz00-meinuser$ ln -s ~/djangoprojekt/static
</syntaxhighlight>


import os, sys
In "app-ssl" wird eine Datei "passenger_wsgi.py" mit folgendem Inhalt abgelegt:
os.chdir("/path_to_doms/doms/example.com/djangoprojekt/")
 
os.environ['DJANGO_SETTINGS_MODULE']= "djangoprojekt.settings"
<syntaxhighlight lang=python>
sys.path.insert(0, "/path_to_doms/doms/example.com/djangoprojekt/")
from djangoprojekt.wsgi import application
from django.core.servers.fastcgi import runfastcgi
</syntaxhighlight>
runfastcgi(method="threaded", daemonize="false")
 
</pre>
Das Django Projekt ist nun unter https://example.com erreichbar.


Das Djangoprojekt sollte jetzt unter example.com/fastcgi-bin/django.fcgi erreichbar sein.
==Nutzung mit FastCGI und WSGI via flup==
Wenn man doch nicht Passenger einsetzen will, geht es auch kompliziert über FastCGI:


===Nutzung mit WSGI via flup===
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 richtet man den FastCGI-Skript (django.fcgi) ein und legt es im fastcgi-Verzeichnis ab und macht es ausführbar:


<pre>
<syntaxhighlight lang=bash>
#!/path_to_djangoenv/djangoenv/bin/python
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 os, sys
os.chdir("/path_to_doms/doms/example.com/django")
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"
os.environ['DJANGO_SETTINGS_MODULE']= "djangoprojekt.settings"
sys.path.insert(0, "/path_to_doms/doms/example.com/django")
sys.path.insert(0, "$HOME/djangoprojekt")
sys.path.insert(0, "/path_to_doms/doms/example.com/django/djangoprojekt")
sys.path.insert(0, "$HOME/djangoprojekt/djangoprojekt")


from flup.server.fcgi import WSGIServer
django.setup(set_prefix=False)
from django.core.handlers.wsgi import WSGIHandler
WSGIServer(WSGIHandler()).run()
WSGIServer(WSGIHandler()).run()
</pre>
FINISH


Das Djangoprojekt sollte jetzt unter example.com/fastcgi-bin/django.fcgi erreichbar sein.
xyz00-meinuser:~$ chmod a+x fastcgi-ssl/django.fcgi
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>
 
Außerdem muss flup installiert werden:
<syntaxhighlight lang=bash>
xyz00-meinuser:~$ source djangoenv/bin/activate
(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:
<syntaxhighlight lang=bash>
xyz00-meinuser:~$ cd doms/example.com/djangoprojekt
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.
 
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-meinuser:~$ touch doms/example.com/fastcgi-ssl/django.fcgi
</syntaxhighlight>
 
Alternativ kann der Prozess gestoppt werden:
<syntaxhighlight lang=output>
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
</syntaxhighlight>


===Apache Weiterleitung===
===Apache Weiterleitung===
Zeile 88: Zeile 204:
Hierf&uuml;r wird eine .htaccess im entsprechenden Domainverzeichnis angelegt:
Hierf&uuml;r wird eine .htaccess im entsprechenden Domainverzeichnis angelegt:


<pre>
<syntaxhighlight lang=bash>
xyz00-meinuser:~$ cd doms/example.com
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]
</pre>  
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: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.

Links