uwsgi 中的 Python 习语 `if __name__ == '__main__':`?

问题描述 投票:0回答:1

uwsgi 中的 Python 习惯用法是什么

if __name__ == '__main__':
   main()

我在这里发现了uwsgi中的一个长字符串而不是

__main__
uwsgi 使用什么 __name__ 字符串?。但这看起来像是一个解决方法。当 uwsgi 启动我的 python 脚本时,有没有更好的方法来调用一次函数?

python uwsgi
1个回答
1
投票

这取决于您要防范的是什么。我能想到三个用例:

  • 仅在运行真实服务器时才执行某些操作,而不是单元测试。
  • 如果模块是主 WSGI 文件,则在模块中执行某些操作。
  • 在 uwsgi fork 一个工作进程之后做一些事情。

仅在运行真实服务器时才执行某些操作,而不是单元测试

uwsgi
二进制文件提供了一个名为
uwsgi
的模块,否则该模块不可导入。这最适合用于检测您是否正在运行单元测试。请参阅 在 uwsgi 下运行的单元测试 Flask 应用程序

try:
    import uwsgi
except ImportError:
    UWSGI_SERVER = False
else:
    UWSGI_SERVER = True

if UWSGI_SERVER:
   do_something()
else:
   import test_utils
   test_utils.mock_do_somethng()

如果模块是主 WSGI 文件,则在模块中执行某些操作

这意味着上面的内容,如果您的主模块有一个

uwsgi_file_*
模块名称,那么您正在运行一个
uwsgi
服务器。它还可以让您知道哪个文件作为主模块运行。即包含您的应用程序的那个。也许您正在运行一些微服务,它们都使用相同的核心,但需要根据运行的服务进行稍微不同的配置。 文件:

myapp.py

import sys
if __name__ == 'uwsgi_file_myapp':
    assert 'uwsgi_file_myapp' in sys.modules, (
        'other modules can also see what the main module is'
    )
    connect_to_redis()

请参阅 
uwsgi 使用什么 __name__ 字符串?

了解更多详细信息。 在 uwsgi fork 一个工作进程后做一些事情

对于对每个工作进程进行一次性初始化非常有用。比如连接数据库。

try: import uwsgi except ImportError: def postfork(func): """Dummy decorator for unit tests""" return func else: from uwsgidecorators import postfork DB = None @postfork def init_db(): global DB from datetime import datetime DB = f'some-database connection, set @ {datetime.now().isoformat()}' def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [f'{DB=!r}'.encode()]

该程序需要使用 
--master

选项运行。例如。

uwsgi --http :8080 --master --wsgi-file myapp.py

	
© www.soinside.com 2019 - 2024. All rights reserved.