1

我对 Python 和 Python Web 应用程序开发比较陌生。目前我正在使用 mod_wsgi 在 Python 中创建一个 hello world 应用程序

这是我的配置。

阿帕奇配置

<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>

我的网站.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()

应用程序.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后第一次运行

调试 - 应用程序 - 我只包含一次

调试 - 应用程序 - 我只会在 apache 重启后被调用

DEBUG - 应用程序 - 我将为每个请求调用

当我在浏览器中刷新页面时

DEBUG - 应用程序 - 我将为每个请求调用

怎么了?我知道这__init__不是构造函数,应用程序对象在某处缓存?来龙去脉是什么。

4

1 回答 1

2

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

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

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

application = mysite.app.APP()

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

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

IOW,不会像 PHP 这样的每个请求都重新加载东西。

所以不确定是什么问题。

于 2013-05-08T04:45:06.717 回答