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请求接口的更多相关文章

  1. 使用ajax请求接口,跨域后cookie无法设置,全局配置ajax;及使用axios跨域后cookie无法设置,全局配置axios

    问题一: 使用ajax/axios跨域请求接口,后端放行了,能够正常获取数据,但是cookie设置不进去,后端登录session判断失效 ajax解决办法: //设置ajax属性 crossDomai ...

  2. 【uWSGI】实战之Django配置经验

    uWSGI 是应用服务器,实现了uwsgi, wsgi等协议,可以运行wsgi 应用 uwsgi 是协议名 Django配置 下面是自己经常用的一个配置模板,基于1.9以上的版本使用的, 主要基于dj ...

  3. Django实现websocket完成实时通讯,聊天室,在线客服等

    一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebS ...

  4. nginx配置websocket

    有时候我们需要给websocket服务端做一下nginx的配置,比如需要给websocket服务端做负载均衡,或者,有些系统要求访问websocket的时候不能带端口,这时候我们就需要用nginx来进 ...

  5. Django实现websocket完成实时通讯、聊天室、在线客服等

    一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebS ...

  6. django 实现websocket

    一.简述:django实现websocket,之前django-websocket退出到3.0之后,被废弃.官方推荐大家使用channels. channels通过升级http协议 升级到websoc ...

  7. 10 Django之Ajax请求

    一.什么是Ajax技术? 异步的JavaScript和XML.使用Javascript语言与服务器进行异步交互,传输的数据为XML(更多的使用json数据).Ajax不是一门新的编程语言,而是一种使用 ...

  8. Django实现websocket完成实时通讯

    一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebS ...

  9. Django实现websocket

    django实现websocket大致上有两种方式,一种channels,一种是dwebsocket.channels依赖于redis,twisted等 一 dwebsocket 1 Django实现 ...

随机推荐

  1. Docs-.NET-C#-指南-语言参考-关键字-值类型:struct

    ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:struct 1.返回顶部 1. struct(C# 参考) 2015/07/20 struct 类型是一种值类型,通常用来封 ...

  2. python 抓取数据 存入 excel

    import requestsimport datetimefrom random import choicefrom time import timefrom openpyxl import loa ...

  3. asp程序里,如何判断一个字符串中存在包含了另一个字符串?

    1.判断是否包含某某字符函数是:Instr()和InstrRev();2.具体使用如下:ab="abcdefgHTTP"你可以用Instr()或者InstrRev()来判断if I ...

  4. ROS Software update

    http://packages.ros.org/ros/ubuntu

  5. RabbitMQ 清除全部队列及消息

    前言 安装RabbitMQ后可访问:http://{rabbitmq安装IP}:15672使用(默认的是帐号guest,密码guest.此账号只能在安装RabbitMQ的机器上登录,无法远程访问登录. ...

  6. iOS 给view,button,text filed,label等添加边框和颜色

    self.tfaaa.layer.borderWidth = 2; self.tfaaa.layer.borderColor = [UIColor blueColor].CGColor;

  7. Web书写Test Case时需要考虑的检查点

    通常书写Test Case时需要考虑的检查点: 一. 对于屏幕显示来说包括:1.检查显示的布局:2.检查域和按钮的顺序:3.检查域的尺寸:4.检查字体的大小和风格:5.检查文本的含义:6.检查拼写错误 ...

  8. 【嵌入式硬件Esp32】ESP32 正确下载姿势

    程序的正确下载步骤,以8M flash为例子: 一.硬件连接 ESP32 的运行状态主要由 GPIO0 决定 二.ESP32 Flash 地址配置 ESP32 在编译时,通过 make menucon ...

  9. 【GStreamer开发】GStreamer基础教程08——pipeline的快捷访问

    目标 GStreamer建立的pipeline不需要完全关闭.有多种方法可以让数据在任何时候送到pipeline中或者从pipeline中取出.本教程会展示: 如何把外部数据送到pipeline中 如 ...

  10. django自带的用户验证是验证username和password,如何自定义验证功能,让mobil也能作为账户名登录?

    users.views.pyfrom django.contrib.auth.backends import ModelBackendfrom django.db.models import Qcla ...