У меня была такая же потребность в умении использовать удивительно мощный pdb
, отбрасывая pdb.set_trace()
везде, где я хотел отладить некоторую часть кода сервера Python.
Да, Apache порождает приложение WSGI в месте, где оно находится вне вашего контроля [1]. Но я нашел хороший компромисс к
поддержите свой Apache WSGIScriptAlias
, а также дайте себе возможность запустить свой сервер 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. И если на самом деле есть простые способы, я бы тоже хотел узнать о них.