django rest framework 结合百度语音合成 基于channels实现实时通讯
功能简介:前后端分离 django rest framework 实现用户在前端发起一笔提现,经过channels处理将信息发至其代理,结合百度语音合成,将文字合成语音播放;
百度语音合成介绍:https://ai.baidu.com/docs/#/TTS-API/top
操作步骤:
安装:
pip install channels
添加channels到您的 INSTALLED_APPS设置:
INSTALLED_APPS = [
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘django_crontab’,
‘user.apps.UserConfig’,
‘nsm.apps.NsmConfig’,
‘trade.apps.TradeConfig’,
‘channel.apps.ChannelConfig’,
‘card.apps.CardConfig’,
‘proxy.apps.ProxyConfig’,
‘spuser.apps.SpuserConfig’,
‘rest_framework’,
‘django_filters’,
‘channels’,
]
在以下位置进行默认路由myproject/routing.py:
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import card.routing
application = ProtocolTypeRouter({
# Empty for now (http->django views is added by default)
'websocket': AuthMiddlewareStack(
URLRouter(
card.routing.websocket_urlpatterns
)
),
})
此根路由配置指定在与Channels开发服务器建立连接时,ProtocolTypeRouter将首先检查连接类型。如果它是WebSocket连接(ws://或wss://),则将连接到AuthMiddlewareStack。
在AuthMiddlewareStack将填充的连接的范围与到当前认证的用户,类似于Django的如何一个参考AuthenticationMiddleware填充请求与当前认证的用户的图功能的对象。(范围将在本教程的后面部分讨论。)然后将连接到URLRouter。
在URLRouter将检查连接到路由到一个特定的消费者,基于所提供的HTTP路径url模式。
在settings中设置您的ASGI_APPLICATION 设置为指向该路由对象作为根应用程序:
ASGI_APPLICATION = “bank.routing.application”
你需要创建一个 应用:
如图我创建了一个app,为card,记得添加到INSTALLED_APPS设置
在card app 中创建一个py文件consumers.py
# chat/consumers.py
from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer
import json
from utils.tts import test_audio
from bank.settings import CONN
from user.models import UserProfile
class ChatConsumer(WebsocketConsumer):
def connect(self):
# self.room_name = self.scope['url_route']['kwargs']['room_name']
# self.room_group_name = 'chat_%s' % self.room_name
#
# # Join room group
# async_to_sync(self.channel_layer.group_add)(
# self.room_group_name,
# self.channel_name
# )
self.accept()
def disconnect(self, close_code):
s=self.channel_name
user=UserProfile.objects.filter(soket=str(s)).first()
if user:
print(111)
user.soket=''
user.save()
if user.level==2:
async_to_sync(self.channel_layer.group_discard)(
user.username,
self.channel_name
)
return
# async_to_sync(self.channel_layer.group_discard)(
#