相关疑难解决方法(0)

uWSGI中的Flask仅导入SQLAlchemy导致500内部服务器错误

TL; DR编辑:我没有设置正确的文件夹权限.


当我运行烧瓶时,一切正常source venv/bin/activate && python run.py.

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, world!"

if __name__ == "__main__":
    app.debug = True
    app.run(host='0.0.0.0', port=8080)
Run Code Online (Sandbox Code Playgroud)

但是当我使用nginx/emperor.uwsgi运行相同的应用程序时,每次命中服务器都会返回500.如果我注释掉SQLAlchemy导入,那么页面会按预期加载.


根据这个线程我尝试启用lazy/lazy-app,但它没有任何效果.Flask正在引发异常,因此nginx/uwsgi没有记录任何内容.

我尝试过使用from werkzeug.debug import DebuggedApplication但仍然只是在我的浏览器中获得绝对的"内部服务器错误".


配置:

[uwsgi]
uid = http
gid = http

socket = /var/run/project.uwsgi.sock
chown-socket = http
chmod-socket = 664

pidfile = /var/run/project.master.pid

master = true
lazy = true
lazy-apps = true

chdir = /srv/http/project
python-path = …
Run Code Online (Sandbox Code Playgroud)

python nginx flask uwsgi flask-sqlalchemy

20
推荐指数
1
解决办法
3540
查看次数

python multiprocessing + peewee + postgresql 因 SSL 错误而失败

我正在尝试编写一个 Python 模型,该模型能够使用多线程模块和 peewee 在 PostgreSQL 数据库中进行一些处理。

但是,在单核模式下,代码可以工作,但是,当我尝试使用多核运行代码时,我遇到了 SSL 错误。

我想发布我的模型的结构,希望有人可以建议如何以适当的方式设置我的模型。目前,我选择使用面向对象的方法,在该方法中我建立一个在池中共享的连接。为了澄清我所做的,我现在将展示我目前拥有的源代码

我有三个文件:main.py、models.py 和 parser.py。内容如下

models.py 定义了 peewee postgresql 表并连接到 postgres 服务器

import peewee as pw
from playhouse.pool import PooledPostgresqlExtDatabase

KVK_KEY = "id_number"
NAME_KEY = "name"
N_VOWELS_KEY = "n_vowels"

# initialise the data base
database = PooledPostgresqlExtDatabase(
    "testdb", user="postgres", host="localhost", port=5432, password="xxxx",
    max_connections=8, stale_timeout=300 )


class BaseModel(pw.Model):
    class Meta:
        database = database
        only_save_dirty = True


# this class describes the format of the sql data base
class Company(BaseModel):
    id_number = pw.IntegerField(primary_key=True) …
Run Code Online (Sandbox Code Playgroud)

python postgresql multiprocessing python-3.x peewee

6
推荐指数
1
解决办法
1700
查看次数

django conn_max_age和uwsgi

我正在尝试设置django的conn_max_age设置.

我从uwsgi那里得到错误 django.db.utils.DatabaseError: SSL error: decryption failed or bad record mac

它似乎与uWSGI,Flask,sqlalchemy和postgres有关:SSL错误:解密失败或错误记录mac

该帖子说打开lazy-apps选项.

我想确保找到问题的正确解决方案并且我用Google搜索,uwsgi conn_max_age但没有其他文档提及此问题或解决方案.

如果django + uwsgi是一个流行的组合,conn_max_age也是一个很好的选择用于生产,为什么没有多少提到警告.

django postgresql database-connection uwsgi

5
推荐指数
0
解决办法
377
查看次数

uWSGI 信号框架:向所有工作人员发送信号,发送给第一个可用工作人员

我正在使用在 docker 容器中运行的 uWSGI 部署 Flask 应用程序。在有 4 个工作人员的应用程序中,有一些内存字典存储应用程序使用的“缓存值”,以防止每次都需要查询数据库。这些字典是在工作人员初始化时创建的,我正在尝试使用 uWSGI 的信号框架来强制更新所有工作人员中的缓存。

我最初的想法是:

  1. 定义一个函数来更新所有工人的字典。
  2. 将此函数注册为针对所有工作人员 (target="workers") 的信号的处理程序。
  3. 需要时触发信号。

例子:

def update_dicts(sig):
    # Update dictionaries here
    print('Received signal {}: updating dicts in worker {}'.format(sig, uwsgi.worker_id()))

