Anfänger: Py und MySQL auf Hosted Server - Ohne Installation

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Cranisch
User
Beiträge: 4
Registriert: Donnerstag 28. Mai 2009, 21:02

Hallo Zusammen!
Ich habe einige Jahre Erfahrung in PHP und wollte nun in Python einsteigen.
Leider habe ich keinen eigenen Webserver am Start, sondern benutze ein Hosting Angebot von Campusspeicher.de. Dort habe ich über CGI Zugriff auf Python. Allerdings ist MySQLdb nicht vorinstalliert und ich bin nach einigen Stunden suchen im Netz und ausprobieren kläglich gescheitert.
Deswegen habe ich ein paar Fragen:
1. Geh ich richtig in der Annahme, dass ich zur Verwendung von MySQL in Kombination mit Python irgendetwas installieren muss, was ich ja als Kunde ohne Adminrechte nicht kann?!
2. Welchen Workaround gibt es für solche Probleme? (Außer Anbieter Wechseln)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

MySQLdb ist kein reines Python-Paket und kann daher auch nicht durch einfaches Hochladen und Einbinden in den Pfad deines Scripts benutzt werden, sondern enthält C-Code und muss daher passend übersetzt und installiert werden.

Ich schlage vor, du bittest deinen Hoster höflich darum, dies für dich zu tun. Ohne dieses Modul ist Python im Web für vieles einfach nutzlos (sofern nicht vergleichbare Alternativen für die Datenhaltung existieren) und die Installation sollte durch weitgehend verfügbare Binärpakete sehr einfach sein. Mit so einer Anfrage hatte ich bereits Erfolg.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie wäre es denn mit einer SQLite Lösung für den Anfang?
Cranisch
User
Beiträge: 4
Registriert: Donnerstag 28. Mai 2009, 21:02

@YOGi: ok, ich werd mal den Provider höflich anfragen
@Hyperion: Muss SQLite entsprechend dann nicht auch übersetzt werden, oder wie funktioniert das?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Cranisch hat geschrieben: @Hyperion: Muss SQLite entsprechend dann nicht auch übersetzt werden, oder wie funktioniert das?
Es gibt in der Python Standard-Lib ein SQLite3 Modul. Ich weiß nur nicht ab welcher Version, aber seit 2.5 auf jeden Fall.

Alternativ würde ich sowieso so vorgehen:
- mit lokalem Entwickeln starten
- Erkundung von Frameworks / Libs für die Entwicklung (High Level Frameworks vs. Lightweight)
- Erste kleine Apps basteln und lokal testen (dafür brauchste ja erst mal keinen separaten Webserver)
- Irgend wann nen Webserver aufsetzen (lokal) und Apps dort einmal deployen und testen

Wenn Du so weit gekommen bist, kannst Du Dich dann gezielt für einen Provider entscheiden, der Dir eine passende Umgebung für Deine Applikation(en) bereit stellen kann. Kostenlos wird das idR nicht sein, aber wenn man so viel Aufwand betreibt, kann man sicherlich mal 10€ im Monat dafür abdrücken ;-)
Cranisch
User
Beiträge: 4
Registriert: Donnerstag 28. Mai 2009, 21:02

Ok, SQLite3 hört sich für den Anfang vielversprechend an. Ich hab mal die Einführung überflogen. Es scheint ja quasi, Dateien direkt als Datenbank zu verwenden, richtig?!
Welcher Nachteil ist dabei grundsätzlich zu erwarten? Ist es deutlich langsamer?

