Как вернуть результат от конечной точки fastapi, обрабатывающей массив чисел int32?

Мне нужно выполнить следующее задание:

Создайте общедоступную службу http или https. Он должен иметь общедоступную точку, которая принимает массив чисел int32, закодированных как json, в теле запроса и возвращает результат в виде числа. После развертывания передайте URL-адрес этой конечной точки в корень этого сервиса в теле запроса в виде строки в кодировке utf8. В случае успеха вы получите код успеха, который можно передать нам через чат upwork.

Я создал сервис (пока еще локальный), используя FastAPI:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

class ListRequest(BaseModel):
    numbers: list[int]

@app.post("/")
async def root(request: ListRequest):
    # int32 range
    int32_min = -2**31
    int32_max = 2**31 - 1

    for number in request.numbers:
        if not (int32_min <= number <= int32_max):
            raise HTTPException(status_code=400, detail = "All elements must be int32 numbers")
    
    return {"result": "something???"}

Я не понимаю эту часть: return result as a number?

Может кто-нибудь помочь мне, что именно мне нужно вернуть?

Спасибо.

Я думаю, вам следует уточнить это у человека/субъекта, который дал вам задание, потому что «вернуть число» в любом случае просто неясно/двусмысленно, независимо от контекста.

Lrx 04.09.2024 10:00

Я бы предположил, что по return result as a number нужно вернуть все числа, сложенные друг с другом.... но я бы спросил у присваивателя, потому что это неясная задача

Shad0w 04.09.2024 10:01

Извините, я сейчас обновил все сообщение. Меня беспокоит то, что я должен вернуть перед передачей конечной точки URL-адреса в корень службы?

bSmall 04.09.2024 10:09

Вам придется спросить человека, который дал вам задание. Никто не может вам сказать иначе или знать, что такое «сервис». В включенной вами части нет описания ожидаемого результата.

MatsLindh 04.09.2024 10:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я все равно рекомендовал бы задавать больше вопросов при работе над такой задачей, как эта.... это неясная задача, и если это что-то, что пойдет в производство, это может привести к множеству проблем, поэтому не стесняйтесь задавать вопросы о непонятные вещи.... Также я выбрал результат sum, потому что это самый «человечный» подход, когда меня спрашивают о «результате».

Я предполагаю, что вы не можете задавать вопрос, вот почему: я предполагаю, что они хотят от вас получить сумму результата от request.number, и после этого вам просто нужно передать URL-адрес, по которому числа будут складываться или где функция вернет HTTPException:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List

app = FastAPI()

class ListRequest(BaseModel):
     numbers: List[int]


@app.post("/")

async def root(request: ListRequest):
    # int32 range

    int32_min = -2**31

    int32_max = 2**31 - 1

    for number in request.numbers:
         if not (int32_min <= number <= int32_max):
             raise HTTPException(status_code=400, detail = "All 
            elements must be int32 numbers")


    result = sum(request.numbers)

    return {"result": result}

Здравствуйте, это сильное предположение, учитывая отсутствие подробностей в приведенном выше сообщении.

Lrx 04.09.2024 10:22

Привет @Lrx, да, это так, но из опыта некоторых проблем с кодированием, которые я решал на разных веб-сайтах, когда меня спрашивали о «результате», большую часть времени это сумма чисел (что, на мой взгляд, является глупой логикой, задачи должны быть ясными )

Shad0w 04.09.2024 10:27

@Shad0w Shad0w Я не могу задать вопрос, поэтому спрашиваю здесь. Попробую ваше решение. Знаете ли вы, могу ли я передать URL-адрес моей конечной точки (например, http://127.0.0.1:8000) этому корневому сервису или это должен быть общедоступный сервис (например, я размещаю его на Heroku)?

bSmall 04.09.2024 10:54

ваша служба FastAPI должна быть общедоступной, чтобы иметь возможность успешно взаимодействовать с внешней службой... вы можете использовать Heroku или другой инструмент, который делает ваш URL-адрес общедоступным при локальной работе (вы можете использовать бесплатный инструмент с открытым исходным кодом): LocalTunnel this это инструмент, который создает временный туннель. Он также предложит вам случайную ссылку https и сбрасывается при перезапуске туннеля.

Shad0w 04.09.2024 11:10

@bSmall Надеюсь, это поможет.

Shad0w 04.09.2024 11:28

@Shad0w Попробую и сообщу. Спасибо.

bSmall 04.09.2024 11:46

@Shad0w Мне удалось разместить его на Heroku, но у меня возникла проблема. Вот ссылка на вопрос, если вы можете помочь: stackoverflow.com/questions/78948074/…

bSmall 04.09.2024 12:17

эй @bSmall, я увидел другой твой вопрос и обновил свой ответ, можешь попробовать?

Shad0w 04.09.2024 12:37

и можете ли вы попробовать использовать Curl, например: curl -X POST http://194.182.164.40/ \ -H "x-auth: ......." \ -H "Content-Type: application/json" \ -d '{"url": "https://fast-api-test-app-f922f0fd9a50.herokuapp.com/"}' и я видел в вашем вопросе, что вы используете URL-адрес, отличный от «fast-api-test-app-f922f0fd9a50.herokuapp.com », вы использовали « fast-api -test-app-f922f0fd9a50.herokuapp.com/process» это правильно?

Shad0w 04.09.2024 12:42

Давайте продолжим обсуждение в чате.

Shad0w 04.09.2024 13:01

Я думаю, что задача здесь — создать интерфейс такой конечной точки (схемы).

Итак, для выполнения этой задачи вам необходимо указать модель ответа и вернуть правильное значение.

Поскольку не сказано, как приводить массив к одному числу, вы можете использовать sum или просто вернуть 42.

Обратите внимание: сказано, что вы должны возвращать результат в виде числа, а не в формате JSON с номером.

Кроме того, вы можете улучшить свой код, указав ограничения элемента списка в вашей модели:

from typing import Annotated, TypeAlias
from annotated_types import Gt, Lt

MyInt: TypeAlias = Annotated[int, Gt(-2**31 - 1), Lt(2**31)]

class InputData(BaseModel):
    numbers: list[MyInt]

В этом случае это будет показано в схеме openapi. И вам не нужно проверять элементы в вашей конечной точке (FastAPI сделает это за вас).

Знаете ли вы, могу ли я передать локальный URL-адрес моей конечной точки (например, 127.0.0.1:8000) этой корневой службе или это должна быть общедоступная служба (например, я размещаю ее на Heroku)?

bSmall 04.09.2024 11:02

Вы получили ответ на свой первоначальный вопрос? Давайте двигаться шаг за шагом

Yurii Motov 04.09.2024 11:04

Да, я получил ответ.

bSmall 04.09.2024 11:06

Следующий шаг — закрыть этот вопрос как решенный.

Yurii Motov 04.09.2024 11:10

Что касается вашего вопроса о развертывании, проще использовать что-то вроде Heroku. Вы также можете открыть свой локальный сервер для доступа в Интернет, но иногда это требует больше усилий и небезопасно.

Yurii Motov 04.09.2024 11:12

Хорошо, я открою его с помощью Heroku и при необходимости открою новый вопрос, потому что я не делал этого раньше.

bSmall 04.09.2024 11:36

Мне удалось разместить его на Heroku, но у меня возникла проблема. Вот ссылка на вопрос, если вы можете помочь: stackoverflow.com/questions/78948074/…

bSmall 04.09.2024 12:17

Другие вопросы по теме