大象笔记

知者行之始,行者知之成

系统重启时 docker 容器没有自启动问题排查

线上服务器环境,基于 docker 部署了一堆服务,虽然在 docker-compose.yml 中将各个服务配置了 restart: always 例如: version: '3.8' services: web: image: nginx:latest ports: - "80:80" restart: always 但是,实际测试发现,系统重启后,所有后期配置的 restart: always 的服务,都没有自启动。 只有一开始就设置了 restart: always 的服务,才自启动成功。 Google 搜索了一下,发现确实存在这个 ...

阅读全文...

flask socket.io 生产环境部署

eventlet 由于 WSGI 不支持 WebSocket,所以需要引入 eventlet 来支持 WebSocket 协议。 (虽然 socket.io 也支持 http 协议,但是体验上会差很多。) eventlet is the best performant option, with support for long-polling and WebSocket transports 而在开发环境,如果没有安装 eventlet,默认使用的是 Werkzeug web server: In production mode the eventlet web server is us ...

阅读全文...

flask socket.io 使用自定义 path 路径

默认路径 使用 flask socket.io 启动服务之后,默认的路径是: /socket.io 但是由于我把 rasa 和 flask socket.io 部署在同一个域名下, rasa 本身自带了一个 socket.io,所以我需要将 flask socket.io 在线上部署时, 更换一个路径,以做区分。 flask 端调整 通过 path 参数设置新路径 socketio = SocketIO(app, path="f_api_socket.io") 如果不设置 path 参数,就是默认的 socket.io。 浏览器 js 端调整 将原有的 var sock ...

阅读全文...

python socket.io 客户端测试代码

为了测试基于 flask 实现的 socket.io server 端的功能,除了使用浏览器端 js 测试之外,我还想看看诸如 python,C# 这样的客户端的实现是否支持 flask 的 session 机制。即是否能够正常获取到 session id。 经过测试,server 端确实可以正常获取到 session id。 代码 import socketio # 创建 Socket.IO 客户端实例 sio = socketio.Client() # 当连接成功时的处理函数 @sio.event def connect(): print("Connected to ...

阅读全文...

python flask web 框架安装 socket.io 模块

想基于 python 的 socket.io 实现实时消息,及在线状态检测。 同时兼容 rasa 的 socket.io 版本。 确认 rasa 对应的 socket.io 版本 > conda list socketio (rasa) # packages in environment at ~/miniconda3/envs/rasa: # Name Version Build Channel python-socketio 5.8.0 pypi_0 ...

阅读全文...

卖掉域名之后,不要忘记修改网站的 ICP 备案

中午吃饭的时候接到阿里云备案检查人员的电话,说我的一个域名对应网站的底部没有正确显示备案编号,需要处理。我一看那个域名是之前卖掉的域名,参考: 在阿里云上成功卖掉了一个闲置的域名 我说那个域名已经不是我的了,需要对备案做什么处理? 工作人员说是需要注销备案。 修改备案的必要性 我感觉还是有必要的,因为这个域名的买方,购买域名后,我看其搭建了一个盗版视频类的网站,应该是放到了海外服务器上。这个要是被版权方追责,估计就直接找到我这边了。还好没有出现问题。 所以,赶紧处理为妙。 注销备案流程 登录阿里云后台的 ICP 备案管理: https://beian.aliyun.com/pcContaine ...

阅读全文...

对话机器人 Rasa(三十一):Form 的进阶用法,动态话术及 slot

需求背景 例如,诊所之类的预约场景下,到店需要核对预约号码,与预约的身份证号码,两个数据匹配成功,才能进入下一步的操作。 这里用一个 form 包含两个 slot 来实现信息录入,看起来是典型的 form 使用场景,没什么可说的。 但是如果在输入预约号码后,需要拉取身份证的掩码格式,让用户填写掩码部分,以减少用户输入。那么就需要在输入第一个 slot 后,调用其他服务的 api,获取身份证掩码。然后影响到第二个slot 的 utter ask 提示话术内容。 第二个需求是,如果第一个 slot 输入的预约号码查询不到,就不需要再提示身份证号码的输入了。那么就变成了一个动态的 form。 第二个 ...

阅读全文...

SuiteCRM 修改菜单后报 500 错误,管理员无法进入系统

在使用 SuiteCRM 管理员在后台配置菜单,选择将所有菜单隐藏。。。不要问为什么,就是这样配置了。 然后管理员再也无法使用 SuiteCRM 了,登录之后就报 500 错误,无法使用,也无法恢复之前的配置。 其他用户倒是可以正常登录。 报错信息 从日志看起来确实是找不到菜单,导致报错: FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught TypeError: in_array(): Argument #2 ($haystack) must be of type array, null given in ...

阅读全文...