Skip to main content
 首页 » 编程设计

python之使用 websocket 调用 API

2025年05月04日33softidea

我有一个非常简单的应用程序,它包含一个用 AngularJS 编写的前端和使用 Django Rest Framework 编写的 API .我的应用程序每 x 秒轮询一次 API 端点以查看是否有新的更改。

此代码每 5 秒运行一次

var resource = TokenRestangular.one("jobs", job_id); 
resource.then(function (objects) { 
    //if we have job completed = true then do something else.                     
}, 

我知道这是一种非常老派的方式。所以我的问题是,如果可以的话,我可以使用 websockets 来查找 AngularJS 中的 API 资源吗?

我不想重写一个新的 API 那么这个 API 可以同时支持 REST 连接和 HTTP 上的 websockets 吗?

请您参考如下方法:

<强> 1。客户端

在您的 Angular 代码中编写一个服务,该服务将创建到 websocket 服务器的连接。使用 promise ,然后您将在每次收到 websocket 数据包时更新应用程序的 $scope 。像这样:

    myApp.service( 'WSService', function() { 
        this.promise = function ($q) { 
            // Create a deferred object 
            var deferred = $q.defer(); 
            // Create the WebSocket client pointing to the correct API 
            var ws = new WebSocket("ws://myIP:myPort/myAPI"); 
            // Map the messages to action 
            ws.onopen = function()  { console.log( "WSService opened"); }; 
            ws.onmessage = function (evt) {  
                console.log("onmessage:" + evt); 
                deferred.notify(evt); 
            }; 
            ws.onclose = function() { console.log("WSService closed"); }; 
            // Return the promise 
            return deferred.promise; 
        } 
    }); 

然后在你的 Controller 中:

    myApp.controller('MyController', ['$scope','$q','WSService', function($scope, $q, WSService) { 
        var promise = WSService.promise($q); 
 
        promise.then(function(evt) { console.log('resolve : ' + evt); },  
                     function(evt) { console.log('reject : ' + evt); },  
                     function(evt) { 
                         console.log('notify: ' + evt); 
                         //Update the scope 
                         $scope.myData = evt; 
                     } 
        ); 
    }]); 

<强> 2。服务器端

在 API 前面,编写一个 websocket 服务器,它将以适当的格式推送 JSON 数据。例如,您可以挂接到模型信号(保存、更新)一个函数,该函数会将模型的 JSON 序列化推送到客户端。这样,对后端数据库的所有更新都会立即反射(reflect)到客户端。

为此,您可以使用预制包,如 django-socketio这似乎很受欢迎。

如果您的 websocket 服务器发送的数据与您的模型和范围中的数据匹配,我猜它可以符合 REST 标签。