我对 python 比较陌生,正在寻找一种 pythonic 方法来处理这种实践。
我继承了一个相当简单的 Python 2.7 Flask 应用程序,该应用程序在 uwsgi 下运行,我想向其中添加一些单元测试。它在缩进级别 0 上进行一些初始化,这在 uwsgi 中运行时是必需的,但在测试时需要跳过。
我了解到 python 应用程序经常使用
if __name__ == '__main__':
模式来隔离应该在脚本单独运行时运行并且在导入脚本时不应运行的代码。然而,在这种情况下,当脚本在 uwsgi 下运行时以及当脚本导入到单元测试中时,__name__
是一样的;脚本的名称,所以我不能用它来区分 uwsgi 和单元测试环境。
此示例代码说明了我正在使用的内容。
在 Flask 应用程序 (flask_app.py) 中:
import logging
import bcrypt
from flask import Flask, jsonify, abort, make_response, request
from ConfigParser import SafeConfigParser
# some initialization that only makes sense when running from the uwsgi context on the server
PARSER = SafeConfigParser()
PARSER.read('config.ini')
LOG_FILE = PARSER.get('General', 'logfile')
APP = Flask(__name__)
@APP.route('/', methods=['GET'])
def index
...
@APP.route('/<p1>/<p2>', methods=['PUT'])
def put(p1, p2):
...
if __name__ == '__main__':
APP.run(debug = True, host='0.0.0.0')
在单元测试(tests.py)中:
import os
import unittest
from flask import json
from flask_app import APP
class FlaskAppTestCase(unittest.TestCase):
def setUp(self):
self.APP = APP.test_client()
def test_GET(self):
resp = self.APP.get('/')
assert 'Some Html' in resp.data
def test_PUT(self):
resp = self.APP.put('/1/2')
assert 'Got 1, 2' in resp.data
if __name__ == '__main__':
unittest.main()
我想做的是移动初始化,以便它仅在 uwsgi 执行flask_app 时运行,而不是在通过tests.py 运行时运行,也许通过检查name并根据该路径确定要执行的路径,但是当我检查 print(name)无论是在uwsgi下运行flask_app还是通过执行tests.py,输出都是“flask_app”,所以我似乎无法将其用作鉴别器。
python中有一个惯用的方法来处理这个问题吗?