python conda实践 sanic框架gitee webhook实践
import subprocess
import hmac
import hashlib
import base64
from sanic.response import text
from sanic import Blueprint
from git import Repo# 路由蓝图
hook_blue = Blueprint('hook_blue')@hook_blue.route('/hook/kaifa', methods=["POST"])
async def kaifa(request):timestamp = request.headers.get('X-Gitee-Timestamp')# 秘钥secret = '**********'secret_enc = bytes(secret.encode('utf-8'))# 把 timestamp+"\n"+密钥 当做签名字符串 string_to_signstring_to_sign = '{}\n{}'.format(timestamp, secret)string_to_sign_enc = bytes(string_to_sign.encode('utf-8'))# 使用HmacSHA256算法计算签名,得到 hmac_codehmac_code = hmac.new(secret_enc, string_to_sign_enc,digestmod=hashlib.sha256).digest()# 将hmac_code进行Base64 encodemy_sign = base64.b64encode(hmac_code).decode('utf-8')gitee_sign = request.json.get('sign')if my_sign == gitee_sign:gitrepo = Repo("/www/wwwroot/********/")remote = gitrepo.remote()info = remote.pull()return text(str(info))else:return text('签名错误')@hook_blue.route('/hook/ceshi', methods=["POST"])
async def ceshi(request):timestamp = request.headers.get('X-Gitee-Timestamp')# 秘钥secret = '*******'secret_enc = bytes(secret.encode('utf-8'))# 把 timestamp+"\n"+密钥 当做签名字符串 string_to_signstring_to_sign = '{}\n{}'.format(timestamp, secret)string_to_sign_enc = bytes(string_to_sign.encode('utf-8'))# 使用HmacSHA256算法计算签名,得到 hmac_codehmac_code = hmac.new(secret_enc, string_to_sign_enc,digestmod=hashlib.sha256).digest()# 将hmac_code进行Base64 encodemy_sign = base64.b64encode(hmac_code).decode('utf-8')gitee_sign = request.json.get('sign')if my_sign == gitee_sign:# 执行的命令cmd = r'git pull'# cwd指的是某个进程运行时所在的目录;cwd是“current working directory”的缩写cwd_path = r'/www/wwwroot/********/'process = subprocess.Popen(cmd, shell=True, cwd=cwd_path, stderr=subprocess.PIPE, stdin=subprocess.PIPE,stdout=subprocess.PIPE)process.wait()result = process.returncodeif result == 0:return text("git 的拉取:成功")else:return text("git 的拉取:失败")else:return text('签名错误')
/******************************************************************/
conda后台运行python脚本shell脚本run.sh:
想以www用户运行脚本,记的切换到www用户,再启动脚本,
./run.sh start
#!/bin/bash
#应用入口文件
APP_NAME=/www/wwwroot/python-webhook/main.py
#进程关键字
PROCESS_KEYWORD=python-webhook
#使用说明,用来提示输入参数
usage(){
echo "Usage: sh run.sh [start|stop|restart|status]"
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $PROCESS_KEYWORD|grep -v grep|awk '{print $2}'`
if [ -z "${pid}" ];then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq 0 ];then
echo "${APP_NAME} is already running. pid=${pid}"
else
conda run --name python-webhook nohup python ${APP_NAME} >nohup.out 2>&1 &
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
ps -ef|grep $PROCESS_KEYWORD|grep -v grep|awk '{print $2}'|xargs kill -9
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启方法
restart(){
stop
sleep 5
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
/*****************************************************************/
需要以哪个用户来运行python代码,就切换到哪个用户下进行安装:
1. 使用grep www /etc/passwd查看用户权限
$ grep www /etc/passwd
www:x:1001:1001::/home/www:/sbin/nologin
可以看出,www是/sbin/nologin禁止登录的。只要修改这个模式就可以了
2. 修改模式
$ usermod -s /bin/bash www
3. 再次查看状态
$ grep www /etc/passwd
www:x:997:995:www user:/var/cache/www:/bin/bash
4. 然后就可以用su - www切换了
$ su - www
1
5. 恢复的话改为/sbin/nologin即可
$ usermod -s /sbin/nologin www
开始安装:
miniconda和anaconda下载地址
https://docs.conda.io/en/latest/miniconda.html
Free Download | Anaconda
Centos7.9安装miniconda
Miniconda是一个 免费的 轻量级的 conda安装程序
conda是一个开源的包、环境管理器,能在同一个机器上安装不同Python版本的软件包及其依赖,以及在不同Python环境之间切换
Miniconda只包含conda、Python、pip、zlib等基础的文件和依赖包
Anaconda不仅包含conda、Python等基础文件,还包含很多装好的包,如:numpy、pandas
使用conda install命令可从Anaconda存储库中安装额外的conda包
下载Miniconda3-latest-Linux-x86_64.sh
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh
运行.sh
sudo sh Miniconda3-latest-Linux-x86_64.sh
输入安装的路径,如/usr/anconda3
添加/usr/anconda3到系统环境变量文件/etc/profile文件
sudo vi /etc/profile
添加
export PATH=/usr/anconda3/bin:$PATH
激活生效,或重启
source /etc/profile
检测安装是否成功
conda -V
2、配置conda镜像源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
# optional
conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --set show_channel_urls yes
/****************************************/
要卸载 Miniconda,请按照以下步骤进行操作:
打开终端或命令提示符窗口,确保以管理员权限运行。
根据你的操作系统,执行以下命令卸载 Miniconda:
在 Windows 上:
conda install anaconda-clean
anaconda-clean --yes
在 macOS 或 Linux 上:
conda install anaconda-clean
anaconda-clean --yes
在某些 Linux 发行版中,可能需要在命令前加上 sudo。
确认卸载操作。执行上述命令后,你将被要求确认卸载。请仔细阅读提示信息,然后输入 y 或 yes 确认卸载。
删除 Miniconda 安装目录:在终端中执行以下命令,将 <miniconda_install_dir> 替换为你的 Miniconda 安装目录:
rm -rf <miniconda_install_dir>
注意:请谨慎执行此命令,确保你删除的是正确的安装目录。
检查环境变量:卸载 Miniconda 后,你可能还需要手动删除与 Miniconda 相关的环境变量。在 Windows 上,可以通过 “控制面板” -> “系统和安全” -> “系统” -> “高级系统设置” -> “环境变量” 打开环境变量设置界面,然后检查并删除相关的环境变量。在 macOS 或 Linux 上,可以编辑 ~/.bashrc 或 ~/.bash_profile 文件,并删除相关的路径配置。
完成上述步骤后,你的系统应该已成功卸载 Miniconda。请确保在卸载之前备份你的数据,以防万一。
/**************************************************/
创建虚拟环境:
conda create -n python-webhook python=3.11
后台运行python脚本:
conda run --name python311-venv nohup python main.py >nohup.out 2>&1 &

/*************************************************************/
conda可以配合其他python包管理工具一起使用,比如pipenv或者poetry,
conda安装好某个python版本的虚拟环境后,就在这个虚拟环境运行其他包管理工具即可,
比如poetry包管理的项目,虚拟环境安装好poetry工具后,运行poetry install即可安装好项目需要的依赖包,然后启动项目即可
相关文章:
python conda实践 sanic框架gitee webhook实践
import subprocess import hmac import hashlib import base64 from sanic.response import text from sanic import Blueprint from git import Repo# 路由蓝图 hook_blue Blueprint(hook_blue)hook_blue.route(/hook/kaifa, methods["POST"]) async def kaifa(req…...
LeetCode——无重复的最长子串(中等)
题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…...
【SQL】关系模型与查询和更新数据
一、关系模型 1.1 主键 主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。 可以使用多个列作为联合主键,但联合主键并不常用。 1.2 外键 FOREIGN KEY …...
【Centos8_配置单节点伪分布式Spark环境】
安装centos8 jdk部署伪分布式spark环境 安装Centos8 环境下的JDK 下载jdk linux版本 下载链接: jdk-8u381-linux-x64.tar.gz 将该文件上传到Centos8 主机 部署配置jdk(java8) # 解压到指定路径 [lhangtigerkeen Downloads]$ sudo tar …...
【软考】系统集成项目管理工程师(三)信息系统集成专业技术知识①【16分】
一、系统集成的特点 官方解释: 1、信息系统建设的内容主要包括设备采购、系统集成、软件开发和运维服务等; 2、信息系统集成是指将计算机软件、硬件、网络通信、信息安全等技术和产品集成为能够满足用户特定需求的信息系统;显著特点如下&am…...
揭秘特权账号潜在风险,你中招了吗?
什么是特权账号? 特权账号指在企业运营过程中,为相关业务运营、系统管理、系统运维等人员赋予的系统维护、权限增加、数据修改删除、导出等高级权限的系统账号。这些账号多数连接企业核心资源,保障企业内部各项业务正常运作。然而࿰…...
线性代数的学习和整理13: 定义域,值域,到达域 和单射,满射,双射,反函数,逆矩阵
目录 1 函数与 向量/矩阵 2 初等数学的函数 2.1 函数 2.2 函数的定义:定义域 →映射→ 值域 3 高等数学里的函数:定义域和陪域/到达域(非值域)的映射关系 3.1 函数 3.2 单射,满射,双射等都是针对…...
深入MaxCompute -第十一弹 -QUALIFY
简介: MaxCompute支持QUALIFY语法过滤Window函数的结果,使得查询语句更简洁易理解。Window函数和QUALIFY语法之间的关系可以类比聚合函数GROUP BY语法和HAVING语法。 MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分…...
Mysql定时备份事件
创建了一个名为backup_database的定时任务,每天自动在当前时间的后一天开始执行。备份数据库的代码使用mysqldump命令将数据库导出为sql文件保存在指定的备份目录中。 需要注意的是,上述代码中的用户名 (username)、密码 (password)、主机名 (hostname) …...
探索ClickHouse——安装和测试
我们在Ubuntu 20 Server版虚拟机上对ClickHouse进行探索。 安装 检测环境 grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"SSE 4.2 supported 可以看到我们的环境支持编译版本的。如果不支持的环境…...
常用的css样式
1:flex布局 .flex-between {display: flex;justify-content: space-between; }.flex-evenly {display: flex;justify-content: space-evenly; }.flex-end {display: flex;justify-content: flex-end; }.flex {display: flex; }.flex-center {display: flex;justify…...
小兔鲜儿 - 微信登录
目录 微信登录 登录方式 静态结构 获取登录凭证 获取手机号码 微信登录接口(生产环境) 模拟手机登录(开发环境) 用户信息持久化存储 涉及知识点:微信授权登录,文件上传,Store 状态管理等。 微信登录 微信小程序的开放…...
C++ Primer阅读笔记--对象移动(右值引用、移动迭代器和引用限定符的使用)
目录 1--右值引用 2--std::move 3--移动构造函数 4--移动赋值运算符 5--移动迭代器 6--引用限定符 1--右值引用 右值引用必须绑定到右值的引用,通过 && 获得右值引用; 右值引用只能绑定到临时对象(即将被销毁的对象)…...
【办公类-16-01-02】2023年度上学期“机动班下午代班的排班表——跳过周三、节日和周末”(python 排班表系列)
背景需求: 2023年第一学期(2023年9-2024年1月),我又被安排为“机动班”,根据新学期的校历,手动推算本学期的机动班的带班表 排版原则 1、班级数量:共有6个班级,循环滚动 2、每周次…...
ChatGPT HTML JS Echarts实现热力图展示
热力图是一种常用的数据可视化图表,主要用于展示数据的分布和密度情况。它通过使用不同颜色的热点来表示数据在地理或二维空间上的分布情况,从而直观地显示出数据的密集程度和趋势。 热力图的功能和作用如下: 1. 数据分布展示:热力图可以将大量数据以热点的形式展示在地理…...
JavaScript七小知
文章目录 1. == 和 ===区别2. a++ 和 ++a区别3. 创建js对象的三种方式4. 原型与原型链相关4.1 prototype4.2 __proto__4.3 constructor4.4 原型链5. 定时器的两种设置方式6. 时间相关7. axios与axios拦截器1. == 和 ===区别 == 只是判断值是否一致, === 会判断数据类型和…...
Ubuntu【系统环境下】【编译安装OpenCV】【C++调用系统opencv库】
Ubuntu【系统环境下】【编译安装OpenCV】【C调用系统opencv库】 前言: 本人需要用C写代码,调用OpenCV库,且要求OpenCV版本号大于4.1.0 由于使用的是18.04的版本,所以apt安装OpenCV的版本始终是3.2.0,非常拉胯&#…...
AR界安卓在中国,Rokid引爆空间计算狂潮
击关注 文丨刘雨琦 你可能很难想象,在一个没有显示屏也没有鼠标的空间,仅凭一副AR眼镜和一台口袋主机,就能完成一篇5000字的文章。 没错,8月26日,在2023 Rokid Jungle 新品发布会现场,这样的场景正在真实…...
在 React 中如何使用定时器
在React中使用定时器通常有两种方式:使用setInterval和setTimeout函数。 使用setInterval函数: 首先,在组件中导入useEffect和useState函数: import React, { useEffect, useState } from "react";在组件中声明一个状…...
Unity记录4.6-存储-第四阶段总结
文章首发见博客:https://mwhls.top/4822.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议,私信不回。 汇总:Unity 记录 摘要:存储初步实现的总结 总结-2023/08/19 实现了tile存储&…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
