首页 > 解决方案 > 从 Django 服务器触发 javascript 函数

问题描述

我正在研究IPN。每当我在这个 url: 中收到 IPN 时https://www.mywebsitename.com/notifications,我想运行一个简单的 JavaScript 函数来显示一些 html 内容。

我从服务器端管理 IPN,如下所示:

@csrf_exempt
def notifications(request):
    if request.method == "POST":
       #some code

我想在该代码块中触发我的 JS 函数,但我想不出任何方法来做到这一点。另外,我真的不知道我要问的是否真的可能,也许还有另一种我自己无法弄清楚的方法。

标签: javascriptdjango

解决方案


这在 Django 使用 Websockets 时是 100% 可能的。听起来您正在尝试根据您在某个 url 上收到请求的时间来为 UI 构建通知系统。首先查看 Django 频道:https ://channels.readthedocs.io/en/stable/

这是在 Django 中使用 Websockets 的最佳方式,它可以帮助您实现通知或其他实时功能。文档中的教程很棒。要解决您的任务,您应该:

  • 按照教程并在您的 Django 应用程序中设置 WebSocket 使用者来处理通知。这将允许前端用户与您的应用程序建立实时连接并从中接收消息。
  • 完成您的通知视图。在收到付款请求后,您将向您的 websocket 消费者发送一条消息,供任何需要接收消息的用户使用。它最终可能看起来像这样:
# assuming that the request gives you the username of the user to be notified,
# and you have a group configured in your consumer

def notification_view(request):
     if request.method == "POST":
          username = request.POST.get('username')
          group_name = 'notifications{}'.format(username)
          channel_layer = channels.layers.get_channel_layer()
          async_to_sync(channel_layer.group_send)(
                 group_name,
                 {
                     'type': 'new_payment',
                     'text': {
                         'eventType': 'notification',
                         'name': 'New Payment',
                         'userMessage': 'You just got paid'
                     }
                 }
     return(HttpResponse(status=200))

当收到请求时,这将通过用户的套接字发送一条消息。

在您的 js 中,您将为套接字设置一个侦听器。然后,您可以收听消息并使用您收到的数据在文档中做任何您想做的事情,例如向用户显示消息:

var endpoint = 'ws://' + '<yourhost>/notifications/username/;
var socket = new ReconnectingWebSocket(endpoint);

socket.onmessage = e => {
     data = JSON.parse(e.data);
     let msg = document.createElement('<p>');
     msg.innerText = data['text']['userMessage'] 
    }

只需按照教程进行操作,这肯定会让您朝着正确的方向前进!


推荐阅读