Python mod_wsgi应用程序奇怪的行为

时间:2013-05-08 04:24:08

标签: python apache2 mod-wsgi

我对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__不是构造函数,应用程序对象在某处缓存?这个故事是什么。

1 个答案:

答案 0 :(得分:2)

您的代码甚至与记录的消息不匹配。

忽略这一点,模块首次加载时只导入一次。

__init __()仅在以下情况下调用一次:

application = mysite.app.APP()

在导入时运行。然后在每个请求上运行__call __()。

所以是的,东西被缓存在一个进程中,并在后续请求中重用。

IOW,像PHP这样的每个请求都没有重新加载。

所以不确定问题是什么。