HTTPD Webserver mit externe CSS und Bilder

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
anonym01

Hallo Zusammen, habe mir mal auf dem Notebook mit PyCharm mal die Umgebung nachgebaut.
Aktuell habe ich nen http server welche die index.html Informationen via PAGE ausliest und auf dem Browser tatsächlich wieder ausgibt.

Code: Alles auswählen

import socketserver
from threading import Condition
from http import server

PORT_NUMBER = 8080  # Maybe set this to 9000.

PAGE = """\
<html>
<head>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<h1>Hallo</h1>
</body>
</html>
"""


class MyHandler(server.BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/':
            self.send_response(301)
            self.send_header('Location', '/index.html')
            self.end_headers()
        elif self.path == '/index.html':
            content = PAGE.encode('utf-8')
            self.send_response(200)
            self.send_header('Content-Type', 'text/html')
            self.send_header('Content-Length', len(content))
            self.end_headers()
            self.wfile.write(content)
        if self.path == '/':
            self.send_response(301)
            self.send_header('Location', '/css/style.css')
            self.end_headers()
        elif self.path == '/css/style.css':
            self.send_response(200)
            self.send_header('Content-Type', 'text/css')
            self.end_headers()
        else:
            self.send_error(404)
            self.end_headers()


class StreamingServer(socketserver.ThreadingMixIn, server.HTTPServer):
    allow_reuse_address = True
    daemon_threads = True


if __name__ == '__main__':

    try:
        address = ('', 8000)
        server = StreamingServer(address, MyHandler)
        server.serve_forever()
    except KeyboardInterrupt:
        pass
    server.server_close()

Zusätzlich habe ich noch eine weitere If Schlaufe erstellt welche überprüft ob auf dem "server" den Verzeichnis css/ existiert und ob da drin auch eine style.css befindet.

Code: Alles auswählen

        if self.path == '/':
            self.send_response(301)
            self.send_header('Location', '/css/style.css')
            self.end_headers()
        elif self.path == '/css/style.css':
            self.send_response(200)
            self.send_header('Content-Type', 'text/css')
            self.end_headers()
Das hat soweit alles gut funktioniert, sogar auf dem Browser beim Inspect hat der server das Verzeichnis sowie die style.css Datei gefunden.
Jedoch kam der Inhalt der style.css leider nicht mit. Bedeutet die Datei ist leer, ob wohl die style.css mit Inhalt gefüllt ist.

Würde gerne hier das Bild hochladen, weiss aber nicht wie dies geht sorry :(

Was habe ich übersehen, könnte jemand sich dies anschauen?
Besten Dank
F
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da du den Inhalt der Datei nicht schreibst - anders als bei dem index.html - ist das ja auch kein Wunder.

Du hast die Frage nicht beantwortet, warum das mit Flask (das sowas schon fertig kann) angeblich nicht geht. Warum machst du dir das Leben schwerer als notwendig?
anonym01

Nevermind habe mir da was besseres rausgefischt.

Code: Alles auswählen

import socketserver
from threading import Condition
from http import server
import os

PORT_NUMBER = 8080  # Maybe set this to 9000.



class MyHandler(server.BaseHTTPRequestHandler):
    def do_GET(self):
        #root = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'test')
        root = '/Users/user/PycharmProjects/webserver_pi'
        if self.path == '/':
            filename = root + '/index.html'
        else:
            filename = root + self.path

        self.send_response(200)
        if filename[-4:] == '.css':
            self.send_header('Content-type', 'text/css')
        elif filename[-5:] == '.json':
            self.send_header('Content-type', 'application/javascript')
        elif filename[-3:] == '.js':
            self.send_header('Content-type', 'application/javascript')
        elif filename[-4:] == '.ico':
            self.send_header('Content-type', 'image/x-icon')
        else:
            self.send_header('Content-type', 'text/html')
        self.end_headers()
        with open(filename, 'rb') as fh:
            html = fh.read()
            # html = bytes(html, 'utf8')
            self.wfile.write(html)


class StreamingServer(socketserver.ThreadingMixIn, server.HTTPServer):
    allow_reuse_address = True
    daemon_threads = True


if __name__ == '__main__':

    try:
        address = ('', 8000)
        server = StreamingServer(address, MyHandler)
        server.serve_forever()
    except KeyboardInterrupt:
        pass
    server.server_close()

Auf dieser Art und Weise gefällt es mir umso besser. Habe die Dateien auch statisch irgendwo aufm server abgelegt und gut ist.
Sobald ich zu Hause bin wird dies mit dem Pi ausprobiert und geprüft ob ich den Stream noch rein kriege.

Warum ich das mit Flask nicht wage.. Erstens möchte ich meine Python skills verbessern und einen gewissen touch anlegen für diese Geschichte. Zweitens der Sinn dieser Übung wäre dass ich am Ende auf dem Browser sagen kann. Nun starte mir den Live stream, nehme aktuell das auf was du siehst und speichere es irgendwo ab.

Ich habe den part für den Live stream bereits, den part für die Aufnahme habe ich ebenso.

Ich hatte echt nur dieses eine kleine Issue .

Mit Sicherheit wäre dieses ganze Projekt einfacher gewesen mit einem framework wie flask, hatte und wollte die Zeit anders investieren. :D
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

@firedotwater: Was ist eigentlich eine if-Schlaufe?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Das ist so etwas, wie ein historischer Flußlauf. Der liegt noch neben dem aktuellen in geschleifter Form, wird aber nicht mehr durchlaufen … quasi „durchschlaufen“ … 8)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@firedotwater: du benutzt also lieber statt einer sicheren, einfach zu bedienenden Bibliothek etwas halbwegs funktionierendes aus dem Internet gefummeltes, das zudem eine riesige Sicherheitslücke in Deinen Rechner gräbt und wo Du schon mehr Zeit reininvestiert hast, als der Umstieg auf flask gedauert hätte. Zudem hättest Du deine Pythonskills in eine vernünftige Richtung erweitern können. Aber bitte, jeder wie er mag.
Antworten