einfache Python Website mit SimpleHttpServer

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Hallo,
kann mir jemand helfen dieses Skript zum Laufen zu bekommen?

Es soll mir einfach nur den body im Browser hervorzaubern :)

Code: Alles auswählen


import SimpleHTTPServer
import SocketServer

PORT = 8000

appname = "App1"

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "serving at port", PORT
httpd.serve_forever()

body = '<div class=cell button>'
body += ' <img src=./icons/'+ print appname +'.png onclick=image(this) />'
body += '<h3>'.+ print appname +'</h3>'
body += '</div>'
Ich programmiere normalerweise php,
das hier würde ich aber gerne in Python schreiben,
da Python ja eigentlich auf allen linux Rechnern schon installiert ist..

Mfg d
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Was für einen Fehler bekommst du denn?
Woran hapert es?
Was hast du denn bisher versucht?
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Also ein:

Code: Alles auswählen

print body
Gibt mir den Text ja auf die Konsole...
Wie schicke ich es an den Browser?

Fehler habe ich folgenden:

Code: Alles auswählen

body += ' <img src=./icons/'+ print appname +'.png />'
                                  ^
SyntaxError: invalid syntax
Es ist halt die Frage wie ich am besten Python Befehle innerhalb des HTML ausführe?
BlackJack

@djevil: Python innerhalb von HTML ausführen ist keine gute Idee. Das ist doch nicht PHP. :twisted:

Und bevor Du Dir mit `SimpleHttpServer` etwas wie Bottle oder Flask selber bastelst, solltest Du eventuell gleich Bottle oder Flask verwenden.
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

dann würde der Code aber nicht mehr nativ laufen,
also ein Anwender müsste erst das FW installieren
(Was ja nicht allzu schlimm ist, aber dann könnte ich auch php nehmen)
BlackJack

@djevil: Also Bottle ist *eine* Datei, die man auch einfach in das gleiche Verzeichnis legen kann. Ansonsten nimm halt PHP. Python ist im Gegensatz zu PHP als allgemeine Programmiersprache konzipiert, und da braucht mal halt ein Webrahmenwerk wenn man sich das nicht selber schreiben möchte. Was den Aufwand IMHO nicht lohnt.

Edit: Das Beispiel mit Bottle:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
from bottle import route, run, static_file, template


PORT = 8000
APP_NAME = 'App1'


@route('/icons/<filename>')
def server_static(filename):
    return static_file(filename, root='/path/to/your/static/files')


@route('/')
def index():
    return template(
        '<div class=cell button>\n'
        '  <img src=./icons/{{app_name}}.png onclick=image(this) />\n'
        '  <h3>{{app_name}}</h3>\n'
        '</div>',
        app_name=APP_NAME
    )


def main():
    run(host='', port=PORT)


if __name__ == '__main__':
    main()
Wobei ich persönlich lieber Jinja2 als Template-Engine verwende als die einfachen Templates die Bottle schon mit bringt.
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Ja, das sieht gut aus,... :)

Gibt es noch eine Möglichkeit ohne Restart/Reload zu aktualisieren?
BlackJack

@djevil: Schau Dir mal die optionalen Argumente von `bottle.run()` an.
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Ja, geht wohl in Richtung:

Code: Alles auswählen

 main():
    run(host='', port=PORT, push = True)
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Also:

Code: Alles auswählen

>>> inspect.getargspec(bottle.run)
ArgSpec(args=['app', 'server', 'host', 'port', 'interval', 'reloader', 'quiet', 'plugins', 'debug'], varargs=None, keywords='kargs', defaults=(None, 'wsgiref', '127.0.0.1', 8080, 1, False, False, None, None))
Ok, also: reloader=True :)

So, schönen Dank und schönen Abend noch!
BlackJack

@djevil: `inspect` ist da vielleicht nicht so hilfreich wie `help()`. Oder auch die Dokumentation vom Projekt.
Antworten