Python Sever erstellen [Anfänger]

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
JoniP10
User
Beiträge: 7
Registriert: Dienstag 21. Februar 2012, 16:43
Kontaktdaten:

Hallo Leute,

ich muss erst mal sagen dass ich ein Anfänger bin, und noch fast gar keine Anhnung von Python habe.
Ich habe mir erstmal vorgenommen einen simplen Webserver zu erstellen. Das habe ich auch geschafft:

Code: Alles auswählen

print("#############")
print("#RobboServer#")
print("#############")
print("")
import http.server as h
h.test(HandlerClass=h.SimpleHTTPRequestHandler)
Es klappt auch alles ganz gut, aber wie kann ich jetzt den Port und das Root-Verzeichnis verändern?
Ich hoffe das ich euch nicht nerver mit meinen komischen Anfängerfragen! :D
Aber wenn sie trotzdem einer findet, der mir helfen will, dann wäre ich sehr dankbar.
JoniP10.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

JoniP10 hat geschrieben:Es klappt auch alles ganz gut, aber wie kann ich jetzt den Port und das Root-Verzeichnis verändern?
Ich verwende kein Python 3, aber die Dokumentation von http.server kann ich dir trotzdem gerne heraussuchen.
Benutzeravatar
JoniP10
User
Beiträge: 7
Registriert: Dienstag 21. Februar 2012, 16:43
Kontaktdaten:

Ok erstmal danke für die schnelle Antwort.
Dort wird folgendes beschrieben:

Code: Alles auswählen

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

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

print("serving at port", PORT)
httpd.serve_forever()
Aber ich werde nicht schlau, wie ich das Root-Verzeichnis verändern soll. :?:
Vielleicht könnte mir ja nochmal einer helfen.
JoniP10

EDIT:

So sieht mein Code jetzt aus:

Code: Alles auswählen

print("#############   ")
print("#RobboServer#  by coder99! ")
print("#############   ")
print("")
import http.server
import socketserver

PORT = 8010

Handler = http.server.SimpleHTTPRequestHandler

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

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

Das liegt daran, das es kein Root gibt. Das ein http Server statische Files ausliefert ist nicht standart. Apache, nginx und Co tun das - aber mit http & damit dem Server hier hat das nix zu tun.

Wenn die solche Grundlagen (die ja nix mit Python zu tun haben) fehlen - wäre es da nicht besser du benutzt mal ein webframework, wie bottle, Flask oder django?
Benutzeravatar
JoniP10
User
Beiträge: 7
Registriert: Dienstag 21. Februar 2012, 16:43
Kontaktdaten:

Ok, ich habe mich falsch ausgedrückt.
Ich möchte einfach nur, dass die dateien, die der Server anderen zur verfügung stellt,
nicht in dem Ordner wo das Serverprogramm drin ist, liegen , sondern in einem Unterordner.
JoniP10.
deets

Ich habe dich schon verstanden. Du hast da eine falsche Vorstellung - HTTP hat erstmal nichts mit Dateien zu tun. Natuerlich ist es trivial, den self.path deines RequestHandlers in der do_GET-Methode auf ein Verzeichnis abzubilden, den mimetype rauszufummeln, und das Ganze dann auszuliefern.

Aber das musst du programmieren, es gibt kein root-Verzeichnis.

Nochmal: warum setzt du dich nicht mit bottle auseinander? Das hat zB eine Moeglichkeit, ein verzeichnis statisch auszuliefern.
Benutzeravatar
JoniP10
User
Beiträge: 7
Registriert: Dienstag 21. Februar 2012, 16:43
Kontaktdaten:

Ok dann werde ich deine Tipps befolgen.
Danke dafür. Aber wäre es nicht eine Möglichkeit eine "index.html" im Programmverzeichnis zu erstellen, und die dann auf das Verzeichnis "WebRoot" weiterleitet? Na ja, danke für die Tipps.
JoniP10.
deets

Zum wiederholten male: es gibt kein WebRoot, also kann man auch nicht darauf umleiten.
Benutzeravatar
JoniP10
User
Beiträge: 7
Registriert: Dienstag 21. Februar 2012, 16:43
Kontaktdaten:

Sry das ich nerver aber ich habe einfach einen Ordner so genannt^^.
Und Bottle habe ich mir angeschaut und ich denke das ist was ich brauch.
JoniP10.

EDIT:

