Raspberry Pi GPIO unter Apache2

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
LutzKö
User
Beiträge: 7
Registriert: Freitag 16. März 2018, 22:53

Freitag 16. März 2018, 23:17

Hallo, ich habe folgendes Problem:
Ich habe mit Django auf einem Raspberry Pi ein Web-Interface aufgebaut, welches mir Daten aus eine Sqlite-Datenbank darstellt. In der umgekehrten Richtung werden durch Buttons und den entsprechenden Views auf dem Raspberry Pi GPIOs gesetz bzw über das SPI-Interface externe Bausteine angesprochen. Dazu habe ich in das Django-Projekt eine entsprechendes Python-Script eingeführt.
Diese ganzen Funktionen arbeiten mit dem Django-Entwicklungsserver problemlos.
Jetzt habe ich das ganze auf Apache2 umgestellt. Auch in dieser Konstellation werden ( fast ) alle Funktionen erfolgreich ausgeführt. Wenn ich jedoch das Python-Script für den Zugriff auf die GPIO und das SPI-Interface des Raspberry Pi hinzufüge ( import RPi.GPIO , import spidev ), liefert Apache die Fehlermeldung das diese Module nicht gefunden werden und bricht die Darstellung ab.
Gibt es für dieses Problem eine direkte Lösung oder nur den Weg über ein cgi-Script unter Apache ?

Danke

Lutz
__deets__
User
Beiträge: 4029
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 16. März 2018, 23:41

Lass den Apache weg. Wozu ist der gut? In deinem Fall sorgt er nur dafür, das die ganze Zeit neue Prozesse erzeugt werden, die den bestehenden Programmzustand vergessen, und dann kommt halt Essig raus.
LutzKö
User
Beiträge: 7
Registriert: Freitag 16. März 2018, 22:53

Sonntag 18. März 2018, 17:25

Hallo __deets__,
was heißt lass den Apache weg. Wenn ich mit dem Gesamtprojekt in Produktion gehe, müsste während des bootens erst die Entwicklungsumgebung für Django gestartetet werden ( source /media/web/hausenv/bin/activate ), dann der Django-Server gestartet werden ( python /media/web/haus/manage.py runserver xxx.xxx.xxx.xxx:8000 ) und schließlich das Programm für die Haustechnik, welches besagte Sqlite-Datenbank aktualisiert, auch noch gestartet werden. Richtig ?

Lutz
Sirius3
User
Beiträge: 8826
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 18. März 2018, 17:30

@LutzKö: ja, genau. Und wenn Du noch ein Apache hast, mußt Du den auch noch zusätzlich starten. Und diesen Zusatzschritt kannst Du Dir sparen.
__deets__
User
Beiträge: 4029
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 18. März 2018, 17:49

LutzKö hat geschrieben:Hallo __deets__,
was heißt lass den Apache weg. Wenn ich mit dem Gesamtprojekt in Produktion gehe, müsste während des bootens erst die Entwicklungsumgebung für Django gestartetet werden ( source /media/web/hausenv/bin/activate ), dann der Django-Server gestartet werden ( python /media/web/haus/manage.py runserver xxx.xxx.xxx.xxx:8000 ) und schließlich das Programm für die Haustechnik, welches besagte Sqlite-Datenbank aktualisiert, auch noch gestartet werden. Richtig ?

Lutz
Nein. Das activate braucchst du nicht, sondern du kannst einfach das python in /media/web/hausenv/bin/ nehmen, und damit direkt deinen Django-Server starten. Das ist dann das richtige Setup.

Was das sqlite-Programm tut oder nicht weiss ich natuerlich nicht.

Und dann laeuft der Django-Server, und alles ist gut. Falls es dir wichtig ist, auf Port 80 zu laufen (oder gar 443, dank let's encrypt), dann kannst du zB mit dem NGINX ein forwarding machen, so dass der Django-Server irgendwo auf einem unprivilgierten Port laufen kann. Ggf. ist das aber auch nicht noetig, sollte deine GPIO-Nutzung schon root-Rechte vorraussetzen.
Sirius3
User
Beiträge: 8826
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 18. März 2018, 18:03

@__deets__: dafür braucht man keinen eigenen Server, sondern dafür reicht iptables, außer man möchte einen HTTPS-Endpoint mit HTTP/2.
LutzKö
User
Beiträge: 7
Registriert: Freitag 16. März 2018, 22:53

Sonntag 18. März 2018, 21:37

Irgendwie bin ich neben der Spur: Ich habe ein script erstellt

#!/bin/sh
sleep 10
python /media/web/haus/manage.py runserver xxx.xxx.xxx.xxx:8000

und lass es über rc.local ausführen. Bricht mit der Meldung invalid syntax ab. Gleiche Meldung bekomme ich auch, wenn ich in der Konsole den Befehl ohne aktivierte Entwicklungsumgebung starte.
wenn ich

#!/bin/sh
sleep 10
/media/web/hausenv/bin/python /media/web/haus/manage.py runserver xxx.xxx.xxx.xxx:8000

verwende, wird python nicht gefunden
__deets__
User
Beiträge: 4029
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 18. März 2018, 21:43

Das erste kann nicht klappen weil du schon das Venv Python benutzen musst.

Beim zweiten musst du den vollen Pfad angeben der natürlich existieren muss. Bin mir sicher du findest das richtige nach etwas suchen.
LutzKö
User
Beiträge: 7
Registriert: Freitag 16. März 2018, 22:53

Montag 19. März 2018, 11:46

Ich habe eine Lösung gefunden, stecke aber dennoch fest:

#!/bin/sh
sleep 10
cd /media/web/hausenv
. bin/activate
cd /media/web/haus
python manage.py runserver xxx.xxx.xxx.xxx:8000 &

Damit läuft der Server nach den booten als Hintergrundprozess.
Wenn ich dann das Hausprogramm starte und mit curses eine eigene Oberfläche erstelle, werden alles Meldungen vom Django-Server ( Start, Seitenwechsel etc ) in der Oberfläche angezeigt.
__deets__
User
Beiträge: 4029
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 19. März 2018, 21:48

Ich bin mir sicher, dass das auch ohne activate ginge. Aber wenn’s klappt ist ja auch ok. Nur was jetzt dein Problem von dem du sprichst genau ist - das erschließt sich mir nicht.
Antworten