Dateiupload php und wsgi

Django, Flask, Bottle, WSGI, CGI…
Antworten
k.marco.1970
User
Beiträge: 48
Registriert: Mittwoch 25. Dezember 2013, 20:46

Hallo zusammen,

ich würde gerne mit php eine datei auf meinen apache server hochladen und im anschluss mit python, genaugenommen mit .wsgi bearbeiten.
der upload läuft und die datei liegt in einem ordner auf dem server.
ein .wsgi skript läuft ebenfalls - das ist aber unabhängig von meiner dateibearbeitung. soll nur heissen, die funktionalität wsgi zu nutzen ist auf dem apache umgesetzt.
die verheiratung von beiden - php und wsgi - bekomme ich allerdings nicht hin. mein letzter ansatz ist gewesen eine php-form mit einem button zu machen. und sobald der button angeklickt wird, soll wsgi ausgeführt werden. das tut aber nicht.
pyhton würde ich gerne nutzen, weil ich mit python programmierung mehr erfahrung habe als mit php - allerdings ist serverseitige programmierung mit allem was dazu gehört für mich neuland. python offline programmieren läuft deshalb ganz gut.
zusatzfrage: ist es möglich mit python ganz auf php auf dem server zu verzichten?

viele grüße
k.marco
BlackJack

@k.marco.1970: Ich fange mal mit der letzten Frage an: Wenn Python/wsgi auf dem Server läuft, dann braucht man PHP nicht, denn man kann mit Python im Grunde alles machen was mit PHP auch geht. Einige Sachen möchte man gar nicht, wie zum Beispiel Programmlogik jenseits der Anzeige direkt in HTML einbetten, und es muss natürlich nicht für jede PHP-Bibliothek etwas direkt äquivalentes in Python geben.

Andererseits müsste die Kombination die Du versucht hast, auch funktionieren solange der Klick auf die Schaltfläche dann Python auf dem Server ausführt und die WSGI-Anwendung den Pfad kennt wo die Datei hochgeladen wurde und die nötigen Rechte hat darauf zuzugreifen.

Mit welchem Rahmenwerk arbeitest Du denn in Python?
k.marco.1970
User
Beiträge: 48
Registriert: Mittwoch 25. Dezember 2013, 20:46

Hallo BlackJack,

danke erstmal, das sind ja gute Nachrichten. Mit Deiner Frage bin ich schon leicht überfordert : ) Benötige ich denn ein Rahmenwerk? Falls ja, welches würdest Du empfehlen? Ich dachte, das brauche ich gar nicht...


marco
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

@k.marco.1970: wie hast Du denn Deine wsgi-Anwendung geschrieben? Wahrscheinlich nach irgendeinem Tutorial, das dann schon ein Rahmenwerk eingesetzt hat. Je nach dem was Du machen willst, gibt es eher die leichtgewichtigen oder die großen Rahmenwerke.
BlackJack

@k.marco.1970: Brauchen tust Du ein Rahmenwerk natürlich nicht, aber dann musst Du Dir natürlich das was Du von einem bräuchtest selber programmieren. WSGI ist ja nur die Schnittstelle zwischen Webanfrage und Deiner Webapp. Alles weitere müsste man selber machen.

Empfehlungen sind so eine Sache. Kommt halt drauf an was man machen will. Ein Rundum-Sorglos-Paket wäre Django. Da ist von Template-System bis ORM alles dabei und es gibt eine Community und gute Dokumentation.

Wenn die grosse, eierlegende Wollmilchsau nicht braucht, gibt es Mikrorahmenwerke wie Bottle oder Flask. Ich persönliche benutze Bottle und ergänze das um die Dinge die ich brauche. Eigentlich immer Jinja2 statt der mitgelieferten Templates, und SQLAlchemy für Datenbankanbindung, falls nötig.
k.marco.1970
User
Beiträge: 48
Registriert: Mittwoch 25. Dezember 2013, 20:46

Ja, Codeschnipsel sind aus verschiedenen Tutorials und mal so zusammengestöpselt, dass dabei was passiert.
Hier mal die 3 Dateien mit denen ich im Moment versuche zum Ziel zu kommen.

form.php --> Maske, um die Datei hochzuladen

Code: Alles auswählen

<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="datei"><br>
<input type="submit" value="Hochladen">
</form>
aus form.php wird upload.php aufgerufen. mit upload.php wird die datei verschoben

upload.php

Code: Alles auswählen

<?php
move_uploaded_file($_FILES['datei']['tmp_name'], "upload/datei.txt");
echo 'ist hochgeladen';
<form action="myapp.wsgi" method="post">
?>
aus upload.php heraus würde ich nun gerne - als beispiel - myapp.wsgi aufrufen. das ist im moment nur eine spielerei und spiegel-online wird über json ausgegeben.
Name der Datei: myapp.wsgi
Kann ich über localhost/myapp.wsgi aufrufen, klappt - aber halt noch nicht aus der .php-Datei.

myapp.wsgi

Code: Alles auswählen

