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()
War es hilfreich?

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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top