Nebenbei: Meinen Provider kann ich so schnell leider nicht wechseln, vor kurzem erst wieder für ein Jahr verlängert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Cranisch hat geschrieben:Ok, SQLite3 hört sich für den Anfang vielversprechend an. Ich hab mal die Einführung überflogen. Es scheint ja quasi, Dateien direkt als Datenbank zu verwenden, richtig?!
Welcher Nachteil ist dabei grundsätzlich zu erwarten? Ist es deutlich langsamer?
Naja, es ist eben nicht so wirklich Multi-Tasking fähig und bietet auch kein eigenes Berechtigungsmanagement mit. Deutlich langsamer als was? Kommt ja auf die zu vergelichende DB sowie den Anwendungsfall an. Immerhin fällt die Latenz durch Netzwerkverkehr weg. Bei kleineren Datenmengen könnte das sogar für SQLite sprechen. Aber da würde ich mal Profis fragen oder im Web recherchieren ...

Alternativ hilft eben nur ein Stresstest ;-)

Am besten ist es natürlich gleich einen ORM zu nutzen wie SQLAlchemy (oder sogar noch simpler dem Aufsatz Elixir). Damit bist Du größtenteils unabhängig vom zugrunde liegenden RDBMS. Somit fällt die Migration von einem DBMS zu einem anderen leicht.
Nebenbei: Meinen Provider kann ich so schnell leider nicht wechseln, vor kurzem erst wieder für ein Jahr verlängert.
Naja, musst Dich ja eh erst einarbeiten :-D

Um WSGI wirklich zu kapieren braucht es imho schon ein Weilchen (ich stehe da auch noch immer am Anfang) ... ok, wen die Interna nicht so tangieren /reizen, der hat mit High-Level Frameworks a la Django sicherlich auch schnell gute Erfolge.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ein anderer Nachteil ist der Sicherheitsaspekt - bei SQLite braucht der ausführende Prozess Schreibrechte auf die Datei und bei vielen Billig-Hostern läuft dieser Prozess als ``www-data:www-data`` was dazu führt, dass man ``o+w`` auf die Datenbankdatei setzen muss - was bedeutet dass andere Nutzer des Hosters bei dir in der Datenbank rumfuhrwerken können (das ist auch das Problem mit Passwort-Dateien, generell: wenn dein Hoster dir keinen eigenen Webserver-Nutzer einräumt hast du sicherheitstechnisch automatisch verloren).

Und ja, +1 für den Tipp ein ORM zu benutzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Leonidas hat geschrieben: Und ja, +1 für den Tipp ein ORM zu benutzen.
Von wem habe ich das wohl ;-)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

SQLite 3 ist ab Python 2.5 dabei, ja. Davon ab solltest du ohnehin mal herausfinden, welche Python-Version (steht in `sys.version`) dir zur Verfügung steht.

Wenn du auf dem Server keine Shell hast, würde ich direkt von einem Framework wie Django absehen, da es vermutlich sehr langsam sein wird. Dann hast du nur CGI zur Verfügung, dass für jeden Request(!) die Python-Laufzeitumgebung neu erzeugt und deinen Code lädt. Für kleinere Sachen ist das aber ausreichend.

Ich empfehle dir gegen die WSGI-Schnittstelle zu programmieren und dazu eine Bibliothek wie das in diesen Kreisen sehr populäre Allround-Toolkit Werkzeug oder das gängige Request-/Response-Paket WebOb zu verwenden. Beide sind Pure-Python und du kannst sie selbst hochladen und in deinem Script einbinden. Deine WSGI-Anwendung `app` importierst du dann in einem separaten Script und nutzt das `wsgiref`-Paket, um einen Request zu verarbeiten:

Code: Alles auswählen

#!/usr/bin/env python

from wsgiref.handlers import CGIHandler

from yourapplication import app


# Request verarbeiten
CGIHandler().run(app)
Cranisch
User
Beiträge: 4
Registriert: Donnerstag 28. Mai 2009, 21:02

Also, ich hab mal die Version gegengecheckt. Leider läuft nur die 2.4.4 auf dem Server. Gibt es etwas vergleichbares wie SQLite3 in dieser Version?
Bzw. noch Ideen wie ich das auf einem solchem Weg lösen kann?