Ich habe meinen Server nochmal hochgeladen, dann kannst du dir vielleicht mal anschauen,
was ich meine.
http://coder99.bplaced.de/files/RobboServer.zip
lunar

@JoniP10: Schon klar, doch was deets Dir zu sagen versucht, ist, dass das Konzept von "Ordner" und "Dateien" in HTTP gar nicht existiert. Der in Python eingebaute HTTP-Server kann so ohne weiteres keine Dateien aufliefern oder Verzeichnisse auflisten. Dir fehlen offensichtlich essentielle Grundlagen der Funktionsweise von HTTP, bevor Du also fortfährst mit dem Programmieren, wäre es ratsam, erst einmal die Wikipedia-Artikel zu HTTP zu lesen, damit Du überhaupt verstehst, womit Du da arbeitest.
Benutzeravatar
JoniP10
User
Beiträge: 7
Registriert: Dienstag 21. Februar 2012, 16:43
Kontaktdaten:

Ok das stimmt. Trotzdem danke für eure Hilfe! Könntet ihr mir vielleicht noch ein paar gute Tutorials oder Bücher über das Thema empfehlen?
Bb, JoniP10.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

JoniP10 hat geschrieben:Könntet ihr mir vielleicht noch ein paar gute Tutorials oder Bücher über das Thema empfehlen?
Je nachdem, auf welchem Level du anfangen willst. Ich arbeite mich gerade durch "Foundations of Python Network Programming" von Brandon Rhodes und John Goerzen. Das startet auf ziemlich tiefen Ebenen.
deets

@JoniP10

Wofuer ein Tutorial? Fuer Python, fuer ein bestimmtes Webframework, oder fuer HTTP generell? Fuer letzteres zumindest faellt mir nix ein - aber du kannst dir zB mal den Code fuer "cling" anschauen, ein minimaler statischer WSGI-server, den man auch stand-alone benutzen kann. Daraus kannst du lernen.
Benutzeravatar
JoniP10
User
Beiträge: 7
Registriert: Dienstag 21. Februar 2012, 16:43
Kontaktdaten:

Ja, soweit ich gelesen habe ist dieses Buch gut. Ich werde mich in dieses Tutorial einarbeiten, und dann erst mit meinen Programmen weiterarbeiten.
Thx für eure Hilfe!
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

deets hat geschrieben:fuer HTTP generell? Fuer letzteres zumindest faellt mir nix ein
http://de.selfhtml.org/ fand ich ganz gut, auch als Nachschlagewerk
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
deets

Abgesehen davon, dass das leider immer mehr veraltet - mit HTTP hat das nix zu tun. Es dreht sich um HTML.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Kebap hat geschrieben:http://de.selfhtml.org/ fand ich ganz gut, auch als Nachschlagewerk
Es geht aber um HTTP.
Edit: Hab die zweite Seite übersehen …
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Der in Python eingebaute HTTP-Server kann so ohne weiteres keine Dateien aufliefern oder Verzeichnisse auflisten.
Hat sich das in Python 3 verändert? Weil in Python 2 ging ``python2 -m SimpleHTTPServer 8080` wo er dann das aktuelle Verzeichnis ausliefert, an Port 8080, zusammen mit Directory Listing. Nutze ich ganz gerne für JS-Entwicklung.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
deets

Was damit gemeint ist: wenn man damit programmatisch arbeitet, dann gibt es kein Root-Dir, oder auch keine mod_proxy/mod_rewrite/mod_redirect artigen Funktionen. Von der standalone-Geschichte wusste ich nix, aber natuerlich waere die mal interessant fuer den OP zu sehen, wie man sowas implementiert.
BlackJack

Also mein HTTP/CGI-Mini-Test-Server sah so aus:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Very simple HTTP server with CGI support."""

__author__ = "Marc 'BlackJack' Rintsch"
__version__ = '0.1.0'
__revision__ = '$Rev$'
__date__ = '$Date$'

from BaseHTTPServer import HTTPServer
from CGIHTTPServer import CGIHTTPRequestHandler

def start_server(host='', port=8090):
    """Starts server, listening to given port on given host."""
    print "Start listening on %s:%d" % (host, port)
    try:
        HTTPServer((host, port), CGIHTTPRequestHandler).serve_forever()
    except KeyboardInterrupt:
        print "Ctrl+C caught.  Ciao..."

if __name__ == '__main__':
    start_server()
Antworten