import json
import urllib
def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    i = 5
    j = 7
    # Create a data structure
    data = [ { 'Hola':'Hello', 'Hoi':"Hello", 'noun':"hello" } ]
    json_encoded = json.dumps(data)
    decoded_data = json.loads(json_encoded)
    r = urllib.urlopen('http://www.spiegel.de')
    # str(r.read())
    return str(r.read())

eigentlich würde ich in der myapp.wsgi gerne funktionen umsetzen, die meine hochgeladene Datei bearbeiten und python-programm-code einbauen.
so, das ist das, was ich gerne machen würde.

grundlegend kommen da halt jetzt ein paar fragen hoch. das eine ist der unterschied zwischen .wsgi und .py Dateien. Eine .py Datei mit gleichem Inhalt lässt sich nämlich nicht ausführen, eine .wsgi Datei schon.
Wie würde das ganze denn aussehen, wenn ich alles über python machen wollte?
Wie würde es aussehen, wenn ich z.B. ein django framework verwenden würde oder z.b. bottle?

marco
Benutzeravatar
sparrow
User
Beiträge: 4506
Registriert: Freitag 17. April 2009, 10:28

Du verstehst da etwas grundlegend falsch.
WSGI ist eine Schnittstelle zwischen dem Webserver (in deinem Fall wohl Apache) und Python. Du rufst also eine URL auf, und das schlägt dann über die Schnittstelle in einem Python-Script auf.

Was du hier tust macht keinen Sinn.

Entweder handelst du den kompletten Request in PHP ab. Dann brauchst du kein WSGI. Wenn überhaupt könntest du das entsprechende Python-Skript direkt aus PHP aufrufen.

Alternativ behandelst du den kompletten Request in Python. Dann brauchst du die WSGI Schnittstelle, im günstigsten Fall ein Framework wie Bottle oder Django, aber ganz sicher kein PHP.
k.marco.1970
User
Beiträge: 48
Registriert: Mittwoch 25. Dezember 2013, 20:46

So Forum, nun bin ich etwas schlauer. Habe mich die letzten Wochen hobbymäßig mit Django beschäftigt und meine kleine Web-Funktion läuft lokal auf meinem Rechner.

Um kurz zusammenzufassen, was ich da gebastelt habe (ist aber nebensächlich): Dateiupload, Auslesen der Datei, Bearbeitung der ausgelesenen Werte, mit den Werten rechnen und auf der website ausgeben. IDE ist Eclipse und dem Django-Framework für Python.

Das soll ja nun zukünftig nicht auf dem Rechner lokal bleiben, sondern auf einer Seite im Netz verfügbar sein.

Da beginnt nun meine Baustelle - und ich bin wieder über das Stichwort: wsgi gestolpert.

Gibt es denn eine einfache Anleitung, wie ich das ganze auf einem Apache-Server im Netz zum Laufen bekomme oder kann jemand die grundlegenden Dinge stichwortartig beschreiben?

Um es etwas anders zu formulieren: Websites auf Basis wordpress sind ja recht leicht zum laufen zu bekommen: webspace besorgen, wordpress downloaden, via FTP auf den server transferieren, Einrichtungsroutine starten und fertig.

... ich vermute mal, mit Django läuft es etwas anders... oder ist es doch leichter als gedacht und ich nehme die Ordnerstruktur aus Eclipse, kopiere es mit FTP auf meine Webspace und ... es läuft?!

Viele Grüße,
k.marco
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nee, dafür brauchst du noch mod_wsgi und etwa folgendes in deiner Apache-Config:

Code: Alles auswählen

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com
Siehe auch How to use Django with Apache and mod_wsgi.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
k.marco.1970
User
Beiträge: 48
Registriert: Mittwoch 25. Dezember 2013, 20:46

Hallo Leonidas,

Kommando zurück, mod_wsgi wird bei meinem Hoster nicht funktionieren, weil es nicht unterstützt wird. Ich habe gesehen, dass es auch eine Möglichkeit über fastcgi gibt.
Dazu müsse ich wohl einmal .htaccess und einemal eine mysite.fcgi Datei auf dem Server anlegen mit folgenden Inhalten:

.htaccess:

Code: Alles auswählen

AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ mysite.fcgi/$1 [QSA,L]
mysite.fcgi mit den Rechten 0755

Code: Alles auswählen

#!/usr/bin/python
import sys, os

# Add a custom Python path.
sys.path.insert(0, "/home/user/python")

# Switch to the directory of your project. (Optional.)
# os.chdir("/home/user/myproject")

# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "myproject.settings"

from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")
Ist es richtig, diese beiden Dateien auf dem Server unter cgi-bin abzulegen und dort auch die Dateien aus dem django-Projekt abzulegen?
Die Struktur aus django ist Folgende:

Code: Alles auswählen

├── myproject
│   ├── database
│   │   └── database.sqlite3
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── manage.py
│   ├── media
│   ├── myapp
│   │   ├── forms.py
│   │   ├── forms.pyc
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── models.py
│   │   ├── models.pyc
│   │   ├── read_xml.py
│   │   ├── read_xml.pyc
│   │   ├── templates
│   │   │   └── myapp
│   │   │       ├── list.html
│   │   │       └── results.html
│   │   ├── tsp.py
│   │   ├── tsp.pyc
│   │   ├── urls.py
│   │   ├── urls.pyc
│   │   ├── views.py
│   │   └── views.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   ├── urls.pyc
│   ├── wsgi.py
│   └── wsgi.pyc
Oder anders: was ich erhalte, wenn ich mit diesen Einstellungen die Seite aufrufe ist lediglich im Browser die Textausgabe der Datei "mysite.fcgi".
... das sieht erst mal nach Holzweg aus. Kann mir da jemand weiter unter die Arme greifen?

