Мне нужно выполнить следующее задание:
Создайте общедоступную службу 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
?
Может кто-нибудь помочь мне, что именно мне нужно вернуть?
Спасибо.
Я бы предположил, что по return result as a number
нужно вернуть все числа, сложенные друг с другом.... но я бы спросил у присваивателя, потому что это неясная задача
Извините, я сейчас обновил все сообщение. Меня беспокоит то, что я должен вернуть перед передачей конечной точки URL-адреса в корень службы?
Вам придется спросить человека, который дал вам задание. Никто не может вам сказать иначе или знать, что такое «сервис». В включенной вами части нет описания ожидаемого результата.
Я все равно рекомендовал бы задавать больше вопросов при работе над такой задачей, как эта.... это неясная задача, и если это что-то, что пойдет в производство, это может привести к множеству проблем, поэтому не стесняйтесь задавать вопросы о непонятные вещи.... Также я выбрал результат 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, да, это так, но из опыта некоторых проблем с кодированием, которые я решал на разных веб-сайтах, когда меня спрашивали о «результате», большую часть времени это сумма чисел (что, на мой взгляд, является глупой логикой, задачи должны быть ясными )
@Shad0w Shad0w Я не могу задать вопрос, поэтому спрашиваю здесь. Попробую ваше решение. Знаете ли вы, могу ли я передать URL-адрес моей конечной точки (например, http://127.0.0.1:8000
) этому корневому сервису или это должен быть общедоступный сервис (например, я размещаю его на Heroku)?
ваша служба FastAPI должна быть общедоступной, чтобы иметь возможность успешно взаимодействовать с внешней службой... вы можете использовать Heroku или другой инструмент, который делает ваш URL-адрес общедоступным при локальной работе (вы можете использовать бесплатный инструмент с открытым исходным кодом): LocalTunnel this это инструмент, который создает временный туннель. Он также предложит вам случайную ссылку https и сбрасывается при перезапуске туннеля.
@bSmall Надеюсь, это поможет.
@Shad0w Попробую и сообщу. Спасибо.
@Shad0w Мне удалось разместить его на Heroku, но у меня возникла проблема. Вот ссылка на вопрос, если вы можете помочь: stackoverflow.com/questions/78948074/…
эй @bSmall, я увидел другой твой вопрос и обновил свой ответ, можешь попробовать?
и можете ли вы попробовать использовать 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» это правильно?
Давайте продолжим обсуждение в чате.
Я думаю, что задача здесь — создать интерфейс такой конечной точки (схемы).
Итак, для выполнения этой задачи вам необходимо указать модель ответа и вернуть правильное значение.
Поскольку не сказано, как приводить массив к одному числу, вы можете использовать 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)?
Вы получили ответ на свой первоначальный вопрос? Давайте двигаться шаг за шагом
Да, я получил ответ.
Следующий шаг — закрыть этот вопрос как решенный.
Что касается вашего вопроса о развертывании, проще использовать что-то вроде Heroku. Вы также можете открыть свой локальный сервер для доступа в Интернет, но иногда это требует больше усилий и небезопасно.
Хорошо, я открою его с помощью Heroku и при необходимости открою новый вопрос, потому что я не делал этого раньше.
Мне удалось разместить его на Heroku, но у меня возникла проблема. Вот ссылка на вопрос, если вы можете помочь: stackoverflow.com/questions/78948074/…
Я думаю, вам следует уточнить это у человека/субъекта, который дал вам задание, потому что «вернуть число» в любом случае просто неясно/двусмысленно, независимо от контекста.