我们想为我们的websockets使用django-channels,但我们也需要进行身份验证.我们有一个运行django-rest-framework的rest api,我们使用令牌来验证用户,但是django-channels似乎没有内置相同的功能.
我想从网络流式传输音频,然后使用python google-cloud-speech
API 将其转换为文本。我已经将其集成到我的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
是否有任何具体可以帮助使Django Channels服务器不易受到轻微或意外的 DDoS攻击或来自websocket/HTTP客户端的一般负载增加的影响?由于频道不是真正的异步(仍然是幕后工作人员),我觉得要取消基于频道的网站是很容易的 - 即使使用相当简单的硬件.我目前正在Django频道上构建一个应用程序,稍后会运行一些测试来看看它是如何保持的.
达芙妮是否有某种形式的节流?我应该实现一些应用程序级别的限制吗?由于工作人员仍然处理受限制的请求,但这仍然很慢,但请求可以更快.我还能做些什么来试图阻止这些攻击吗?
我有一个想法是始终确保为特定通道指定工作人员 - 这样,如果websocket通道过载,HTTP仍将响应.
编辑:我很清楚低级DDoS保护是一个理想的解决方案,我理解DDoS攻击是如何工作的.我正在寻找的是一个内置于通道的解决方案,可以帮助处理增加的负载.也许Daphne能够扩展一个频道并缩小另一个频道以进行补偿,或者一种限制方法可以减少某个点之后每个请求的权重.
我正在寻找一个达芙妮/渠道特定的答案 - 关于DDoS或一般负载处理的一般答案不是我正在寻找的 - 关于这一点还有很多其他问题.
我还可以根据谁登录以及谁不登录来控制限制 - 未登录用户的限制可以提供帮助.
再次编辑:请阅读整个问题!我不是在寻找一般的DDoS缓解建议或低级方法的解释.我想知道达芙妮是否支持以下内容:
或者那种性质的东西.我也将直接与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) 尝试使用一个非常简单的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) 我正在考虑使用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 通道 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) 有人可以澄清Django Channels Project和新的Django 本机异步支持之间的差异或互补性吗?
据我了解,Django-Channels 是一个在 Django 之外启动的项目,然后开始集成到核心 Django 中。但这项工作的当前状态对我来说仍然令人困惑。
例如,今天我使用的是 Django 2.2,我想为我的项目添加 WebSocket 支持。我是不是该:
我按照这些说明(即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) django-channels ×10
django ×8
python ×6
websocket ×3
auth-token ×1
redis ×1
session ×1
vue.js ×1