标签: django-channels

如何在django频道上使用令牌认证对websocket进行身份验证?

我们想为我们的websockets使用django-channels,但我们也需要进行身份验证.我们有一个运行django-rest-framework的rest api,我们使用令牌来验证用户,但是django-channels似乎没有内置相同的功能.

auth-token django-rest-framework django-channels

27
推荐指数
5
解决办法
1万
查看次数

从网络流式传输音频时,无法从Google文本获取结果到语音API

我想从网络流式传输音频,然后使用python google-cloud-speechAPI 将其转换为文本。我已经将其集成到我的Django频道代码中。

对于前端,我直接复制了此代码,而后端则具有此代码(请参见下文)。现在,问题来了,我没有收到任何异常或错误,但是我没有从Google API得到任何结果...

我试过的

  • 我将调试点放入process函数循环中,控件永远不会到达循环内部。
  • 在这里遍历了Java代码并试图理解它...我已经在本地设置了Java代码并对其进行了调试。我了解的一件事是在Java代码中,该方法onWebSocketBinary正在接收一个整数数组,从前端我们像这样发送

    socket.send(Int16Array.from(floatSamples.map(function (n) {return n * MAX_INT;})));
    
    Run Code Online (Sandbox Code Playgroud)
  • 在Java中,它们将转换为字节串,然后发送给Google。在django中,我放了调试点,并注意到我正在以二进制字符串形式获取数据...因此,我觉得我不需要执行任何操作...但是,我尝试了几种方法将其转换为整数数组,但是没有用,因为google期望以字节为单位...(您可以在下面看到带注释的代码)

  • 我经历了这个示例代码来自谷歌,我正在做同样的事情,我不明白我在这里做错了什么。

谁能帮我???

Django代码:

import json

from channels.generic.websocket import WebsocketConsumer

# Imports the Google Cloud client library
from google.cloud import speech
from google.cloud.speech import enums
from google.cloud.speech import types

# Instantiates a client
client = speech.SpeechClient()
language_code = "en-US"
streaming_config = None


class SpeechToTextConsumer(WebsocketConsumer):
    def connect(self):
        self.accept()

    def disconnect(self, close_code):
        pass …
Run Code Online (Sandbox Code Playgroud)

django speech-to-text google-speech-api django-channels google-cloud-speech

20
推荐指数
1
解决办法
426
查看次数

为Django频道加载尖峰保护

是否有任何具体可以帮助使Django Channels服务器不易受到轻微或意外的 DDoS攻击或来自websocket/HTTP客户端的一般负载增加的影响?由于频道不是真正的异步(仍然是幕后工作人员),我觉得要取消基于频道的网站是很容易的 - 即使使用相当简单的硬件.我目前正在Django频道上构建一个应用程序,稍后会运行一些测试来看看它是如何保持的.

达芙妮是否有某种形式的节流?我应该实现一些应用程序级别的限制吗?由于工作人员仍然处理受限制的请求,但这仍然很慢,但请求可以更快.我还能做些什么来试图阻止这些攻击吗?

我有一个想法是始终确保为特定通道指定工作人员 - 这样,如果websocket通道过载,HTTP仍将响应.

编辑:我很清楚低级DDoS保护是一个理想的解决方案,我理解DDoS攻击是如何工作的.我正在寻找的是一个内置于通道的解决方案,可以帮助处理增加的负载.也许Daphne能够扩展一个频道并缩小另一个频道以进行补偿,或者一种限制方法可以减少某个点之后每个请求的权重.

我正在寻找一个达芙妮/渠道特定的答案 - 关于DDoS或一般负载处理的一般答案不是我正在寻找的 - 关于这一点还有很多其他问题.

我还可以根据谁登录以及谁不登录来控制限制 - 未登录用户的限制可以提供帮助.

再次编辑:请阅读整个问题!我不是在寻找一般的DDoS缓解建议或低级方法的解释.我想知道达芙妮是否支持以下内容:

  • 节流
  • 基于队列大小的动态工作者分配
  • 中间件为经过身份验证的请求提供优先级

或者那种性质的东西.我也将直接与Channels社区联系,因为这可能不是这个问题的最佳位置.

python django websocket django-channels

19
推荐指数
1
解决办法
960
查看次数

ASGI_APPLICATION 不适用于 Django Channels

我按照频道文档中的教程进行操作,但是当我启动服务器时,python3 manage.py runserver它给了我这个:

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
October 17, 2022 - 00:13:21
Django version 4.1.2, using settings 'config.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Run Code Online (Sandbox Code Playgroud)

当我期望它给我这个时:

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
October 17, 2022 - 00:13:21
Django version 4.1.2, using settings 'config.settings'
Starting ASGI/Channels version 3.0.5 development server at http://127.0.0.1:8000/
Quit the …
Run Code Online (Sandbox Code Playgroud)

python django django-channels

18
推荐指数
3
解决办法
1万
查看次数

VueJS + Django频道

我刚刚阅读了VueJSDjango频道的介绍,并希望将它们结合使用,为网页上的几个组件提供实时更新.这说明了基本思想:

在此输入图像描述

作为VueJS的新手,上面的图表似乎需要在VueJS组件和websocket之间使用某种类型的"中间人",以确保每个组件都能获得正确的数据.

所以,我的问题是:

  1. 在建筑方面,这是一个很好的设计吗?
  2. 如果是这样,VueJS可以作为那个"中间人"来管理哪个组件连接到哪个频道?

谢谢你的帮助 :)

python django vue.js django-channels

17
推荐指数
1
解决办法
2974
查看次数

使用Django频道进行会话认证

尝试使用一个非常简单的websockets应用程序来使用Django通道进行身份验证,该应用程序回送用户使用前缀发送的任何内容"You said: ".

