2012-05-22 4 views
0

Я создаю веб-сервис, используя Flask, и я пытаюсь развернуть простое приложение «Hello, World» с помощью Paster. У меня возникли проблемы с тем, что все настроено на совместную работу. Я видел, как Google запустил Flask с вставкой, используя virtualenv и zcbuildout, но похоже, что это слишком много для довольно простого приложения. Прямо сейчас, когда я пытаюсь загрузить URL с моим приложением, я получаю эту ошибку:Развертывание приложения с флягой с помощью Paste

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 

Моя конфигурация приложения выглядит следующим образом:

[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 

Мой код приложения выглядит следующим образом:

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) 

Нужно ли мне создать метод __call__() и сопоставить любой URL-адрес, который был передан соответствующей функции, или есть какие-то изменения, которые мне нужно внести в мою конфигурацию?

EDIT

Я использую завод имени main.py в результате ошибок я получал о не найти точку входа с именем «главный»:

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() 

ответ

3

Это выглядит сервер пытается запустить ваш класс GraffitiApp(), когда он должен запустить экземпляр Flask()app.

+0

я получаю ошибки о Paste не будучи в состоянии найти точку входа с именем «главным», поэтому я создал main.py, что возвращенный экземпляр GraffitiApp. –

+0

Он должен вернуть экземпляр класса 'Flask' ​​(который соответствует спецификациям WSGI). –

2

OFFTOP (извините, но ваш код ломает мои глаза):

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()