uwsgi.register_signal(100, "workers", update_dicts)
Run Code Online (Sandbox Code Playgroud)

并在需要时在任何工人中触发信号:

uwsgi.signal(100)
Run Code Online (Sandbox Code Playgroud)

然而,即使信号以“工人”为目标,信号也只能由一名工人接收和处理,就好像它有“工人”作为目标一样

我还尝试为每个工人注册一个信号(使用目标“workerN”)并触发所有这些信号,但信号被发送给任何工人,而不是指定的工人:

# Each worker executes this 
# Signal registrations: 111, 112, 113, 114
uwsgi.register_signal(110 + uwsgi.worker_id(), "worker{}".format(uwsgi.worker_id()), update_service_dicts)

# To trigger the signals:
for i in [1,2,3,4]:
    uwsgi.signal(110 + i)
Run Code Online (Sandbox Code Playgroud)

应用程序日志:

[uwsgi-signal] signum 113 registered (wid: 3 modifier1: 0 …
Run Code Online (Sandbox Code Playgroud)

python frameworks signals flask uwsgi

5
推荐指数
1
解决办法
990
查看次数

在多个uWSGI进程中使用Flask-SQLAlchemy

我一直在我的Flask应用程序中遇到持久性错误:

OperationalError: (_mysql_exceptions.OperationalError) (2006, 'MySQL server has gone away')
Run Code Online (Sandbox Code Playgroud)

我正在使用mySQL服务器实例和Flask-SQLAlchemy模块.我仔细检查了mySQL实例上的连接的到期时间以及SQLAlchemy配置中的重置时间.没有问题,在mySQL连接到期之前重置连接池.我得出结论,必须有一些问题导致连接关闭,然后该连接的下一个用户窒息.

我正在使用生成四个进程的uWSGI来运行Flask应用程序.如果我切换到单个进程,我无法重现错误.我猜测进程是通过共享连接池相互踩踏的.每当uWSGI分叉进程时,我都会添加以下函数.

from uwsgidecorators import postfork

@postfork
def reset_db_connections():
    db.engine.dispose()
Run Code Online (Sandbox Code Playgroud)

在启动时工作正常,并且当多个请求同时进入时似乎解决了问题.但是,现在当一个进程被重置时,该进程的下一个请求会以类似但不一样的方式爆炸,SQL Server已经消失了.这是数据库的初始设置代码

def configure_db():
    from my_application.models import SomeModel
    db.create_all()

db = SQLAlchemy(app, session_options={'expire_on_commit': False})
configure_db()
Run Code Online (Sandbox Code Playgroud)

数据库的典型用法如下所示:

def save(self):
    try:
        db.session.add(self)
        db.session.commit()
    except Exception, ex:
        app.logger.error("Error saving campaign: %s" % ex)
        db.session.rollback()
Run Code Online (Sandbox Code Playgroud)

读取是以下两种风格之一:

user = db.session.query(User).filter(User.email == email).scalar()
user = User.query.filter(User.email == email).scalar()
Run Code Online (Sandbox Code Playgroud)

我的理解是Flask-SQLAlchemy使用范围会话,因此他们应该在多进程环境中提供一些保护.我需要在fork上重置连接池吗?在分叉时我是否也应该检查实时会话?

更新:

我把fork更改为:

@postfork
def reset_db_connections():
    db.session.close_all()
    db.engine.dispose()
    db.create_scoped_session()
Run Code Online (Sandbox Code Playgroud)

我仍然得到OperationalError,但它只发生在fork中,并且似乎不会干扰请求.堆栈跟踪不包括fork,但不允许我捕获它.

Traceback(最近一次调用最后一次):

在_finalize_fairy fairy._reset(pool)中输入文件"/home/vagrant/env/local/lib/python2.7/site-packages/sqlalchemy/pool.py",第636行

在_reset self._reset_agent.rollback()中输入文件"/home/vagrant/env/local/lib/python2.7/site-packages/sqlalchemy/pool.py",第774行

文件"/home/vagrant/env/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",第1563行,回滚self._do_rollback()

在/do_rollback self.connection._rollback_impl()中输入文件"/home/vagrant/env/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",第1601行

文件"/home/vagrant/env/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py",第670行,_rollback_impl …

python mysql sqlalchemy flask flask-sqlalchemy

4
推荐指数
1
解决办法
3219
查看次数