我的流程:

web: gunicorn myproject.wsgi --log-file=- --pythonpath ./myproject
realtime: daphne myproject.asgi:channel_layer --port 9090 --bind 0.0.0.0 -v 2
reatime_worker: python manage.py runworker -v 2
Run Code Online (Sandbox Code Playgroud)

我在本地测试时运行所有进程heroku local -e .env -p 8080,但您也可以单独运行它们.

注意我打开了WSGI localhost:8080和ASGI localhost:9090.

路由和消费者:

### routing.py ###

from . import consumers

channel_routing = {
    'websocket.connect': consumers.ws_connect,
    'websocket.receive': consumers.ws_receive,
    'websocket.disconnect': consumers.ws_disconnect,
}
Run Code Online (Sandbox Code Playgroud)

### consumers.py ###

import traceback 

from django.http import HttpResponse
from channels.handler import AsgiHandler

from channels import Group
from channels.sessions import channel_session …
Run Code Online (Sandbox Code Playgroud)

python django session websocket django-channels

16
推荐指数
2
解决办法
6043
查看次数

Django - 如何实时跟踪用户是否在线/离线?

我正在考虑使用django-notifications和Web Sockets向iOS/Android和Web应用程序发送实时通知.所以我可能会使用Django频道.

我可以使用Django频道实时跟踪用户的在线状态吗?如果是,那么如何在不经常轮询服务器的情况下实现这一目标?

我正在寻找最佳实践,因为我找不到任何合适的解决方案.

更新:

我到目前为止尝试的是以下方法:使用Django Channels,我实现了一个WebSocket使用者,在连接时将用户状态设置为'online',而当套接字断开时,用户状态将被设置为'offline'.最初我想要包括'away'状态,但我的方法无法提供这种信息.此外,当用户使用来自多个设备的应用程序时,我的实现将无法正常工作,因为连接可以在设备上关闭,但仍然在另一个设备上打开; 'offline'即使用户有另一个打开的连接,状态也将设置为.

class MyConsumer(AsyncConsumer):

    async def websocket_connect(self, event):
        # Called when a new websocket connection is established
        print("connected", event)
        user = self.scope['user']
        self.update_user_status(user, 'online')

    async def websocket_receive(self, event):
        # Called when a message is received from the websocket
        # Method NOT used
        print("received", event)

    async def websocket_disconnect(self, event):
        # Called when a websocket is disconnected
        print("disconnected", event)
        user = self.scope['user'] …
Run Code Online (Sandbox Code Playgroud)

django django-notification django-channels

15
推荐指数
2
解决办法
2536
查看次数

使用 Django Channels 从外部 Consumer 类发送消息

我正在构建一个在线游戏,它使用 Django 通道 2.1.5 进行 websockets。

我能够在客户端和服务器之间建立连接,并且也能够仅在消费者类内部在它们之间发送数据:

from channels.generic.websocket import WebsocketConsumer
import json
from . import controller

class GameConsumer(WebsocketConsumer):
    def connect(self):
        self.accept()
        print("Wohooo .. Connected to client!")
        self.render()
        controller.startTurn()

    def render(self, type="render", message=None):
        self.send(controller.renderMap(type, message))

    def disconnect(self, close_code):
        print("WebSocket connection is lost...")

    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        controller.handleRecieved(text_data)
...
Run Code Online (Sandbox Code Playgroud)

现在,我想做的是从另一个模块调用函数render,它位于消费者类中

我试过这个:

from .. import consumer

def sendDeployments(owner, armies):
    type = "renderDeployments"
    message = owner + " has " + str(armies) + " to deploy"
    dummyConsumer = consumer.GameConsumer() …
Run Code Online (Sandbox Code Playgroud)

python django websocket django-channels

15
推荐指数
2
解决办法
9848
查看次数

Django 频道 VS Django 3.0 / 3.1?

有人可以澄清Django Channels Project和新的Django 本机异步支持之间的差异或互补性吗?

据我了解,Django-Channels 是一个在 Django 之外启动的项目,然后开始集成到核心 Django 中。但这项工作的当前状态对我来说仍然令人困惑。

例如,今天我使用的是 Django 2.2,我想为我的项目添加 WebSocket 支持。我是不是该:

  • 升级到最新的 Django 版本?
  • 使用 Django 频道包?
  • 两个动作都做吗?

python django django-channels

14
推荐指数
1
解决办法
3492
查看次数

Redis ERR 未知命令“BZPOPMIN”

我按照这些说明(即sudo apt-get install redis-server)在 Windows 10 上的 Ubuntu Linux 子系统中安装了 Redis 版本 4.0.9 。

我在 Django 频道上关注本教程,并运行了以下代码:

>>> import channels.layers
>>> channel_layer = channels.layers.get_channel_layer()
>>> from asgiref.sync import async_to_sync
>>> async_to_sync(channel_layer.send)('test_channel', {'type': 'hello'})
>>> async_to_sync(channel_layer.receive)('test_channel')
Run Code Online (Sandbox Code Playgroud)

执行上面的最后一行时,出现此错误:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Users\xyz\Anaconda3\envs\django\lib\site-packages\asgiref\sync.py", line 120, in __call__
    return call_result.result()
  File "C:\Users\xyz\Anaconda3\envs\django\lib\concurrent\futures\_base.py", line 425, in result
    return self.__get_result()
  File "C:\Users\xyz\Anaconda3\envs\django\lib\concurrent\futures\_base.py", line 384, in __get_result
    raise self._exception
  File "C:\Users\xyz\Anaconda3\envs\django\lib\site-packages\asgiref\sync.py", line …
Run Code Online (Sandbox Code Playgroud)

redis django-channels

14
推荐指数
5
解决办法
9353
查看次数