【问题标题】:WSGI Application - sqlalchemy can't create_engineWSGI 应用程序 - sqlalchemy 无法创建引擎
【发布时间】:2016-07-04 05:22:50
【问题描述】:

我正在尝试使用 Werkzeug 构建一个小型 WSGI 应用程序。我关注了这个tutorial,它非常简单明了。但是我遇到了这个错误:

File "/Users/username/my_app/assigment2/app.py", line 38, in __init__
self.database_engine = create_engine(db_uri)
File "/Users/Data/lib/python3.4/site-packages/sqlalchemy/engine/__init__.py", line 386, in create_engine
return strategy.create(*args, **kwargs)
File "/Users/../lib/python3.4/site-packages/sqlalchemy/engine/strategies.py", line 51, in create
dialect_cls = u.get_dialect()
AttributeError: 'function' object has no attribute 'get_dialect'

我已经导入了所有的 SqlAlchemy 模块

from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import create_session, scoped_session

应用程序在应用程序的 init 处失败。

class App(object):
def __init__(self):
    local.app = self
    self.database_engine = create_engine(SQLALCHEMY_DATABASE_URI )
    self.jinja_env = Environment(loader=PackageLoader('app', '/templates'))
    self.dispatch = SharedDataMiddleware(self.dispatch, {'/static':  STATIC_PATH})

def init_database(self):
    metadata.create_all(self.database_engine)

def dispatch(self, environ, start_response):
    local.app = self
    request = Response(environ)
    local.url_= adapter = url_map.bind_to_environ(environ)
    #adapter = url_map.bind_to_environ(environ)
    try:
        endpoint, value = adapter.match()
        handler = getattr(views, endpoint)
        response = handler(request, **values)
    except HTTPException as e:
        response = e
    return ClosingIterator(response(environ, strat_response),
                            [session.remove, local_manager.cleanup])

def __call__(self, environ, start_response):
    return self.dispatch(environ, start_response)

databse_uri 看起来像这样

SQLALCHEMY_DATABASE_URI = 'postgresql://user:password@localhost:5432/name_db'

STATIC_PATH = path.join(path.dirname('/static'), 'static')

为什么我不能像这样创建我的应用程序:

def make_app():
   my_app = app.App()
   return my_app

我在 Gunicorn 上运行

gunicorn -b 127.0.0.1:9000 app:make_app

新错误:

TypeError: make_app() takes 0 positional arguments but 2 were given

【问题讨论】:

    标签: python sqlalchemy wsgi werkzeug


    【解决方案1】:

    这是错误的:

    gunicorn -b 127.0.0.1:9000 app:App
    

    有请求时会发生什么:

    app.App(environ, start_response)
    

    但你真正想要的是:

    your_app = app.App(path, db_uri)
    your_app(environ, start_response)
    

    将 gunicorn 调用更改为如下内容:

    gunicorn -b 127.0.0.1:9000 'app:App("/static/path", "postgresql://...")'
    

    【讨论】:

    • 为什么我做不到。
    • @Rich 将 gunicorn 调用更新为 gunicorn -b 127.0.0.1:9000 'app:make_app()'
    • 对不起,这个'app:make_app()'是由uwsgi支持的,不是gunicorn支持的。您必须在脚本中创建 App 的实例作为变量,然后调用 gunicorn -b 127.0.0.1:9000 app:my_app
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2021-07-01
    • 1970-01-01
    • 2010-12-03
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多