Можно ли во Flask-е посылать HTTP GET запрос с телом?

Рейтинг: 0Ответов: 2Опубликовано: 28.04.2015

Пытаюсь научиться принимать в GET-методе тело с данными, но почему-то у меня ничего не приходит.

Вот код:

from flask import Flask, request

app = Flask(__name__)

@app.route('/test')
def get_test_data():
    print('\nrequest:')
    print(request)
    print('request.data:')
    print(request.data)

А вот код теста:

import unittest
from flask import url_for
from proba import app  

class ProbaTest(unittest.TestCase):
    def setUp(self):
        self.app_ctx = app.app_context()
        self.app_ctx.push()
        self.client = app.test_client()

    def tearDown(self):
        self.app_ctx.pop()

    def test(self):
        self.client.get(url_for('get_test_data'),
            data={'username' : 'user1', 'password' : 'pass1'})

if __name__ == '__main__':
    unittest.main(verbosity=2)

Получаю:

(env) d:\Projects\python-workspace\proba>python manage.py test
test (proba_test.ProbaTest) ...
request:
<Request 'http://localhost/test' [GET]>
request.data:
b''
ok

Моя основная цель: Выдавать информацию по моим ресурсам только тем, кто зарегистрирован.

Для этого пишу декоратор, в котором идет проверка переданных в запросе username и password. А это минимальный пример повторяющий мою ситуацию.

Прошу подсказать что я делаю не так?

UPD: В комментариях было сказано, что в GET нельзя посылать тело. Есть на эту тему обсуждение в англоязычной версии stackoverflow: HTTP GET with request body

Ответы

▲ 1Принят

Решением моей проблемы является применение метода request.get_data() вместо request.data.

Есть достаточно подробное пояснение в англо-язычной версии Get raw POST body in Python Flask regardless of Content-Type header

▲ 3

get-запрос отличается от post запроса как раз тем, что у get-запроса нет тела. поэтому нужно либо пользоваться либо post-запросом, либо передавать ваши данные в get-параметрах, типа

self.client.get('{0}?username=user1&password=pass1'.format(url_for('get_test_data')))