bdb.BdbQuit повышается при использовании pdb в приложении Flask, запущенном на сервере uwsgi - PullRequest
3 голосов
/ 18 июня 2019

Я использую библиотеку Flask-SocketIO в своем проекте. Поскольку веб-сокеты должны «работать параллельно» с основным приложением Flask, мне необходимо использовать библиотеку gevent-websocket . Проблема возникает, когда я пытаюсь установить точку останова для отладчика в методе create_app:

Мой app.py файл:

# monkey patching standard library before importing 
# other modules
from gevent import monkey
monkey.patch_all()

import os
import logging.config

from flask import Flask
from dynaconf import FlaskDynaconf
...
# other imports


def configure_app(app):
    '''
    Configure app settings.
    '''
    FlaskDynaconf(app)
    import pdb; pdb.set_trace()
    logging.config.fileConfig(app.config.LOGGING_SETTINGS)

...

def create_app(run_from_celery=False):
    ''' 
    Create new Flask app instance.
    '''
    app = Flask('automoticz')
    configure_app(app)
    # ...
    return app

Когда я запускаю сервер (я использую uwsgi ), я получаю следующую ошибку:

$ uwsgi --http 0.0.0.0:5000 \
      --gevent 1000 \
      --http-websockets \
      --master \
      --wsgi-file automoticz/wsgi.py \
      --callable app
Traceback (most recent call last):
  File "automoticz/wsgi.py", line 3, in <module>
    app = create_app()
  File "./automoticz/app.py", line 138, in create_app
    configure_app(app)
  File "./automoticz/app.py", line 28, in configure_app
    logging.config.fileConfig(app.config.LOGGING_SETTINGS)
  File "./automoticz/app.py", line 28, in configure_app
    logging.config.fileConfig(app.config.LOGGING_SETTINGS)
  File "/usr/lib/python3.5/bdb.py", line 48, in trace_dispatch
    return self.dispatch_line(frame)
  File "/usr/lib/python3.5/bdb.py", line 67, in dispatch_line
    if self.quitting: raise BdbQuit
bdb.BdbQuit
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 22694)
spawned uWSGI worker 1 (pid: 22702, cores: 1000)
spawned uWSGI http 1 (pid: 22703)
*** running gevent loop engine [addr:0x494fa0] ***

Я пытался использовать исправленный pdb из gevent-tools , но результат был таким же для import gtools.pdb; gtools.pdb.set_trace()

 104         @app.before_request                                                                                          
 105         def log_request_info():                                                                                      
 106             import gtools.pdb                                                                                        
 107             gtools.pdb.set_trace()                                                                                   
 108  ->         log_request(request)                                                                                     
(Pdb++) 
2019-07-14 19:52:30 - flask.app - ERROR - Exception on /api/system/ws_devices [GET]
Traceback (most recent call last):
  File "./automoticz/app.py", line 108, in log_request_info
    log_request(request)
  File "./automoticz/app.py", line 108, in log_request_info
    log_request(request)
  File "/usr/lib/python3.5/bdb.py", line 48, in trace_dispatch
    return self.dispatch_line(frame)
  File "/usr/lib/python3.5/bdb.py", line 67, in dispatch_line
    if self.quitting: raise BdbQuit
bdb.BdbQuit

Есть ли способ заставить pdb работать правильно при работе под gevent?

1 Ответ

1 голос
/ 21 июля 2019

Немного покопавшись, я понял, что не стоит использовать

from gevent.pywsgi import WSGIServer
application = WSGIServer((application.config.SERVER_HOST, application.config.SERVER_PORT), application)

, так как он не работает.Таким образом, вы можете использовать вашу старую wsgi.py версию.Теперь возникает проблема, потому что, когда вы uwsgi, нет stdin, и он указывает на /dev/null.Поскольку нет стандартного ввода, отладчик не может запуститься.См. Ниже тему

Как отлаживать приложение Python под uWSGI?

Итак, вы хотите добавить --hounor-stdin и --gevent при работе uwsgi

uwsgi --http 0.0.0.0:5000 \
 --gevent 10 \
 --http-websockets \
 --master \
 --wsgi-file automoticz/wsgi.py \
 --honour-stdin

А теперь отладочные работы

Debugging working

...