Запуск pdb в режиме демона с WSGI - PullRequest
3 голосов
/ 28 августа 2011

Я запускаю скрипт Python на Apache 2.2 с модом wsgi.

Возможно ли запустить pdb.set_trace () в скрипте python, используя режим демона в wsgi?

Редактировать Причина, по которой я хочу использовать режим демона вместо встроенного режима, состоит в том, чтобы иметь возможность перезагружать код без необходимости перезапускать сервер Apache каждый раз (который требуется для встроенного режима).Я хотел бы иметь возможность использовать перезагрузку кода без перезапуска Apache каждый раз и при этом иметь возможность использовать pdb ...

1 Ответ

1 голос
/ 19 мая 2014

У меня была такая же потребность в умении использовать удивительно мощный pdb, отбрасывая pdb.set_trace() везде, где я хотел отладить некоторую часть кода сервера Python.

Да, Apache порождает приложение WSGI в месте, где оно находится вне вашего контроля [1]. Но я нашел хороший компромисс к

  1. поддержите свой Apache WSGIScriptAlias

  2. , а также дайте себе возможность запустить свой сервер Python в терминале (тестирование локально, а не через Apache в этом случае)

Так что, если использовать WSGIScriptAlias, примерно так ... указывая на ваш Python WSGI-скрипт с именем webserver.py

<VirtualHost *:443>

    ServerName myawesomeserver
    DocumentRoot /opt/local/apache2/htdocs

    <Directory /opt/local/apache2/htdocs>
        [...]
    </Directory>

    WSGIScriptAlias /myapp /opt/local/apache2/my_wsgi_scripts/webserver.py/

    <Directory /opt/local/apache2/my_wsgi_scripts/>
        [...]
    </Directory>

    [...]
    SSLEngine on
    [...]
</VirtualHost>                                  

И поэтому ваш webserver.py может иметь простой переключатель для переключения между использованием Apache и началом отладки вручную.

Сохраните флаг в вашем конфигурационном файле, например, в некоторых settings.py:

WEBPY_WSGI_IS_ON = True

И webserver.py:

import web
import settings

urls = (
    '/', 'excellentWebClass',
    '/store', 'evenClassier',)

if settings.WEBPY_WSGI_IS_ON is True:
    # MODE #1: Non-interactive web.py ; using WSGI
    #   So whenever true, the Web.py application here will talk wsgi.
    application = web.application(urls, globals()).wsgifunc()

class excellentWebClass:
    def GET(self, name):

        # Drop a pdb  wherever you want only if running manually from terminal.
        pdb.set_trace()

        try:
            f = open (name)
            return f.read()
        except IOError:
            print 'Error: No such file %s' % name

if __name__ == "__main__":

    # MODE #2: Interactive web.py , for debugging.
    #   Here you call it directly.  
    app = web.application(urls, globals())
    app.run()

Поэтому, когда вы хотите протестировать свой веб-сервер в интерактивном режиме, вы просто запускаете его из терминала,

$ python webserver.py 8080
starting web...
http://0.0.0.0:8080/

[1] Сноска: Есть несколько действительно сложных способов получить дочерние процессы Apache под вашим контролем, но я думаю, что выше намного проще, если вы просто хотите отлаживать код своего сервера Python. И если на самом деле есть простые способы, я бы тоже хотел узнать о них.

...