Übrigens: danke schonmal für die vielen Posts ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Cranisch hat geschrieben:Also, ich hab mal die Version gegengecheckt. Leider läuft nur die 2.4.4 auf dem Server. Gibt es etwas vergleichbares wie SQLite3 in dieser Version?
Guck doch mal in die Doku zu dieser Version (die sollte es ja wohl noch geben). Da wirst Du ja sehen, ob das Modul schon damals dabei war.

Alertnativ kann es ja durchaus sein, dass der Hoster nicht nur das Python Standardpaket auf dem Server hat, sondern auch andere Zusatzmodule! Wird doch wohl hoffentlich eine Übersicht daürber geben? Ansonsten eben mal testen, ob die imorts gehen.
lunar

SQlite ist nicht in Python 2.4.x enthalten, dass hatte YOGi schon festgestellt.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Wie wäre es mit der Google App Engine als Alternative? Kleinere Anwendungen können dort kostenfrei betrieben werden und haben Zugriff auf einen Datastore (1GB Quota) und andere APIs.

Die GAE funktioniert so ähnlich wie ein CGI-Programm. Man legt allerdings zusätzlich noch eine Konfigurationsdatei `app.yaml` an, die so aussehen könnte:

Code: Alles auswählen

    application: helloworld
    version: 1
    runtime: python
    api_version: 1
    
    handlers:
    - url: /.*
      script: helloworld.py
    
Dazu kommt dann eine Python-Datei `helloworld.py`, die man entweder genau wie eine CGI-Anwendung schreiben kann oder wo man z.B. das mitgelieferte Mini-Webrahmenwerk wie folgt einsetzen kann:

Code: Alles auswählen

    from google.appengine.ext import webapp
    from google.appengine.ext.webapp.util import run_wsgi_app
    
    class MainPage(webapp.RequestHandler):
        def get(self):
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.out.write('Hello, webapp World!')
            
    application = webapp.WSGIApplication([('/', MainPage)], debug=True)
    
    def main(): run_wsgi_app(application)
    
    if __name__ == "__main__": main()
    
Man vereinbart, dass die Klasse `MainPage` für die URL `/` verantwortlich ist. Deren `get`-Methode wird bei einem HTTP GET aufgerufen. Unter `self.request` kann man auf die Parameter der Anfrage zugreifen und `self.response` hilft, die Antwort zu bauen. Die `main`-Funktion ist optional, sollte aber existieren, da sie der GAE erlaubt, das Programm anders als bei CGI länger im Speicher zu halten und mehrfach aufzurufen.

Ich kann das jetzt als Grundlage für mein eigenes kleines Mikro-Web-Rahmenwerk nutzen. Sieht dies hier nicht netter aus?

Code: Alles auswählen

    from web import route, main
    
    @route('/')
    def get(self):
        self.write('Hello world!!')
        
    if __name__ == '__main__':
        main()
    
Dazu brauche ich diese Datei `web.py`:

Code: Alles auswählen

    from google.appengine.ext import webapp
    from google.appengine.ext.webapp.util import run_wsgi_app
    
    routes = []
    
    class RequestHandler(webapp.RequestHandler):
        def write(self, s):
            self.response.out.write(s)
            
    def route(url):
        def inner(f):
            class Handler(RequestHandler): pass
            setattr(Handler, f.__name__, f)
            routes.append((url, Handler))
        return inner
        
    def main(debug=True):
        application = webapp.WSGIApplication(routes, debug=debug)
        run_wsgi_app(application)
    
Für den Einstieg finde ich die GAE interessant, denn sie erlaubt es ohne Kosten, schnell mit einfachen Programmen erste Erfolge zu sehen. Nachteil ist allerdings, dass diese Programme dann auch nur auf der GAE laufen. Übrigens kann man auch eine veraltete Version von Django benutzen oder eine neuere selbst hochladen, wenn man etwas bastelt, doch davon sollte man sich nicht zu viel versprechen, da man praktisch nur View-Funktionen und die Template-Sprache hat.

Stefan
Antworten