使用 GET 请求而不是 POST 的 Flask 测试客户端
Flask test client using GET request instead of POST
我有一个仅用于 POST 请求的路由,如果满足条件,它会 returns json 响应。是这样的:
@app.route('/panel', methods=['POST'])
def post_panel():
# Check for conditions and database operations
return jsonify({"message": "Panel added to database!"
"success": 1})
我正在使用 flask-sslify 将 http 请求强制转换为 https。
我正在使用 Flask 测试客户端和单元测试测试这条路线。测试函数类似于以下内容:
class TestAPI2_0(unittest.TestCase):
def setUp(self):
self.app = create_app('testing')
self.app_context = self.app.app_context()
self.app_context.push()
db.create_all()
create_fake_data(db)
self.client = self.app.test_client()
def tearDown(self):
....
def test_post_panel_with_good_data(self):
# data
r = self.client.post('/panel',
data=json.dumps(data),
follow_redirects=True)
print(r.data)
self.assertEqual(r.status_code, 200)
输出如下:
test_post_panel_with_good_data (tests.test_api_2_0.TestAPI2_0) ... b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<title>405 Method Not Allowed</title>\n<h1>Method Not Allowed</h1>\n<p>The method is not allowed for the requested URL.</p>\n'
======================================================================
FAIL: test_post_panel_with_good_data (tests.test_api_2_0.TestAPI2_0)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/tanjibpa/work/craftr-master/tests/test_api_2_0.py", line 110, in test_post_panel_with_good_data
self.assertEqual(r.status_code, 200)
AssertionError: 405 != 200
我收到一条错误消息,指出该路线中不允许使用方法。
如果我将 GET 指定为路由测试的方法 (methods=['GET', 'POST']
) 似乎可行。但是为什么测试客户端发出 GET 请求?除了为路由指定 GET 请求之外,还有其他解决方法吗?
更新:
如果这样做:
@app.route('/panel', methods=['GET', 'POST'])
def post_panel():
if request.method == 'POST':
# Check for conditions and database operations
return jsonify({"message": "Panel added to database!"
"success": 1})
return jsonify({"message": "GET request"})
我得到这样的输出:
test_post_panel_with_good_data (tests.test_api_2_0.TestAPI2_0) ... b'{\n "message": "GET request"\n}\n'
我发现是什么导致了 Flask 测试客户端中的 GET 请求。
我正在使用 flask-sslify 将 http 请求强制转换为 https。
flask-sslify 以某种方式强制执行 GET 请求,尽管测试客户端指定了其他类型的请求(POST、PUT、DELETE...)。
所以,如果我在测试 flask 测试客户端时禁用 sslify,那么它应该可以正常工作。
我有一个仅用于 POST 请求的路由,如果满足条件,它会 returns json 响应。是这样的:
@app.route('/panel', methods=['POST'])
def post_panel():
# Check for conditions and database operations
return jsonify({"message": "Panel added to database!"
"success": 1})
我正在使用 flask-sslify 将 http 请求强制转换为 https。
我正在使用 Flask 测试客户端和单元测试测试这条路线。测试函数类似于以下内容:
class TestAPI2_0(unittest.TestCase):
def setUp(self):
self.app = create_app('testing')
self.app_context = self.app.app_context()
self.app_context.push()
db.create_all()
create_fake_data(db)
self.client = self.app.test_client()
def tearDown(self):
....
def test_post_panel_with_good_data(self):
# data
r = self.client.post('/panel',
data=json.dumps(data),
follow_redirects=True)
print(r.data)
self.assertEqual(r.status_code, 200)
输出如下:
test_post_panel_with_good_data (tests.test_api_2_0.TestAPI2_0) ... b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<title>405 Method Not Allowed</title>\n<h1>Method Not Allowed</h1>\n<p>The method is not allowed for the requested URL.</p>\n'
======================================================================
FAIL: test_post_panel_with_good_data (tests.test_api_2_0.TestAPI2_0)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/tanjibpa/work/craftr-master/tests/test_api_2_0.py", line 110, in test_post_panel_with_good_data
self.assertEqual(r.status_code, 200)
AssertionError: 405 != 200
我收到一条错误消息,指出该路线中不允许使用方法。
如果我将 GET 指定为路由测试的方法 (methods=['GET', 'POST']
) 似乎可行。但是为什么测试客户端发出 GET 请求?除了为路由指定 GET 请求之外,还有其他解决方法吗?
更新:
如果这样做:
@app.route('/panel', methods=['GET', 'POST'])
def post_panel():
if request.method == 'POST':
# Check for conditions and database operations
return jsonify({"message": "Panel added to database!"
"success": 1})
return jsonify({"message": "GET request"})
我得到这样的输出:
test_post_panel_with_good_data (tests.test_api_2_0.TestAPI2_0) ... b'{\n "message": "GET request"\n}\n'
我发现是什么导致了 Flask 测试客户端中的 GET 请求。 我正在使用 flask-sslify 将 http 请求强制转换为 https。 flask-sslify 以某种方式强制执行 GET 请求,尽管测试客户端指定了其他类型的请求(POST、PUT、DELETE...)。
所以,如果我在测试 flask 测试客户端时禁用 sslify,那么它应该可以正常工作。