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实现 ...
随机推荐
- Docs-.NET-C#-指南-语言参考-关键字-值类型:struct
ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:struct 1.返回顶部 1. struct(C# 参考) 2015/07/20 struct 类型是一种值类型,通常用来封 ...
- python 抓取数据 存入 excel
import requestsimport datetimefrom random import choicefrom time import timefrom openpyxl import loa ...
- asp程序里,如何判断一个字符串中存在包含了另一个字符串?
1.判断是否包含某某字符函数是:Instr()和InstrRev();2.具体使用如下:ab="abcdefgHTTP"你可以用Instr()或者InstrRev()来判断if I ...
- ROS Software update
http://packages.ros.org/ros/ubuntu
- RabbitMQ 清除全部队列及消息
前言 安装RabbitMQ后可访问:http://{rabbitmq安装IP}:15672使用(默认的是帐号guest,密码guest.此账号只能在安装RabbitMQ的机器上登录,无法远程访问登录. ...
- iOS 给view,button,text filed,label等添加边框和颜色
self.tfaaa.layer.borderWidth = 2; self.tfaaa.layer.borderColor = [UIColor blueColor].CGColor;
- Web书写Test Case时需要考虑的检查点
通常书写Test Case时需要考虑的检查点: 一. 对于屏幕显示来说包括:1.检查显示的布局:2.检查域和按钮的顺序:3.检查域的尺寸:4.检查字体的大小和风格:5.检查文本的含义:6.检查拼写错误 ...
- 【嵌入式硬件Esp32】ESP32 正确下载姿势
程序的正确下载步骤,以8M flash为例子: 一.硬件连接 ESP32 的运行状态主要由 GPIO0 决定 二.ESP32 Flash 地址配置 ESP32 在编译时,通过 make menucon ...
- 【GStreamer开发】GStreamer基础教程08——pipeline的快捷访问
目标 GStreamer建立的pipeline不需要完全关闭.有多种方法可以让数据在任何时候送到pipeline中或者从pipeline中取出.本教程会展示: 如何把外部数据送到pipeline中 如 ...
- django自带的用户验证是验证username和password,如何自定义验证功能,让mobil也能作为账户名登录?
users.views.pyfrom django.contrib.auth.backends import ModelBackendfrom django.db.models import Qcla ...