Marco
k.marco.1970
User
Beiträge: 48
Registriert: Mittwoch 25. Dezember 2013, 20:46

so, da wäre ich wieder.
ich versuche nun die seite auf uberspace.de zum Laufen zu kriegen.
Was ich bisher getan habe:
- einen namen für uberspace meinname.uberspace.de einricten.
- in die verzeichnisse habe ich nun folgendes kopiert: in meinname/html/ habe ich meine anwendung kopiert mit den ordnern database, media, myapp, myproject und den einzelnen schon oben aufgelisteten datein.
- die .htaccess-datei liegt direkt im verzeichnis meinname
- und die datei mysite.fcgi liegt nun im ordner meinname/fcgi-bin

inhalte der dateien:

mysite.fcgi (wobei ich nicht weiss wo "/home/meinname/python" hinzeigen soll, den ordner python gibt es nämlich nicht)

Code: Alles auswählen

#!/usr/bin/python
import sys, os

# Add a custom Python path.
sys.path.insert(0, "/home/meinname/python")

# Switch to the directory of your project. (Optional.)
os.chdir("/home/meinname/html")

# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "settings"

from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")

.htaccess

Code: Alles auswählen

AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /fcgi-bin/mysite.fcgi/$1 [QSA,L]
beim aufruf von meinname.uberspace.de passiert leider nichts weiter außer das ich auf uberspace.de umgeleitet werde. was mache ich falsch?
ich freue mich über hilfe.

Marco
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du solltest die Django-Daten nicht in einem vom Server einsehbaren Ordner haben, also selbst im Fall einer Fehlkonfiguration sollte deine settings.py & Co. nicht von Leuten im Internet lesbar sein. Warum das FastCGI-Skript scheitert wirst du wohl im error.log schauen müssen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
k.marco.1970
User
Beiträge: 48
Registriert: Mittwoch 25. Dezember 2013, 20:46

Mmh, der Hinweis sagt mir jetzt noch nicht so viel. Wo wäre denn ein guter Ort für die settings-Datei? Ich habe ja oben erklärt, was ich wo liegen habe. Das scheint also nicht so optimal zu sein. Wirklich helfen würde mir zu wissen, ob das was in der .htaccess und in der mysite.fcgi Datei drin steht wenigstens richtig ist oder ob das was geändert werden muss. Und wo soll ich die einzelnen Dateien, die jetzt im Ordner html liegen denn so reinpacken? Also eine Erklärung an Hand des Beispiels von mir oben würde helfen.
Viele Grüße, Marco
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

@k.marco.1970: Laut Deiner »mysite.fcgi« solle dein Django-Projekt in /home/user/python liegen.
k.marco.1970
User
Beiträge: 48
Registriert: Mittwoch 25. Dezember 2013, 20:46

mmh, ich habe die mysite.fcgi jetzt wie folgt geändert:

Code: Alles auswählen

    #!/usr/bin/python
    import sys, os
     
    # Add a custom Python path.
    sys.path.insert(0, "/home/meinname/html")
     
    # Switch to the directory of your project. (Optional.)
    os.chdir("/home/meinname/html")
     
    # Set the DJANGO_SETTINGS_MODULE environment variable.
    os.environ['DJANGO_SETTINGS_MODULE'] = "settings"
     
    from django.core.servers.fastcgi import runfastcgi
    runfastcgi(method="threaded", daemonize="false")
da hat sich aber noch nichts geändert, werde weiter auf uberspace.de umgeleitet.
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

@k.marco.1970: dass Du statt Deine Verzeichnisse anzupassen die mysize.fcgi kaputtschreibst ändert nichts an der Tatsache, dass Du mal dringend in die Access- und Error-Logs Deines Web-Servers schauen solltest, was tatsächlich passiert.
k.marco.1970
User
Beiträge: 48
Registriert: Mittwoch 25. Dezember 2013, 20:46

Guten Morgen zusammen,

folgendes findet sich im error.log

Code: Alles auswählen

[Sat Mar 01 10:34:10 2014] [warn] [client 123.123.123.123] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server
[Sat Mar 01 10:34:10 2014] [error] [client 123.123.123.123] Premature end of script headers: mysite.fcgi
die access.log enthält zur gleichen Zeit keine Einträge.

Ist das mysite.fcgi script damit falsch? Was müsste denn geändert werden?

Marco
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

Läuft Dein mysite.fcgi fehlerfrei, wenn Du es von der Konsole aus startest?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wenn das im Log steht dann ist oft die erste Zeile falsch, häufig ist das wegen Windows-Zeilenenden. Wenn der Server auf Unix ist dann müssen das auch Unix-Zeilenenden sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten