Тестовый клиент Flask, использующий запрос GET вместо POST

У меня есть маршрут только для запроса 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'

person tanjibpa    schedule 11.11.2017    source источник
comment
В коде я вижу маршрут, определенный как /panel, а в тестовом методе вызов /api/panel. Это правильно так?   -  person janos    schedule 11.11.2017
comment
да. Вот так. Это из-за префикса маршрута плана API.   -  person tanjibpa    schedule 11.11.2017
comment
Не могли бы вы попробовать использовать url_for(api.post_panel)? Возможно, ваши маршруты не такие, как вы думаете.   -  person Ryan Baker    schedule 11.11.2017
comment
@RyanBaker Пробовали url_for(). Тот же результат.   -  person tanjibpa    schedule 12.11.2017


Ответы (1)


Я узнал, что вызывало запрос GET в тестовом клиенте фляги. Я использую flask-sslify для принудительной отправки HTTP-запросов на https. Каким-то образом flask-sslify выполняет запрос GET, хотя тестовый клиент указан с запросами другого типа (POST, PUT, DELETE...).

Итак, если я отключу sslify во время тестирования, тестовый клиент flask работает как надо.

person tanjibpa    schedule 17.11.2017