Что делать если нужно отправить в api очень длинный запрос?

Предисловие = описание ошибки
Got more than 8190 bytes (25569123) when reading Status line is too long.

Делаю api, требуется принять большой объект json, обработать и вернуть. Но в попытке передать этот объект в api как следует из ошибки, мне сообщают что мой запрос слишком велик. Если честно я теряюсь и не понимаю что я могу сделать что бы осуществить задуманной либо пойти каким то приемлемым альтернативным путем.
api я построил на aiohttp. Я пробовал и другие фремйворки но в целом проблема та же, не говоря уж о сопутствующих проблемах других фреймворков....
П.С.: Прошу принять во внимание что я новичок... если уж окажется что я совсем какую то ерунду спрашиваю...

async def handle(request):
    data = json.loads(request.query['data'])
    brand = json.loads(request.query['brand'])
    ip = request.query['ip']
    final_data = launch_processors(brand, data)
    
    return web.Response(text=json.dumps(final_data, ensure_ascii=False))
  • Вопрос задан
  • 921 просмотр
Решения вопроса 2
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Большие объемы данных лучше передавать через POST. Там ограничение на объем тела запроса несколько мегабайт (зависит от настроек, может быть до 2 гигабайт).
Ответ написан
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
1) проверьте, что сервер пропускает ваш запрос и в нем нет ограничения! Еьо если работаете через nginx например.
2) передавайте методом POST
3) в самом приложении может где сами лимиты какие поставили, бывает.
Если все настроено правильно, никаких ограничений быть не должно, летают запросы иногда по несколько гигабайт.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@bkosun
Для начала нужно посмотреть исходники:
class HeadersParser:
    def __init__(self,
                 max_line_size: int=8190,
                 max_headers: int=32768,
                 max_field_size: int=8190) -> None:
...


https://github.com/aio-libs/aiohttp/blob/5f0a59fd3...

class HttpParser(abc.ABC):

    def __init__(self, protocol: BaseProtocol,
                 loop: asyncio.AbstractEventLoop,
                 max_line_size: int=8190,
                 max_headers: int=32768,
                 max_field_size: int=8190,
...


https://github.com/aio-libs/aiohttp/blob/5f0a59fd3...
Ответ написан
@Alons Автор вопроса
Как итог что было...
Я передавал данные post но использовал по незнанию params = а должен был data=.
requests.post("http://localhost:8080/find", data=payload)

Это безусловно сходу увеличило объем проходимых данных но, но как оказалось по умолчанию все равно есть ограничитель.
Установлен он client_max_size=1024**2
Изменений до client_max_size=1024**8 вполне хватило для необходимого мне объема.
web.Application(client_max_size=1024**8)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы