Django channels trigger websocket send in http view
Я новичок в веб-сокетах и каналах, экспериментирую с простым приложением для уведомлений.
notification model
class Note(models.Model):
profile = models.ForeignKey('users.Profile', on_delete=models.CASCADE, related_name='notes', blank=1, null=1)
createTime = models.DateTimeField(default=now)
url = models.CharField(max_length=255, blank=True, null=True)
type = models.CharField(max_length=50, blank=True, null=True)
title = models.CharField(max_length=50, blank=True, null=True)
content = models.CharField(max_length=255, blank=True, null=True)
read = models.BooleanField(default=False)
@staticmethod
def trigger(url, type, title, content, profile):
try:
notes = Note.objects.filter(url=url, type=type, title=title, content=content)
flag = 1
for note in notes:
if note in profile.notes.all():
flag = 0
if flag:
raise Note.DoesNotExist
except Note.DoesNotExist:
note = Note(url=url, type=type, title=title, content=content)
note.save()
profile.notes.add(note)
profile.save()
return note
@staticmethod
def dismiss(**kwargs):
try:
Note.objects.filter(**kwargs).delete()
except Note.DoesNotExist:
pass
Статический метод trigger вызывается в других http представлениях для генерации уведомления после проверки дублирования. Например:
@csrf_exempt
def articleLikePost(request):
if request.is_ajax() and request.method == 'POST':
try:
article = Article.objects.get(pk=request.POST['article'])
if article in request.user.likedArticle.all():
# unlike
article.like.remove(request.user)
article.save()
Note.dismiss(
sender=request.user,
points=5,
accepter=article.author,
url=str(reverse_lazy('article-detail', kwargs={'pk': article.pk})),
type='up',
title='Aritcle receives likes',
content=f'{request.user.username} liked your article {article.title}',
)
return JsonResponse({'action': 'unlike'}, status=200)
else:
# like
article.like.add(request.user)
article.save()
Note.trigger(
sender=request.user,
points=5,
accepter=article.author,
url=article.detailLink(),
type='up',
title='Aritcle receives likes',
content=f'{request.user.username} liked your article {article.title}',
)
return JsonResponse({'action': 'like'}, status=200)
except Article.DoesNotExist:
return JsonResponse({'e': 'Article not found'}, status=400)
return JsonResponse({}, status=400)
Я построил базовый потребитель и успешно запустил слои Redis:
class NoteConsumer(WebsocketConsumer):
def connect(self):
# print(self.scope['user'].profile)
self.accept()
def disconnect(self, close_code):
pass
def receive(self, text_data):
text_data_json = json.loads(text_data)
message = text_data_json['message']
self.send(text_data=json.dumps({
'message': message
}))
это работает следующим образом, когда пользователю нравится ваша статья, вы немедленно получаете заметку на вашем фронтенде. но мне не удалось подключиться trigger
к веб-сокету.
другими словами, Notification в основном вызывается http-запросом, но как я могу получить доступ к веб-сокету пользователя в функции http view?
Простите, если вопрос показался вам невежественным. Я буду более чем рад, если вы сможете предложить мне что-нибудь почитать.