Einführung in whitenoise

Django, Flask, Bottle, WSGI, CGI…
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

noisefloor hat geschrieben: Montag 26. Februar 2024, 13:14 apropos statische Dateien: da ja neulich "rausgekommen" ist, dass du bei Uberspace deine Django App über den Dev-Server von Django auslieferst - wovon explizit abgeraten wird - musst du dich sowie nochmal mit dem Thema "statische Dateien für den Produktivbetrieb ausliefern" befassen.
Darum werfe ich nochmal (auch das Thema hatten wir schon mal) Whitenoise in den Raum.
Bei Interesse -> starte bitte einen neuen Thread dazu
Hallo noisefloor! das wäre toll wenn du mir bei dem Thema auf die Sprünge helfen könntest. Du (ich nehme an, dass du das warst) hast mir das Thema schon mal empfohlen und da ich versuche, allen eure Empfehlungen zu folgen, habe ich die Seite auch schon mal angeschaut. Mir ist aber (mal wieder) die Brisanz nicht so ganz einsichtig. Ich habe den Ordner, den "collecstatic" erzeugt nach der Anleitung von uber.de in den entsprechenden Ordenr gepackt. Seit daher habe ich zwei oder dreimal eine Datei dort ersetzt und fand das nicht weiter aufregend.
Auf der verlinkten Seite wird zwar erwähnt, wie prima und wichtig dieses whitenoise ist und wie man es installiert ... es fehlt aber eine Erklärung warum das so wichtig ist.
Anmerkung (wahrscheinlich schimpft ihr wieder :( ): ich habe auch kein shoestring installiert.
Dass meine Methode (beziehungsweise fehlende Methode) des Development überarbeitet werden muss, sehe ich gerne ein. Wenn ich das richtig sehe, werden normalerweise nicht einfach die geänderten Daten ausgetauscht (wie ich das mache) sondern das ganze Paket. Wo liegt den das Problem mit dem Dev_Server von Django? Was macht der? Und warum soll er das nicht?
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also hier https://whitenoise.readthedocs.io/en/stable/index.html steht dazu ja was. Cache-Header zB verhindern, dass der Browser das immer gleiche Logo deines Rechentrainers runterlaedt. Kompression ist sicher selbsterklaerend. Beides spart Zeit und Geld auf allen Seiten. Und weil es spezialisiert auf static content delivery ist, durchlaeuft das weniger Python-Code, und ist damit weniger belastend fuer den Server.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Wollen wir uns nicht zunächst mal um die content delivery konzentrieren, da sehe ich ja vielleicht klarer. Meine css-Dateien sind wirklich sehr klein und überschaubar und Logo habe ich auch keines.
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

Ich nehme an, dass mit "Dev-Server" gemeint ist, dass "./manage.py runserver" in der Produktion verwendet wird, ist das korrekt? Das macht man aus mehreren Gründen nicht. Ausreichend sollte eigentlich schon sein, dass die Django Entwickler selbst ausdrücklich davon abraten. Das ist ein Werkzeug für die Software-Entwicklung mit zusätzlichen Features, die beim Entwickeln praktisch sind (z.B. dass er automatisch neu startet, wenn man etwas austauscht) und ohne Features, die beim Entwickeln eher stören, insb. in Hinblick auf Performance und Sicherheit.

Django selbst lässt man heute bevorzugt in einem WSGI Server wie Gunicorn oder uWSGI (hinter einem reverse Proxy) laufen. Und diese WSGI-Server können selbst auch gar keine statischen Dateien ausliefern. Daher benutzt man in der Produktion für das Ausliefern der statischen Inhalte entweder einen ausgewachsenen Webserver, der für so etwas gedacht ist (Apache, Nginx) oder eben whitenoise, wenn man sich das ersparen will und nicht übermäßig viel Traffic erwartet.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Auweh, das sieht nach viel Arbeit aus. Also zunächst mal das für mich einfachste: Soweit ich informiert bin, habe ich einen Webserver namens Gunicorn (den heben mir die netten leute bei uber angelegt). Was passiert jetzt, wenn ich "rt-dev@.service" aus dem Ordner auf uber.de entferne? Ich vermute, dann muss ich den Server neu starten wenn ich eine Datei dort ändere?
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

nezzcarth hat geschrieben: Dienstag 27. Februar 2024, 17:38 Ich nehme an, dass mit "Dev-Server" gemeint ist, dass "./manage.py runserver" in der Produktion verwendet wird, ist das korrekt?
Wo würde ich einen entsprechenden Eintrag finden?
Ich habe eine Datei rt-dev@.service in meinem Rootordner (den hat @whitie mir angelegt). Da steht:

Code: Alles auswählen

[Unit]
Description=Run Django development server on port 8080

[Service]
User=%i
Restart=on-failure
WorkingDirectory=/home/%i/rt-env/rechentrainer
ExecStart=/home/%i/rt-env/bin/python /home/%i/rt-env/rechentrainer/manage.py runserver 0.0.0.0:8080

[Install]
WantedBy=default.target
drin. Der Code ist aber doch wahrscheinlich nur auf meinem lokalen Server relevant?
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

nezzcarth hat geschrieben: Dienstag 27. Februar 2024, 17:38 Und diese WSGI-Server können selbst auch gar keine statischen Dateien ausliefern. Daher benutzt man in der Produktion für das Ausliefern der statischen Inhalte entweder einen ausgewachsenen Webserver, der für so etwas gedacht ist (Apache, Nginx) oder eben whitenoise, wenn man sich das ersparen will und nicht übermäßig viel Traffic erwartet.
Meine statischen Dateien funktionieren ja. wie bekomme ich raus warum? Habe ich Apache, Nginx oder gar einen Sioux? Whitenoise müsste ich ja wahrscheinlich wissen?
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Pitwheazle hat geschrieben: Dienstag 27. Februar 2024, 18:55 Ich habe eine Datei rt-dev@.service in meinem Rootordner (den hat @whitie mir angelegt).
Und @whitie ist ein Admin aus der Schule oder wie müssen wir uns das vorstellen? Läuft die Seite von deinem privaten Rechner (kann ich mir kaum vorstellen) oder gibt es einen Klon deines Projekts im Produktiv-Betrieb?
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Da ich mich (wie ihr ja alle wisst) immer etwas dusselig anstelle, hat mir @whitie hier aus dem Forum den Anfang meines Projektes erstellt - irgendwann im Jahre 2021?. Darauf baut alles auf und seit daher ist auch dieses rt-dev@.service da drin. Und das ganze habe ich bei uberspace.de hochgeladen - ja, ein Clon - und da läuft es.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Gunicorn ist der WSGI Applikationsserver (so ziemlich der gängigsten für Python-Webapplikationen). Gunicorn ist _kein_ Webserver. Gunicorn kann "nur" Python WSGI-Applikationen (=DER Standard für Python) liefern. WSGI sieht nicht das ausliefern von statischen Dateien (CSS, JS, Bilder, Videos vor). Das macht der Webserver - den man natürlich entsprechend konfigurieren muss.

Abhilfe: Whitenoise. Das kann man in Django integrieren und es kümmert sich dann um's Ausliefern der statischen Dateien im Produktivbetrieb. Bzw. Man kann Whitenoise so in Django integrieren, dass man die Django Applikation 1:1 in den Produktivprobetrieb übernehmen kann. Mann muss halt nur vor dem Deployment 1x `python manage.py collectstatic` ausführen, damit Django für den Produktivbetrieb die static files sammelt und ins benötigten Verzeichnis kopiert.

Whitenoise hat irgendwo ein Limit, wo es Sinn macht, den Webserver zum Ausliefern der statischen Dateien zu nehmen. In deinem Fall ist aber Whitenoise die bessere Wahl - weil es einiges einfacher macht. Siehe auch https://whitenoise.readthedocs.io/en/la ... -questions.

Bei mir sieht die funktionierende Konfiguration in der settngs.py so aus:

Code: Alles auswählen

...
INSTALLED_APPS = [
    'whitenoise.runserver_nostatic',
    #danach alles, was aktuell auch in der Liste drin ist...]
 ...
 MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    # danach alles was aktuell auch in der Liste drin ist...]
...
STORAGES = {
    "staticfiles": {
        "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
    },
}
# weitere Optionen für Whitenoise nach eigenem Bedaf
...
STATIC_URL = 'static/'
STATICFILES_DIRS = [
    BASE_DIR / "static",
 ]
STATIC_ROOT = BASE_DIR / 'staticfiles'
Fertig. Siehe auch https://whitenoise.readthedocs.io/en/la ... jango-apps und https://whitenoise.readthedocs.io/en/latest/django.html.

Gruß, noisefloor
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

snafu hat geschrieben: Dienstag 27. Februar 2024, 19:09
Pitwheazle hat geschrieben: Dienstag 27. Februar 2024, 18:55 Ich habe eine Datei rt-dev@.service in meinem Rootordner (den hat @whitie mir angelegt).
Und @whitie ist ein Admin aus der Schule oder wie müssen wir uns das vorstellen? Läuft die Seite von deinem privaten Rechner (kann ich mir kaum vorstellen) oder gibt es einen Klon deines Projekts im Produktiv-Betrieb?
Nein bin ich nicht. Der Service war nur dazu gedacht, auf meinem vServer bei Netcup die Django-Beispiel-App komfortabel starten/beenden zu können. Er war ganz sicher nicht für einen produktiven Betrieb gedacht (daher auch das -dev im Name).

Viele Grüße
Whitie
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Hey @Whitie, kann ich die Datei jetzt einfach rauswerfen?
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

Pitwheazle hat geschrieben: Dienstag 27. Februar 2024, 18:58 Meine statischen Dateien funktionieren ja. wie bekomme ich raus warum? Habe ich Apache, Nginx oder gar einen Sioux? Whitenoise müsste ich ja wahrscheinlich wissen?
Wenn die Menschen bei Uberspace, die für dich Gunicorn installiert haben, dies entsprechend ihrer eigenen (/Community) Anleitung getan haben, ist zu vermuten, dass sie dir das Ausliefern der statischen Dateien über Apache mit eingerichtet haben. S. a.: https://lab.uberspace.de/guide_django/#static-files

Du kannst ja prüfen, ob die dort beschrieben Dinge auf dein Setup zutreffen.
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Pitwheazle hat geschrieben: Dienstag 27. Februar 2024, 22:09 Hey @Whitie, kann ich die Datei jetzt einfach rauswerfen?
Ja. Die war nur für die Demo.
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

noisefloor hat geschrieben: Dienstag 27. Februar 2024, 21:04 Hallo,

Gunicorn ist der WSGI Applikationsserver (so ziemlich der gängigsten für Python-Webapplikationen). Gunicorn ist _kein_ Webserver. Gunicorn kann "nur" Python WSGI-Applikationen (=DER Standard für Python) liefern. WSGI sieht nicht das ausliefern von statischen Dateien (CSS, JS, Bilder, Videos vor). Das macht der Webserver - den man natürlich entsprechend konfigurieren muss.

Abhilfe: Whitenoise. Das kann man in Django integrieren und es kümmert sich dann um's Ausliefern der statischen Dateien im Produktivbetrieb. Bzw. Man kann Whitenoise so in Django integrieren, dass man die Django Applikation 1:1 in den Produktivprobetrieb übernehmen kann. Mann muss halt nur vor dem Deployment 1x `python manage.py collectstatic` ausführen, damit Django für den Produktivbetrieb die static files sammelt und ins benötigten Verzeichnis kopiert.

Whitenoise hat irgendwo ein Limit, wo es Sinn macht, den Webserver zum Ausliefern der statischen Dateien zu nehmen. In deinem Fall ist aber Whitenoise die bessere Wahl - weil es einiges einfacher macht. Siehe auch https://whitenoise.readthedocs.io/en/la ... -questions.

Bei mir sieht die funktionierende Konfiguration in der settngs.py so aus:

Code: Alles auswählen

...
INSTALLED_APPS = [
    'whitenoise.runserver_nostatic',
    #danach alles, was aktuell auch in der Liste drin ist...]
 ...
 MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    # danach alles was aktuell auch in der Liste drin ist...]
...
STORAGES = {
    "staticfiles": {
        "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
    },
}
# weitere Optionen für Whitenoise nach eigenem Bedaf
...
STATIC_URL = 'static/'
STATICFILES_DIRS = [
    BASE_DIR / "static",
 ]
STATIC_ROOT = BASE_DIR / 'staticfiles'
Fertig. Siehe auch https://whitenoise.readthedocs.io/en/la ... jango-apps und https://whitenoise.readthedocs.io/en/latest/django.html.

Gruß, noisefloor

Hallo zusammen,

Ich verstehe nachfolgendes nicht:
QuickStart for other WSGI apps
To enable WhiteNoise you need to wrap your existing WSGI application in a WhiteNoise instance and tell it where to find your static files. For example:

Code: Alles auswählen

from whitenoise import WhiteNoise

from my_project import MyWSGIApp

application = MyWSGIApp()
application = WhiteNoise(application, root="/path/to/static/files")
application.add_files("/path/to/more/static/files", prefix="more-files/")
And that’s it, you’re ready to go.
my_project = vermutlich der Name von meinem Projekt

was ist "MyWSGIApp" ?

Wie Ist der Pfad wenn Mein Projekt so aufgebaut ist?
menue\djangomenue\menue\static


Wie geht es dann hier weiter?

Danke schonmal
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Da steht "QuickStart for other WSGI apps".
Das ist also genau der Teil, den du nicht lesen musst, wenn du Django verwendest.
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

Jetzt sehe ich es.
Vielen Dank.

Ich habe das weggelassen und es funktioniert
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

OK, ein paar Dinge habe ich hinbekommen:
  • mein System auf uber habe ich jetzt von github geclont und hoffe, dass ich Änderungen in Zukunft mittels "pull" übertragen kann.
  • Es ist mir auch gelungen, meine pdf Datei(en) anzeigen zu lassen. Und meine .ots Dateien zum Download anzubieten
  • Es ist mir sogar gelungen, Ziele innerhalb einer pdf Datei anzuspringen
Jetzt müsste ich mich wohl noch um whitenoise, meine staticfiles und meine Medien kümmern. Wenn ich das richtig sehe, sollte ich meine medien (pdf Dateien und Dateien zum Download) in einen extra Ordenr packen.
Ich habe mal versucht, die Beschreibungen dazu zu verstehen, bin mir aber nicht sicher. In meinen settings steht:

Code: Alles auswählen

STATIC_ROOT = BASE_DIR / "staticfiles"
STATIC_URL = '/staticfiles/'
STATICFILES_DIRS = [BASE_DIR /"static"] 
Die untere Zeile gibt an, wo "collectstatic" in meinem Projekt nach staticfiles suchen soll - das sind bei mir drei Orte: Meine beiden apps und noch im rootverzeichnis liegen welche?
Die zweite Zeile gibt an, wie man über den Browser zugreifen kann. Mein Handbuch also z.B. zurzeit über "rechentrainer.app/staticfiles/medien/handbuch.pdf" und wenn ich diese Zeile in den settings zu "static" ändere, hat dies nur Auswirkungen auf z.b: diesen Aufruf in dem dann "staticfiles" in "static" geändert werden müsste?
Und die erste Zeile gibt an, wo die, von "collectstaic" gesammelten Dateien hingepackt werden?
Und jetzt müsste ich identische Einträge für meine pdf Dateien usw. machen? Oder lasse ich einfach alles wie es ist - es ist nicht vorgesehen, dass user Medien hochladen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

mir ist die Frage nicht klar... der Sinn von Whitenoise ist, dass du eine _einfacheres_ Deployment hast, weil sich Whitenoise um das Ausliefern aller statischer Dateien (CSS, PDF, JS, whatever) kümmert. Beim Entwickeln macht das der Dev-Server von Django, Produktiv machen das WSGI Server aber _nicht_, so dass du ohne Whitenoise deinen Webserver so konfigurieren, dass er die statischen Dateien ausliefert. Mit Whitenoise und entsprechender Konfig muss du nur beim Deployment `python3 manage.py collectstatic` ausführen, alles auf den Server kopieren und fertig.

Wenn du dich an die Vorgaben von Django gehalten hast, wo statische Dateien relativ im Projekt liegen sollen, dann sollte das IMHO so funktionieren. Also die richtige Einträge in der settings.py in `MIDDLEWARE` vorausgesetzt, siehe https://whitenoise.readthedocs.io/en/la ... whitenoise

Gruß, noisefloor
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Bisher habe ich whitenoise ja noch nicht eingebunden. Irgendwo habe ich gelesen, dass whitenoise nicht für Medien zuständig ist - oder habe ich das falsch verstanden?
Antworten