Bereitstellen einer Flask-Anwendung mit Einfügen
Frage
Ich erstelle einen Webdienst mit Flask und versuche, mit Paster eine einfache „Hello, World“-App bereitzustellen.Ich habe jedoch Probleme, alles so zu konfigurieren, dass es zusammenarbeitet.Ich habe den Google-Hit über das Ausführen von Flask mit Paste unter Verwendung von Virtualenv und Zcbuildout gesehen, aber das scheint für eine ziemlich einfache Anwendung übertrieben zu sein.Wenn ich derzeit versuche, eine URL mit meiner App zu laden, erhalte ich diese Fehlermeldung:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/paste/httpserver.py", line 1068, in process_request_in_thread
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 323, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python2.7/SocketServer.py", line 639, in __init__
self.handle()
File "/usr/lib/python2.7/dist-packages/paste/httpserver.py", line 442, in handle
BaseHTTPRequestHandler.handle(self)
File "/usr/lib/python2.7/BaseHTTPServer.py", line 343, in handle
self.handle_one_request()
File "/usr/lib/python2.7/dist-packages/paste/httpserver.py", line 437, in handle_one_request
self.wsgi_execute()
File "/usr/lib/python2.7/dist-packages/paste/httpserver.py", line 287, in wsgi_execute
self.wsgi_start_response)
AttributeError: GraffitiApp instance has no __call__ method
Meine Anwendungskonfiguration sieht folgendermaßen aus:
[DEFAULT]
loglevel = WARN
browser_cache_ttl = 30
[app:main]
use = egg:GraffitiService
[server:main]
use = egg:Paste#http
host = 0.0.0.0
port = %(graffiti_port)s
Mein Anwendungscode sieht so aus:
from flask import Flask
app = Flask(__name__)
app.debug = True
class GraffitiApp:
@app.route('/')
def hello_world():
return "Hello World!"
@app.route('/other')
def other_page():
return "Other page!"
def main():
app.run(debug = True)
if __name__ == "__main__":
app.run(debug = True)
Muss ich eine erstellen __call__()
Methode und ordne die URL zu, die an die entsprechende Funktion übergeben wurde, oder muss ich eine Änderung an meiner Konfiguration vornehmen?
BEARBEITEN
Ich verwende eine Factory mit dem Namen main.py aufgrund von Fehlern, weil ich keinen Einstiegspunkt mit dem Namen „main“ gefunden habe:
import logging
from graffiti import GraffitiApp
def make_app(globalArgs, **localArgs):
loglevelname = globalArgs.get("loglevel", "INFO").lower()
if loglevelname == 'critical':
loglevel = logging.CRITICAL
elif loglevelname == 'debug':
loglevel = logging.DEBUG
elif loglevelname == 'error':
loglevel = logging.ERROR
elif loglevelname == 'fatal':
loglevel = logging.FATAL
elif loglevelname == 'info':
loglevel = logging.INFO
elif loglevelname == 'warn' or loglevelname == 'warning':
loglevel = logging.WARN
else:
loglevel = logging.NOTSET
loglevelname = 'notset'
FORMAT = "%(asctime)s %(name)s %(levelname)s %(message)s"
logging.basicConfig(format = FORMAT, level = loglevel)
logging.info("Log level set to %s" % (loglevelname.upper()))
return GraffitiApp()
Lösung
Es sieht so aus, als ob der Server versucht, Ihre Datei auszuführen GraffitiApp()
Klasse, wann die ausgeführt werden soll Flask()
Beispiel app
.
Andere Tipps
OFFTOP (Entschuldigung, aber Ihr Code bricht mir die Augen):
import logging
from graffiti import GraffitiApp
def make_app(globalArgs, **localArgs):
loglevelname = globalArgs.get("loglevel", "INFO")
loglevel = getattr(logging, loglevelname.upper(), logging.NOTSET)
FORMAT = "%(asctime)s %(name)s %(levelname)s %(message)s"
logging.basicConfig(format = FORMAT, level = loglevel)
logging.info("Log level set to %s" % (loglevelname))
return GraffitiApp()