我对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后第一次运行
  
  调试-应用-仅包含一次
  
  调试-应用-仅在apache重新启动后才会调用我
  
  DEBUG-应用-每个请求都会被调用
  
  当我在浏览器中刷新页面时
  
  DEBUG-应用-每个请求都会被调用


怎么了?我知道__init__不是构造函数,应用程序对象正在缓存某处?发生了什么。

最佳答案

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

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

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

application = mysite.app.APP()


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

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

IOW,不会在每个请求(如PHP)上重新加载内容。

所以不确定是什么问题。

08-26 00:19
查看更多