Python auf Webservern - Ich finde keinen richtigen Einstieg

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Timtam
User
Beiträge: 5
Registriert: Freitag 18. Januar 2013, 18:58

Hallo Community,
ich habe folgendes Problem: Ich habe auf meinem Webserver bisher mit PHP gearbeitet. Da wir allerdings einen kommpletten Designwechsel etc vorhaben und ich sonst auch mehr mit Python am Hut habe als mit PHP habe ich vor, Webseitig auf Python umzusteigen. Nun habe ich mich bereits bei meinem Webserver-Anbieter erkundigt, ob ich denn mit Python arbeiten kann - laut ihm ist Python bereits als Umgebung vorinstalliert.
Ich habe mein Python-Wissen aus dem Galileo Openbook und dort war ebenfalls eine Anleitung für die Webseitenerstellung mit Django enthalten. Da dies allerdings schon wieder so alt ist, dass es nicht mehr aktuell ist und man sich teilweise in dem neuen Django-System etwas verloren geht muss ich sagen, dass mir CMS bzw. Systeme wie Django etwas suspekt sind, auch in PHP habe ich bisher ohne CMS gearbeitet, ich habe mir sozusagen mein eigenes CMS aufgebaut - soetwas habe ich auch in Python vor.
Nun versuche ich gerade eine Art Brücke zwischen PHP und Python zu schlagen. In PHP war ja das ganze Portmanagement etc vollkommen außen vor. Wenn ich jetzt aber Google nach Python auf Webservern befrage bekomme ich immer nur Anleitungen, wie ich denn selber nen kleinen Webserver in Python schreiben kann, aber das brauche ich doch, so glaube ich, gar nicht, da Python ja auf dem Webserver schon installiert ist. Und da geht die Verwirrung los:
Ist meine Annahme, dass ich dieses Portmanagement nicht mehr machen muss falsch? Und hat vielleicht einer von euch irgend einen Hinweis, wie ich am besten mit diesem Thema einsteigen kann?
Was mir dann auch unklar ist, da ich das ja alles in PHP, extra für Server konfiguriert etc, alles vorgegeben bekommen habe: Wo finde ich die ganzen Post/Get-Meldungen etc? Ich blicke in dem Python serverseitig noch nicht so ganz durch, wie man sieht....
Könnte sich da vielleicht jemand erbarmen?
mfg.
Timtam
PS: Hoffentlich bin ich in diesem Forum richtig....
koenigssphinx
User
Beiträge: 14
Registriert: Samstag 11. Mai 2013, 10:51
Kontaktdaten:

Hallo,
Es gibt ein Buch was sich in zwei Kapitel auf die Internetprogrammierung beschränkt.
Dieses Buch heißt Python GE-PACKT, ist aber nicht für Anfänger gedacht.
Dort steht auch, wie du einen eigenen Webserver mit Python programmierst.
Viel Spaß :wink:

Code: Alles auswählen

Königssphinx die 1. die Python kann
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Timtam hat geschrieben: Ich habe mein Python-Wissen aus dem Galileo Openbook
Das ist schlecht, da das Buch an vielen Stellen schlechtes und teilweise gar falsches vermittelt! Speziell der Teil zur OOP ist extrem schlecht; BlackJack hat dazu einen schönen Rant geschrieben: Link

Sei Dir also bewusst, dass Du Dir evtl. schon falsche und schlechte Dinge angeeignet hast, die Du in Zukunft "umlernen" darfst ;-)
Timtam hat geschrieben: ... muss ich sagen, dass mir CMS bzw. Systeme wie Django etwas suspekt sind, auch in PHP habe ich bisher ohne CMS gearbeitet, ich habe mir sozusagen mein eigenes CMS aufgebaut - soetwas habe ich auch in Python vor.
Du beschreibst gerade das NIH-Syndrom, welches bei unzähligen Entwicklern im PHP-Umfeld vorherrscht. (Meiner Meinung nach ein inhärentes Problem bei PHP)

Kurz und Knapp: Vergiss es!

Nutze Django zu Beginn und werde damit erst einmal glücklich. Es nimmt Dich an die Hand und hilft Dir, Fallstricke zu umgehen. Auch in anderen Sprachen fängt kein ernsthafter Entwickler heutzutage damit an, ohne Framework eine Web-Applikation zu bauen.

