Wie benutze ich den Kolben Routen mit Apache und mod_wsgi?
Ich habe meinen Apache-server-setup, und es ist der Umgang mit Kolben Antworten über mod_wsgi. Ich habe registriert das WSGI-script mit dem alias:
[httpd.conf]
WSGIScriptAlias /service "/mnt/www/wsgi-scripts/service.wsgi"
Habe ich die entsprechenden WSGI-Datei an die oben genannte Pfad:
[/mnt/www/wsgi-scripts/service.wsgi]
import sys
sys.path.insert(0, "/mnt/www/wsgi-scripts")
from service import application
Und ich haben einen einfachen test Flask Python-Skript, das bietet das service-Modul:
[/mnt/www/wsgi-scripts/service.py]
from flask import Flask
app = Flask(__name__)
@app.route('/')
def application(environ, start_response):
status = '200 OK'
output = "Hello World!"
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
@app.route('/upload')
def upload(environ, start_response):
output = "Uploading"
status = '200 OK'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
if __name__ == '__main__':
app.run()
Wenn ich gehen Sie zu meiner website URL [hostname]/- service funktioniert wie erwartet und ich erhalte die Meldung "Hallo Welt!" zurück. Das problem ist, dass ich nicht weiß, wie man andere Routen zu arbeiten, so wie 'hochladen' im obigen Beispiel. Dies funktioniert im standalone-Kolben aber unter mod_wsgi bin ich überfragt. Das einzige was ich mir vorstellen kann, ist die Registrierung eine eigene WSGI-Skript-alias in der httpd.conf für jeden Endpunkt, den ich will, aber das nimmt Flask ' s routing unterstützen. Gibt es eine Möglichkeit, diese Arbeit zu machen?
- Haben Sie versucht, surfen zu
/service/upload
? Sie könnten angenehm überrascht sein. - Wenn ich hit /service/upload die Anfrage trotzdem gesendet wird, um die "application" - Funktion. In der Tat, ich kann entfernen Sie die route-Anweisung, bevor die Anwendung funktioniert und es funktioniert immer noch. Es ist wie die Anwendung ist immer von mod_wsgi als Einstiegspunkt in die Anwendung. Es fühlt sich an wie ich brauche, um zu tun, etwas in 'Anwendung', die startet Kolben routing-Logik.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrem wsgi-Datei, die Sie tun
from service import application
, die importieren nur Ihreapplication
Methode.Ändern, dass
from service import app as application
und alles funktioniert wie erwartet.Nach Ihrem Kommentar, ich dachte, ich würde erweitern Sie die Antwort ein bisschen:
Ihre wsgi-Datei ist python-code - Sie können einen beliebigen gültigen python-code in dieser Datei. Das wsgi - "handler", die installiert ist in Apache ist auf der Suche nach der Anwendung Namen in dieser Datei, die es werden hand-off requests an. Ein Fläschchen Klasse-Instanz -
app = Flask(__name__)
- bietet eine solche Schnittstelle, aber da die genannteapp
und nichtapplication
haben Sie auf den alias, wenn Sie Sie importiert haben - das ist es, was die Zeile tut.Könnte man - und das ist völlig in Ordnung - einfach tun
application = Flask(__name__)
und zeigen Sie dann die wsgi-handler in Apache zu Ihremservice.py
- Datei. Wennservice.py
war importierbar (das heißt, irgendwo inPYTHONPATH
), würden Sie nicht brauchen einen Vermittler wsgi-Skript.Obwohl die oben genannten Werke, seine schlechte Praxis. Das wsgi-Datei muss die Berechtigungen des Apache-Prozess zu arbeiten; und Sie in der Regel das trennen von den eigentlichen source-code, der sollte irgendwo anders sein auf Ihrem Dateisystem, mit den entsprechenden Berechtigungen.
@app.route('/')
ist das schmücken der Funktionapplication
. In meinem ursprünglichen setup war ich importieren nur Anwendung also nur, die Funktion war immer genannt. Wenn ich änderte den service.wsgi zu verwendenfrom service import app as application
das hat richtig Referenz-Kolben-Objekt, aber es auch scheint, sind Konflikte mit derapplication
Funktion. Ich benannte diese Funktion zu@def root():
und jetzt funktioniert es einwandfrei. Nochmals vielen Dank!