Могу ли я использовать библиотеку запросов в задаче Celery?
У меня есть приложение Django, в котором есть push-уведомления для пользователей. Пользователи идентифицируются на основе JWT-токена, имена пользователей или пароли не используются. У меня есть модель для сохранения события в базе данных, а также маршрут для отправки уведомления пользователю. Я использую Celery
для проверки событий из базы данных каждые n минут и теперь мне нужно построить логику для отправки события пользователю, основываясь, например, на значении временной метки события. Я создал задачу для tasks.py
для проверки событий:
@shared_task
def get_events():
from .models import User, Notification
users = User.objects.all()
for user in users:
events = Notification.objects.filter(id=user.id)
if len(events) > 0:
for event in events:
api_call(user.id)
Это только скелет, так как я пытаюсь найти правильный способ сделать это. Моя основная проблема на данный момент заключается в том, что я могу получить всех пользователей и все события, но я не знаю, как использовать библиотеку requests
для выполнения запроса к конечной точке, которая у меня есть для отправки уведомлений. Или, может быть, более важный вопрос: правильно ли я вообще это делаю? Есть ли какой-то лучший способ проверки событий в базе данных и отправки уведомлений пользователям? В views.py
я могу аутентифицировать пользователей из запроса, но я понятия не имею, возможно ли это в моем tasks.py
файле в задачах Celery?
Вот api_call
-функция, которую я использую в данный момент. На данный момент я пытаюсь получить токен аутентификации для пользователя:
def api_call(id):
url = 'http://localhost:8000/token/'
data = {
"id": id
}
jsonObject = json.dumps(data)
try:
requests.post(url, json=jsonObject)
except Exception as e:
print(e)
Это дает мне ошибку:
WARNING/ForkPoolWorker-8] HTTPConnectionPool(host='localhost', port=8000): Max retries exceeded with url: /token/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f66701c9b80>: Failed to establish a new connection: [Errno 111] Connection refused'))