In anderen Bereichen erscheint das von sich aus schon natürlicher: Wenn Du eine GUI-Applikation bauen willst, dann greifst Du ja auch zu einem Framework oder einem GUI-Toolkit. Niemand fängt an, auf einem puren Grafik-Layer Fensterkomponenten zu entwickeln... und im Web sieht das eigentlich nicht anders aus. PHP-Entwickler lernen das allerdings nicht von Beginn an, da die Sprache ja "nur" im Web-Umfeld gelehrt wird. Sprich, alle Tutorials implementieren sofort eine dynamische Webseite. Somit verschwindet von vorn herein die Erkenntnis, dass man das eigentlich so niemals machen sollte.

In Python sollte man mit Konsolen Programmen anfangen, um die Sprache zu erlernen und sich erst dann um Webprojekte kümmern, wenn man die Basics drauf hat. Das gute daran ist, dass man durchaus bereits Domänenlogik implementieren kann, bevor man das erste mal "Django" ausprobiert. Man muss dann nicht einmal alles wegwerfen, sondern kann ggf. sogar Code direkt in die Web-Applikation mit hinüber nehmen.

Es gibt neben Django auch "schlankere" Rahmenwerke wie Flask oder Bottle, aber Django hat speziell für Dich den Vorteil, dass es als FullStack-Framework daher kommt und wirklich alles mitbringt, was man fürs Web braucht. Bei den anderen musst Du Dir noch weitere Frameworks für spezielle Aufgaben (ORM / SQL-Abstraktion, Formularvalidierung, Authentifizierung, ggf. sogar Templating, usw.) dazu suchen. Das fällt einem Anfänger eher schwieriger, da er noch wenig "kennt" im Python-Umfeld. Zudem bietet Django ein durchgängiges Tutorial über alle möglichen Dinge und hat eine große Verbreitung.

Die Frage ist evtl. eher, ob Du an sich schon in Python fit genug dafür bist oder evtl. auch schlicht Wissenslücken um gebräuchliche Pattern im Webumfeld hast? Wenn Du in PHP ein reiner "Selberbastler" warst, hast Du Dich vermutlich dort auch (zu) wenig mit solchen Mustern befasst nehme ich an?

Weißt Du, was ein ORM ist? Was eine Templating-Engine macht? Was SQL-Injection ist? Wozu URL-Dispatching dient?

Edit: Last bu least: Django ist *kein* CMS (Content Management System?), sondern ein Full-Stack-Web-Framework. Man kann es dazu nutzen, Web basierte CMS zu bauen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Ein anderer Punkt ist, dass du anscheinend vergisst, dass man nicht nur die Kiste, welche von außen erreichbar ist als Server bezeichnet, sondern auch Programme, welche Anfragen eines Clients beantworten. Zum Beispiel Apache, der ist stark mit PHP verknüpft.

Das Problem mit PHP ist, dass es an sich nur eine (von Amateuren entworfene) Templating-Sprache ist in der Leute immer wieder sich ihre eigenen Lösungen gebaut haben, die mal mehr, mal weniger an richtige Frameworks erinnern. In Python dagegen ist man eher dazu gezwungen sich ein Framework auszusuchen und sich zu überlegen wie man es mit einem HTTP-Server verknüpft. Zu Anfang ist es üblich einen mitgelieferten zum Testen zu verwenden.

Hier ein Artikel mit einer schnellen Demo. Wie so ziemlich alle Python-Szenarios geht man davon aus, dass man vollen Zugriff auf seine Hardware hat. Oder einen gescheiten Hoster.
Timtam
User
Beiträge: 5
Registriert: Freitag 18. Januar 2013, 18:58

