У меня есть маршрут только для запроса POST, и он возвращает ответ 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 и unittest. Тестовая функция аналогична следующей:
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'
/panel
, а в тестовом методе вызов/api/panel
. Это правильно так? - person janos   schedule 11.11.2017url_for(api.post_panel)
? Возможно, ваши маршруты не такие, как вы думаете. - person Ryan Baker   schedule 11.11.2017url_for()
. Тот же результат. - person tanjibpa   schedule 12.11.2017