Python API не удалось ПОЛУЧИТЬ запрос с помощью aiohttp

#python #rest #heroku #aiohttp

#python #rest #heroku #aiohttp

Вопрос:

Я пытаюсь создать свой собственный API с использованием aiohttp. Он отлично работает на локальном хосте: 8080, есть ли способ подключить его к сайту heroku, я пытался загрузить, https://dumboapi.herokuapp.com/getmeme/ но он не работает:/ Это мой код:

 subreddit = ['memes', 'dankmemes', 'funny']

HEADERS = {
    'User-Agent' : "Dumbo"
}
async def getmeme():
    async with request("GET", f"https://www.reddit.com/r/{choice(subreddit)}/new.json?limit=100", headers=HEADERS) as resp:
        data = await resp.json()
        link_data = data['data']['children'][2]['data']['url_overridden_by_dest']
        title_data = data['data']['children'][2]['data']['title']
        score_data = data['data']['children'][2]['data']['score']
        submission = data['data']['children'][2]['data']['subreddit_name_prefixed']
        meme_data = {'image': f'{link_data}', 'title': f'{title_data}', 'score': f'{score_data}', 'subreddit': f'{submission}'}
        return meme_data

@routes.get('/getmeme')
async def handle(request):
    response = await getmeme()
    return web.Response(text=json.dumps(response))

async def initialize():
    app = web.Application()
    app.add_routes(routes)
    return app

web.run_app(initialize())
  

Ошибка от Heroku:

 2020-10-14T05:30:55.726041 00:00 heroku[worker.1]: Restarting
2020-10-14T05:30:55.739241 00:00 heroku[worker.1]: State changed from up to starting
2020-10-14T05:30:56.951514 00:00 heroku[worker.1]: Stopping all processes with SIGTERM
2020-10-14T05:30:57.134832 00:00 heroku[worker.1]: Process exited with status 0
2020-10-14T05:30:58.635865 00:00 heroku[worker.1]: Starting process with command `python main.py`
2020-10-14T05:30:59.240689 00:00 heroku[worker.1]: State changed from starting to up
2020-10-14T05:31:00.887027 00:00 app[worker.1]: ======== Running on http://0.0.0.0:8080 ========
2020-10-14T05:31:00.887045 00:00 app[worker.1]: (Press CTRL C to quit)
2020-10-14T05:31:08.758433 00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/getmeme/" host=dumboapi.herokuapp.com request_id=39a1af4e-c49b-45a5-b925-927ae0236996 fwd="IP" dyno= connect= service= status=503 bytes= protocol=https
2020-10-14T05:31:09.853957 00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=dumboapi.herokuapp.com request_id=98f603ac-700f-495d-812a-23608c42fccd fwd="IP" dyno= connect= service= status=503 bytes= protocol=https
  

Комментарии:

1. Как я могу это сделать? Извините, я новичок, я также пытался изменить свой Procfile с worker на web, но он даже не загружается

2. Я бы сказал вам, если бы знал. Не совсем уверен, какую платформу (django / flask / pylon / и т. Д.) Вы используете для настройки веб-сервера? Также у меня нет опыта работы с Heroku, поэтому я просто упоминаю то, что нахожу в предоставленном коде.

3. Я использую aiohttp для настройки сервера

Ответ №1:

Здесь это сказано Only web dynos receive HTTP traffic from the routers .

Из того, что я вижу, я полагаю, вы не используете тип веб-процесса.

 2020-10-14T05:31:08.758433 00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/getmeme/" host=dumboapi.herokuapp.com request_id=39a1af4e-c49b-45a5-b925-927ae0236996 fwd="IP" dyno= connect= service= status=503 bytes= protocol=https
2020-10-14T05:31:09.853957 00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=dumboapi.herokuapp.com request_id=98f603ac-700f-495d-812a-23608c42fccd fwd="IP" dyno= connect= service= status=503 bytes= protocol=https
  

Измените тип процесса web на Procfile также считайте номер порта из среды ( PORT переменной), предоставляемой heroku.

Ответ №2:

На Heroku вы должны использовать TCP-порт, который Heroku предоставит вам в переменной PORT среды. Завершение SSL и т. Д. Будет обрабатываться уровнем маршрутизации Heroku.

Это должно сработать, если вы измените свой код (примерно) на:

 port=int(os.environ.get("PORT", "8080"))
web.run_app(initialize(), port=port)