Hallo,
das das Openbook falsche Inhalte vermittelt war mir bisher unklar. Da ich es aber auch nicht von vorne bis hinten durchgeackert habe und vorhatte, dies Stück für Stück nachzuholen, habe ich mit ein bisschen Glück noch nicht ganz so viel Müll vermittelt bekommen ;).
... Auch in anderen Sprachen fängt kein ernsthafter Entwickler heutzutage damit an, ohne Framework eine Web-Applikation zu bauen.
Verständlich. Aber ist es prinzipiell nicht das beste für den Lernenden, die dahintersteckenden Algorithmen erstmal selbst zu erforschen bzw. herauszufinden, was dort alles an Arbeit drin steckt und was eigentlich alles dazu gehört, soetwas selbst zu machen?
Gut, der Lerneffekt war nicht gerade mein Ziel, aber prinzipiell ist es doch besser, die Grundlagen von Django bzw. einer Webanwendung zu kennen, damit man genau weiß, was dort gemacht werden muss und was nicht. Und vor allem damit man weiß, was dort eigentlich im Hintergrund passiert.
Wenn ich nicht verstehe, was Django eigentlich macht, kann ich nie ein so guter Programmierer werden, wie die Django-Leute... ;).
Aber gut, wie gesagt, Sinn und Zweck ist es ja eine Website aufzusetzen.
Die Frage ist evtl. eher, ob Du an sich schon in Python fit genug dafür bist oder evtl. auch schlicht Wissenslücken um gebräuchliche Pattern im Webumfeld hast? Wenn Du in PHP ein reiner "Selberbastler" warst, hast Du Dich vermutlich dort auch (zu) wenig mit solchen Mustern befasst nehme ich an?
Ich habe vorher nicht ausschließlich in PHP gearbeitet und mache ich jetzt auch nicht. Alles in allem dürfte Python meine dritte oder vierte Programmiersprache sein. Ich programmiere zwar verhältnismäßig noch nicht lange, gehe auch noch zur Schule ;), habe allerdings vor nach meinem Abitur in dieser Szene zu arbeiten, daher lernen, lernen, lernen... ;).
Aber, bis auf RegExp blicke ich bisher ziemlich gut durch^^
Weißt Du, was ein ORM ist? Was eine Templating-Engine macht? Was SQL-Injection ist? Wozu URL-Dispatching dient?
ORM war doch das System, das ganze Python-Objekte in einer Datenbank (SQL-Systeme bevorzugt) ablegen kann, wenn ich mich recht erinnere.
Die Templating-Engine ist das System, was die sichtbaren, also ausgegebenen Seiten/Fenster organisiert.
SQL-Injektion ist die Eintragung von SQL-Datensätzen in eine solche Datenbank? Da hat man in Python sogar noch Vorteile, in den Programmiersprachen, in denen ich vorher gearbeitet hatte, musste ich immer noch selbst escapen, weil ich die Strings selbst zusammensetzen musste.... ;)
URL-Dispatching... ja, da fängts an zu haken. Das müsste doch die Zerlegung und Auswertung der URLs in verschiedene Teilstücke sein, die dann weiterverarbeitet werden können. Und soweit ich das gesehen habe wird das in Django mit RegExp gemacht... Da fängts schon an, aber zur Not muss halt ein Tutorial her.
Ein anderer Punkt ist, dass du anscheinend vergisst, dass man nicht nur die Kiste, welche von außen erreichbar ist als Server bezeichnet, sondern auch Programme, welche Anfragen eines Clients beantworten.
Nein, vergessen habe ich das nicht, allerdings dachte ich bisher, dass der Webserver meines Anbieters die ganze Arbeit abnimmt, so wie bei PHP auch. Ich dachte, ich kann wie in PHP die Datei index.py aufrufen und bekomme direkt eine Antwort, ohne das ich direkt noch einen Webserver in Python geschrieben habe.

Danke für die vielen Antworten bisher und korrigiert mich, falls meine Definitionen oder andere Sachen falsch sind... Ich werde mich auf euren mitgelieferten Links informieren und auch mal nach dem in Post #2 erwähnten Buch umschauen.
mfg.
Timtam
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Timtam: Du benutzt auch erst ein Betriebsystem, nachdem Du selbst eins geschrieben hast und kannst ein Auto selbst zusammenschrauben. :wink:
Da Du selbst merkst, dass Dir noch einiges an Grundlagen fehlen, hier mal die Auflösung des Quiz:
- ORM heißt Object-Relation-Mapping und bezeichnet bei Datenbanken das Abbilden der Tabellen auf komplexere Objekte der aufbauenden Programmiersprache, hat also nicht speziell mit Python zu tun.
- Templating-Engine füllt eine Vorlage mit Daten, hauptsächlich werden so dynamische Webseiten mit Inhalt gefüllt. Im Gegensatz zu PHP wird hier die Verarbeitung sauber von der Darstellung getrennt.
- SQL-Injektion ist die Möglichkeit, beliebige SQL-Befehle auszuführen, indem Befehle in harmlose SQL-Abfragen eingeschleust werden. Wie Du richtig bemerkt hast, wird die Gefahr einer solchen Lücke geringer, wenn man SQL-Befehle nicht per Stringkonkatenation erzeugt.
- URL-Dispatching ist dann noch das Auflösen einer URL, das in Django über Reguläre Ausdrücke gemacht wird.
Und beim letzten Punkt tritt der große Unterschied zu PHP deutlich zu Tage. Ein Python-Server beantwortet alle URL-Anfragen und man braucht nicht für jede Seite eine neue PHP-Datei. (Obwohl ich fast alle PHP-Projekte in letzter Zeit mit einem zentralen index.php und Apache-rewrite aufgesetzt habe)

