我对Python和Python Web应用程序开发相对较新。目前我正在使用mod_wsgi
在Python中创建一个hello world应用程序以下是我的配置。
Apache配置
<VirtualHost *:80>
ServerName mysite.com
DocumentRoot /var/www/mysite
WSGIDaemonProcess mysite threads=5
WSGIScriptAlias / /var/www/mysite/mysite.wsgi
WSGIProcessGroup mysite
<Directory /var/www/mysite>
WSGIProcessGroup mysite
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
mysite.wsgi
import os
import sys
path='/var/www/mysite'
if path not in sys.path:
sys.path.append(path)
import mysite.app
application = mysite.app.App()
app.py
import mysite.log as log
logger = log.custom_logger('root')
logger.debug('I am included only once')
class App:
"""
This Class is responsible
"""
def __init__(self):
logger.debug('I will be called only after apache restart')
"""
WSGI module will call this function by default
"""
def __call__(self, environ, start_response):
logger.debug('I will be invoked for every request')
# Do some stuff here
start_response(response_state, response_header)
return [response]
问题:我无法在__init__
内查看日志,并在app.py
内查看其中的日志。
输出
重启apache后第一次运行
DEBUG - app - 我只被包含一次
DEBUG - app - 只有在apache重启后我才会被调用
DEBUG - app - 我会为每个请求调用
当我在浏览器中刷新页面时
DEBUG - app - 我会为每个请求调用
发生了什么事?我知道__init__
不是构造函数,应用程序对象在某处缓存?这个故事是什么。
答案 0 :(得分:2)
您的代码甚至与记录的消息不匹配。
忽略这一点,模块首次加载时只导入一次。
__init __()仅在以下情况下调用一次:
application = mysite.app.APP()
在导入时运行。然后在每个请求上运行__call __()。
所以是的,东西被缓存在一个进程中,并在后续请求中重用。
IOW,像PHP这样的每个请求都没有重新加载。
所以不确定问题是什么。