Mam aplikację z pythonem, flask i flask_mysqldb. Kiedy wykonuję pierwsze zapytanie, wszystko działa dobrze, ale drugie zapytanie zawsze generuje błąd (2006, serwer zniknął). Wszystko, co znalazłem w Internecie, mówi, że ten błąd jest problemem z przekroczeniem limitu czasu, co nie wydaje się być moim przypadkiem, ponieważ:

1 - Drugie zapytanie uruchamiam zaledwie kilka sekund po uruchomieniu pierwszego

2 - Moja konfiguracja limitu czasu jest ustawiona na 8 godzin

Nie wiem, co jeszcze może to być, oto kod, który uruchamiam:

import os
from flask import Flask
from flask import render_template
from flaskext.mysql import MySQL
import endpoints.usuario as usuario

app = Flask(__name__, static_folder='/root/sftp/atom-projects/flask-example/public/')

app.config['MYSQL_HOST'] = '123'
app.config['MYSQL_USER'] = '123'
app.config['MYSQL_PASSWORD'] = '123'
app.config['MYSQL_DB'] = '123'

app.add_url_rule('/usuarios', 'usuarios', usuario.list_all, methods=['GET'])

@app.errorhandler(404)
def not_found(e):
    return app.send_static_file('index.html')

Oto kod pliku usuarios:

from flask_mysqldb import MySQL
from flask import Flask, make_response
from flask import current_app
from flask import request
import bcrypt

def list_all():

    mysql = MySQL(current_app)
    cursor = mysql.connection.cursor()

    cursor.execute("select * from usuario")
    records = cursor.fetchall()
    usuarios = []
    for row in records:
        usuarios.append({"id":row[0], "nome":row[1], "email":row[2], "senha":row[3], "tipo":row[4]})

    for usuario in usuarios:
        tipo = None
        cursor.execute("select * from tipo_usuario where id = %s", [usuario['tipo']])
        records = cursor.fetchall()
        for row in records:
            usuario['tipo'] = {"id":row[0], "permissao":row[1]}

    return make_response({"msg":'', "error":False, "data":usuarios})

Mam to uruchomione na nginx + gunicorn, oto dziennik:

gunicorn -w 1 --reload main:app
[2019-12-19 12:53:21 +0000] [5356] [INFO] Starting gunicorn 20.0.4
[2019-12-19 12:53:21 +0000] [5356] [INFO] Listening at: http://127.0.0.1:8000 (5356)
[2019-12-19 12:53:21 +0000] [5356] [INFO] Using worker: sync
[2019-12-19 12:53:21 +0000] [5359] [INFO] Booting worker with pid: 5359
[2019-12-19 12:53:28 +0000] [5359] [ERROR] Error handling request /usuarios
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/gunicorn/workers/sync.py", line 134, in handle
    self.handle_request(listener, req, client, addr)
  File "/usr/local/lib/python3.5/dist-packages/gunicorn/workers/sync.py", line 175, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/usr/local/lib/python3.5/dist-packages/flask/app.py", line 2463, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python3.5/dist-packages/flask/app.py", line 2457, in wsgi_app
    ctx.auto_pop(error)
  File "/usr/local/lib/python3.5/dist-packages/flask/ctx.py", line 452, in auto_pop
    self.pop(exc)
  File "/usr/local/lib/python3.5/dist-packages/flask/ctx.py", line 438, in pop
    app_ctx.pop(exc)
  File "/usr/local/lib/python3.5/dist-packages/flask/ctx.py", line 238, in pop
    self.app.do_teardown_appcontext(exc)
  File "/usr/local/lib/python3.5/dist-packages/flask/app.py", line 2320, in do_teardown_appcontext
    func(exc)
  File "/usr/local/lib/python3.5/dist-packages/flask_mysqldb/__init__.py", line 100, in teardown
    ctx.mysql_db.close()
MySQLdb._exceptions.OperationalError: (2006, '')

Jeśli uruchomię go z większą liczbą pracowników, mogę uruchomić kilka zapytań więcej (w zależności od liczby pracowników), co może być tego przyczyną?

0
Yuri Waki 19 grudzień 2019, 16:09

3 odpowiedzi

Miałem podobny błąd w mojej aplikacji kolby Pythona. A kiedy próbuję użyć from flask import current_app as app, nadal pojawia się błąd. Ostatecznie postanowiłem usunąć błąd, tworząc oddzielny plik dla obiektu aplikacji flask app = Flask(__name__), a następnie importując go do wszystkich plików, które wymagały tego obiektu.

Na przykład.

Moduł obiektu aplikacji: main.py

from flask import Flask, request

app = Flask(__name__)

Inne pliki, takie jak usuarios.py lub config.py

from main import app
from flask_mysqldb import MySQL

app.config['MYSQL_HOST'] = '123'
app.config['MYSQL_USER'] = '123'
app.config['MYSQL_PASSWORD'] = '123'
app.config['MYSQL_DB'] = '123'

mysql = MySQL(app) 

Uwaga: użyłem flask_mysqldb zamiast flaskext.mysql, ale nie sądzę, że ma to jakiekolwiek znaczenie, o ile używasz odpowiednich parametrów do jednego z nich.

0
Sab 20 grudzień 2019, 15:52

Wreszcie znalazł rozwiązanie.

Okazuje się, że Flask Mysql należy wykonać w bloku try...catch..finally

A także upewnij się, że zamknąłeś kursor, jeśli używasz flask_mysqldb, który nie obsługuje zamykania za Ciebie.

Tak teraz wygląda moje zapytanie.

try:
    cur.execute('SELECT * FROM users WHERE `email` = %s', (email))
    results = cur.fetchall()
    cur.close()
except Exception:
    return 'Error: unable to fetch items'
    cur.close()
1
user5651557user5651557 30 grudzień 2020, 14:56

Przejdź do poniższego linku i użyj mysqlpool zamiast mysqldb lub mysqlext.

https://pypi.org/project/flask-mysqlpool/

    connection = mysql.connection.get_connection()
    cur=connection.cursor()
    query = "Enter your Query"
    cur.execute(query)
    connection.commit()
    cur.close()

I jeszcze jedna rzecz, która

App.config['MYSQL_POOL_SIZE'] = 30 ten rozmiar puli musi być mniejszy lub równy 32

0
Manohar Nookala 31 grudzień 2020, 14:24
Mysql = MySQLPool(aplikacja)
 – 
Manohar Nookala
31 grudzień 2020, 14:28