Einen eigenen Webserver mußt Du auch in Python nicht schreiben, dafür gibt es ja Frameworks. Arbeite einfach mal ein (oder mehrere) Anfängertutorium von verschiedenen Frameworks durch (Django, Flask, Bottle) um ein Gefühl dafür zu bekommen, wie Python und Web zusammenpassen. Die beiden letztgenannten sind zum Einstieg wahrscheinlich einfacher, für größere Projekte aber mit mehr Handarbeit verbunden.
BlackJack

@Timtam: Grundsätzlich stimmt es schon, das man Vorteile hat, wenn man weiss was hinter den Kulissen passiert. Die Frage ist wie weit man dabei gehen muss/sollte und wann. Wenn Du Dich durch das Wissen arbeiten willst, was in Django mit all seinen Komponenten steckt, dann wärest Du erst einmal eine ganze Weile beschäftigt. Das ist als wenn ein Programmieranfänger bevor er ein kleines Zahlenratespiel schreibt, erst einmal schaut wie das Betriebssystem und Gerätetreiber programmiert werden, damit das Zahlenratespiel auf irgend etwas laufen kann und die Tastendrücke von der Tastatur in das Programm kommen. Wie das mit dem Web so grundsätzlich funktioniert, müsstest Du doch schon von PHP wissen. Einen der typischen Anfängerfehler, sich nicht darüber im Klaren zu sein, was im Browser und was auf dem Server passiert, und beide nur über HTTP verbunden sind, und alle Informationen da durch müssen, kannst Du ja schon mal nicht mehr machen. :-)

Was Django macht, ohne in die Implementierung zu gehen, vermittelt die Dokumentation und das darin enthaltene Tutorial IMHO ganz gut.

Reguläre Ausdrücke sind bei Django wichtig. Da gibt es in der Python-Dokumentation ein Howto zu, speziell zu Python. Ansonsten findet man im Netz sicher auch allgemein Informationen dazu, denn das ist ja ein programmiersprachenübergreifendes Thema. Beziehungsweise kann man damit ja sogar ohne Programmiersprachen in Kontakt kommen, weil Suchfunktionen und Suchen und Ersetzen in anderer Software auch oft reguläre Ausdrücke anbietet.

SQL-Injektion ist ein Angriff auf einen Server bei dem der Angreifer beliebigen SQL-Code auf der Datenbank ausführt. Das passiert wenn der Programmierer der Datenbankanwendung, also im speziellen Fall der Webanwendung, nicht verhindert, dass Benutzereingaben als SQL ausgeführt werden können. Das ist zum Beispiel der Fall wenn man die SQL-Anweisungen einfach mit Zeichenkettenoperationen zusammen setzt. Wenn man ein ORM verwendet, hat man das Problem nicht, denn dann hat man selbst mit SQL ja nichts mehr zu tun. Ansonsten bieten Datenbank-APIs und damit Anbindungen an Programmiersprachen, Wege SQL-Anweisungen *sicher* zu erstellen. Wenn Du das in PHP nicht gemacht hast, dann hast Du dort etwas falsch gemacht. PHP Data Objekts (PDO) sind seit 2005 bei der Standardinstallation dabei.

