У меня проблемы с aiohttp
. Прежде всего скажу, что я читаю документацию на официальном сайте aiohttp
, в частности deploy.
Я создаю бот-телеграмму, где использую aiohttp
и asyncio
, потому что мне нужен фонзадачи для моего приложения. Ниже я покажу часть кода
from aiohttp import web
import aiohttp
import asyncio
import config
import telebot
import database
import ssl
STATE = ['start', 'chat_id_sp', 'nickname_sp', 'del_sp']
API_TOKEN = config.token
bot = telebot.TeleBot(API_TOKEN)
WEBHOOK_HOST = '***.***.***.***' #*-is IP of my server
WEBHOOK_PORT = 8443 # 443, 80, 88 or 8443 (port need to be 'open')
WEBHOOK_LISTEN = '0.0.0.0' # In some VPS you may need to put here the IP addr
WEBHOOK_SSL_CERT = './webhook_cert.pem' # Path to the ssl certificate
WEBHOOK_SSL_PRIV = './webhook_pkey.pem' # Path to the ssl private key
WEBHOOK_URL_BASE = "https://{}:{}".format(WEBHOOK_HOST, WEBHOOK_PORT)
WEBHOOK_URL_PATH = "/{}/".format(API_TOKEN)
app = web.Application()
# Process webhook calls, BOT PART
async def handle(request):
if request.match_info.get('token') == bot.token:
request_body_dict = await request.json()
update = telebot.types.Update.de_json(request_body_dict)
bot.process_new_updates([update])
return web.Response()
else:
return web.Response(status=403)
# background tasks
async def check_logs():
while True:
database.load_btc_wallets_and_nicknames()
await asyncio.sleep(59)
database.update_life_time_of_wallets()
await asyncio.sleep(1)
database.delete_wallet_if_time()
await asyncio.sleep(30)
database.check_balance_on_wallets()
await asyncio.sleep(30)
async def start_background_tasks(app):
app['check_logs'] = app.loop.create_task(check_logs())
async def cleanup_background_tasks(app):
app['check_logs'].cancel()
await app['check_logs']
app.router.add_post('/{token}/', handle)
app.on_startup.append(start_background_tasks)
app.on_cleanup.append(cleanup_background_tasks)
# command start to Bot, BOT PART
@bot.message_handler(commands=['start'])
def command(message):
bot.send_message(message.chat.id, 'Main menu', reply_markup=keyboard)
bot.remove_webhook()
time.sleep(1)
# Build ssl context
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_cert_chain(WEBHOOK_SSL_CERT, WEBHOOK_SSL_PRIV)
bot.set_webhook(url=WEBHOOK_URL_BASE + WEBHOOK_URL_PATH,
certificate=open(WEBHOOK_SSL_CERT, 'r'))
Если я добавлю эту часть кода:
web.run_app(
app,
host=WEBHOOK_LISTEN,
port=WEBHOOK_PORT,
ssl_context=context,
)
И в venv на моем сервере введите: python3 main.py
Все работает отлично. Но когда я хочу начать с gunicorn и просто войти (я удаляю web.run_app при запуске gunicorn) gunicorn main:app --bind localhost:8443 --worker-class aiohttp.GunicornWebWorker
Моя фоновая задача работает отлично, но часть бота не работает. В чем может быть моя проблема?