Django配置websocket请求接口
1.settings.py
INSTALLED_APPS = [
'...',
'channels',
'...',
]
ASGI_APPLICATION = 'server.routing.application'
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [(os.getenv('REDIS_SERVER_HOST', '127.0.0.1'), int(os.getenv('REDIS_SERVER_PORT', '')))],
},
},
}
2.routing.py(settin.py同级)
# -*- coding: utf-8 -*- from channels.routing import ProtocolTypeRouter, URLRouter from device.consumers import QueryAuthMiddleware # websocket中间件
import device.routing # 路由 application = ProtocolTypeRouter({
'websocket': QueryAuthMiddleware(
URLRouter(
device.routing.websocket_urlpatterns
)
)
})
class QueryAuthMiddleware:
"""
WebSocket 认证中间件
"""
def __init__(self, inner):
# Store the ASGI application we were passed
self.inner = inner def __call__(self, scope):
query = parse.parse_qs(scope["query_string"].decode())
token = query.get('token', [None])[0]
device_name = None
try:
login_info = json.loads(base64.b64decode(token).decode())
device_name = login_info['name']
logger.info('Device {} connect from {} port {}'.format(device_name, scope['client'][0], scope['client'][1])) # 验证时间
gen_time = datetime.strptime(login_info['time'], '%Y%m%d%H%M%S')
now_time = datetime.now()
if abs(gen_time - now_time).total_seconds() > 5 * 60:
raise ValueError('Device {} time validate fail: token time: {}, server time: {}'.format(
device_name, gen_time.strftime('%Y-%m-%d %H:%M:%S'), now_time.strftime('%Y-%m-%d %H:%M:%S'))) # 验证密码
device = DeviceInfoModel.objects.get(name=device_name) # 获取到设备
correct = device.check_password(login_info['password']) # 检查密码
if not correct:
raise ValueError('Device {} password validate fail'.format(device_name)) except DeviceInfoModel.DoesNotExist:
logger.info('Device {} can not find in DB'.format(device_name))
device = None except Exception as e:
logger.error('Connect error {}'.format(e))
device = None finally:
# Middleware 中必须手动关闭数据库连接
# http://channels.readthedocs.io/en/latest/topics/authentication.html#custom-authentication
close_old_connections() return self.inner(dict(scope, user=device))
此时,启动方式也应该稍作调整(项目根目录下新建asgi.py文件)
"""
ASGI entrypoint. Configures Django and then runs the application
defined in the ASGI_APPLICATION setting.
""" import os
import django
from channels.routing import get_default_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings")
django.setup()
application = get_default_application()
客户端示例:
import threading
import time
import json
import tarfile
import base64
import hashlib
import os
import pickle
from io import BytesIO
from datetime import datetime import websocket def on_message(ws, message):
print('on_message')
msg = json.loads(message)
print(msg)
# print(msg['result'])
# print(pickle.loads(base64.b64decode(msg['content']['2-5b4747af5f627dbcb5eaefeb']))) def on_error(ws, error):
print(error) def on_close(ws):
print("### closed ###") def on_open(ws):
def run(*args):
# for i in range(1):
# tarobj = BytesIO()
# tar = tarfile.open(fileobj=tarobj, mode='w:gz')
# dir_list = filter(lambda name: os.path.isdir(name) and not name.startswith('.'), os.listdir(os.path.abspath(os.path.dirname('__file__'))))
# for dir in dir_list:
# tar.add(dir)
# tar.close()
# tarobj.seek(0)
with open('D:\\software\\websocket\websocket\\face\\18032811042400\\0.jpg', 'rb') as f:
base64_data = base64.b64encode(f.read())
s = base64_data.decode() file_obj = {
'timestamp': datetime.now().timestamp(),
'image': s
} info = {
'command': 'TEST',
'content': file_obj,
# 'content': ['30-5b691d365f627dee73c4b58d-common', '71-5b695edf5f627d762d5d651b'],
}
ws.send(json.dumps(info))
time.sleep(100)
ws.close()
print("thread terminating...")
threading.Thread(target=run).start() if __name__ == "__main__": websocket.enableTrace(True)
login_info = {
'name': '',
'password': hashlib.md5(''.encode('utf8')).hexdigest(),
'time': datetime.now().strftime('%Y%m%d%H%M%S')
} b64_token = base64.b64encode(json.dumps(login_info).encode()).decode()
url = "ws://xx.xx.xx.xx:8000/push/device/?token={}".format(b64_token)
print(login_info)
print('Connect {}'.format(url))
ws = websocket.WebSocketApp(url,
on_message=on_message,
on_error=on_error,
on_close=on_close)
ws.on_open = on_open
ws.run_forever()
参考:https://channels.readthedocs.io/en/latest/deploying.html
Django配置websocket请求接口的更多相关文章
- 使用ajax请求接口,跨域后cookie无法设置,全局配置ajax;及使用axios跨域后cookie无法设置,全局配置axios
问题一: 使用ajax/axios跨域请求接口,后端放行了,能够正常获取数据,但是cookie设置不进去,后端登录session判断失效 ajax解决办法: //设置ajax属性 crossDomai ...
- 【uWSGI】实战之Django配置经验
uWSGI 是应用服务器,实现了uwsgi, wsgi等协议,可以运行wsgi 应用 uwsgi 是协议名 Django配置 下面是自己经常用的一个配置模板,基于1.9以上的版本使用的, 主要基于dj ...
- Django实现websocket完成实时通讯,聊天室,在线客服等
一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebS ...
- nginx配置websocket
有时候我们需要给websocket服务端做一下nginx的配置,比如需要给websocket服务端做负载均衡,或者,有些系统要求访问websocket的时候不能带端口,这时候我们就需要用nginx来进 ...
- Django实现websocket完成实时通讯、聊天室、在线客服等
一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebS ...
- django 实现websocket
一.简述:django实现websocket,之前django-websocket退出到3.0之后,被废弃.官方推荐大家使用channels. channels通过升级http协议 升级到websoc ...
- 10 Django之Ajax请求
一.什么是Ajax技术? 异步的JavaScript和XML.使用Javascript语言与服务器进行异步交互,传输的数据为XML(更多的使用json数据).Ajax不是一门新的编程语言,而是一种使用 ...
- Django实现websocket完成实时通讯
一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebS ...
- Django实现websocket
django实现websocket大致上有两种方式,一种channels,一种是dwebsocket.channels依赖于redis,twisted等 一 dwebsocket 1 Django实现 ...
随机推荐
- python获取公网ip的几种方式
python获取公网ip的几种方式 转 https://blog.csdn.net/conquerwave/article/details/77666226 from urllib2 import u ...
- flutter 中文件工具类
添加依赖: path_provider: ^0.5.0+1 import 'dart:convert'; import 'dart:io'; import 'package:path_provider ...
- 详解 C++11 lambda表达式
详解 C++11 lambda表达式 lambda表达式是函数式编程的基础.咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下.这里只是介绍C++11中的la ...
- python的argparse模块parse_known_args()方法的使用
parse_known_args()方法的用处就是有些时候,你的选项配置可能不会在一个函数或包中调用完成 在很多使用,我们可能会需要根据一些输入的选项,比如在深度学习中,我们可能会根据传入的模型设置- ...
- kinova environment
luo@luo-ThinkPad-W530:~$ luo@luo-ThinkPad-W530:~$ luo@luo-ThinkPad-W530:~$ luo@luo-ThinkPad-W530:~$ ...
- Qt编写气体安全管理系统2-界面框架
一.前言 整体框架包括两个部分,一部分是UI界面框架,比如一级二级导航菜单按钮整体布局等,一部分是项目框架,上一篇文章说的是项目框架,这一篇文章来说界面框架,Qt做界面非常快速和高效,尤其是提供了可视 ...
- Can't accept UDP connections java.net.BindException: Address already in use_解决方案
一.问题描述 在Linux服务器(CentOS7系统)中配置并启动JMeter远程监控服务器资源所需的ServerAgent目录下的 startAgent.sh 文件时,系统出现异常提示,如下: [r ...
- POJ 2342 Anniversary party 树形DP基础题
题目链接:http://poj.org/problem?id=2342 题目大意:在一个公司中,每个职员有一个快乐值ai,现在要开一个party,邀请了一个员工就不可能邀请其直属上司,同理邀请了一个人 ...
- Linux杀毒软件(ClamAV)
Clam AntiVirus是一个类UNIX系统上使用的反病毒软件包.主要应用于邮件服务器,采用多线程后台操作,可以自动升级病毒库. 一.下载安装 1.下载 clamav官网:http://www.c ...
- Dotmemory 内存分析工具的操作手册
教程一.开始学习dotmemory 在本教程中,我们将学习如何运行dotMemory内存快照.此外,我们将简要地看看dotMemory的用户界面和基本分析的概念.考虑dotMemory本教程作为起点 ...