Diese 1:1-Abbildung von URL auf Programmdatei kann man in Python auch machen, aber das macht im Grunde niemand. Man verknüpft damit die Site-Struktur mit der Quelltextstruktur und da man die Site-Struktur nicht ändern sollte, weil dann für die Benutzer zum Beispiel Lesezeichen nicht mehr funktionieren, wäre damit auch die Quelltextstruktur in Stein gemeisselt. Andererseits möchte man vielleicht auch die gleiche oder sehr ähnliche Funktionalität unter verschiedenen URLs anbieten, dann müsste man das über die Quelltextstruktur lösen, also zum Beispiel Dateien kopieren (und dann die Kopien parallel pflegen) oder Verknüpfungen auf Dateisystemebene erstellen. Man ist viel flexibler wenn man die Site- von der Quelltextstruktur entkoppelt.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Timtam hat geschrieben:Aber ist es prinzipiell nicht das beste für den Lernenden, die dahintersteckenden Algorithmen erstmal selbst zu erforschen bzw. herauszufinden, was dort alles an Arbeit drin steckt und was eigentlich alles dazu gehört, soetwas selbst zu machen?
Das hängt davon ab wie akademisch du werden möchtest. Wenn ich mit Python den Inhalt einer Webseite abrufen möchte dann benutze ich dafür nicht direkt socket, sondern etwas das mir einen Großteil der Arbeit schon abnimmt. Alles zum Verständnis selber machen ist sicherlich interessant, aber ich implementiere mir beispielsweise meine Sortier-Algorithmen lieber nicht selber.
Timtam
User
Beiträge: 5
Registriert: Freitag 18. Januar 2013, 18:58

Hi,
erstmal danke für die Korrektur bezüglich der oben abgefragten Begriffe.
Als nächstes muss ich erwähnen, dass ich gerade den Django-workshop für mich entdeckt habe. Ich hoffe, damit kann man ein bisschen was anfangen....?
Auch reguläre Ausdrücke muss ich mir noch irgendwie aneignen. Aber das pack ich schon irgendwie... zur Not habe ich da jemanden an der Angel, der mir das sicherlich irgendwie vermitteln kann.
Noch mal zu dem Thema, was ich angesprochen habe...
Es ist ja nicht so, dass ich ein ganzes Betriebssystem schreiben möchte, denn 1. kenne ich mich mit C (Beispiel) bisher nicht aus und 2. möchte ich bisher nicht in diese genauen Details gehen :). Aber ich sehe es ja an meiner Schule... wir kriegen im Informatikunterricht Sachen serviert, wo ich mir denke: "Klar kommen die anderen nicht damit zurecht, wenn die gar nicht wissen, was das ist.". Wir haben beispielsweise ein halbes Jahr mit Strings gearbeitet ohne weder den Fachbegriff zu kennen (also die anderen), noch wie man mit denen umgeht. Bzw. die anderen wissen immernoch nicht, welchen Variablentyp es in Delphi benötigt, um einen String darin abzulegen... und da muss ich einfach sagen, dass es besser ist, wenn man mindestens die groben Vorgänge im Hintergrund kennt. Ich will jetzt kein Django 2.0 aufsetzen können oder ähnliches, aber ich würde und das werde ich bei Gelegenheit auch machen, gern mindestens die Socket-Vorgänge und die hintenrum getätigten Handlungen kennen, nur für den Fall, man weiß ja nie, wo und wann man wieder darauf zurückkommt. Und spätestens beim Studium kann es sicherlich nicht schaden... Aber anke für die ganzen Informationen und Korrekturen eurerseits. Ich fresse mich jetzt erstmal in Django rein, habe momentan Ferien, da sollte das ganz fix gehen.
mfg.
Timtam
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Timtam: Wie BlackJack es auch schon sagte: Dinge verstehen, die einem ein Framework abnimmt ist an sich sicherlich wichtig. Aber: Das ist ein Henne-Ei-Problem! Als Anfänger muss man auch mal Dinge "hinnehmen" und diese erst einmal anwenden, da man das *Problem* dahinter evtl. noch gar nicht erkennen kann. Erst wenn man das Problem sieht, dann erschließen sich einem auch die Hintergründe und dann kann man auch gezielt gucken, wie ein Framework etwas umsetzt.

Ich hatte Flask und Bottle jetzt extra nicht so groß und direkt erwähnt, weil diese sicherlich für den allerersten Eintieg in Python-Webprogrammierung klasse sind, aber danach den Anfänger eher überfordern, da sie nicht alles mitbringen. Du kannst Dir aber sicherlich mal das exzellente Tutorial von Flask angucken und damit ein wenig spielen. Dann hast Du immerhin schon mal eine Vorstellung von URL-Dispatching und Templating. Für alles andere würde ich dann Django empfehlen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten