
后端
micromicrofat
Python | Go | Deep Learning
展开
-
【Py】使用flask-apscheduler动态调整作业参数(附源码)
之前的项目常使用Apscheduler进行定时任务调度,但最近想通过接口对这些任务进行动态调整,比如调整任务启停、调整任务执行时间、间隔时间等等flask-apscheduler这个基于flask的库能够满足上面的需求,而且由于基于flask,所以我常用的connexion这个库理论上也能够完美支持。原创 2022-11-21 16:40:35 · 1658 阅读 · 0 评论 -
【Kafka】基于Docker的KRaft模式(无Zookeeper)集群安装及测试
最近项目中想使用kafka做消息系统,但安装好像很复杂,现在把安装过程记录一下。主流的安装方式是在服务器上直接安装,而我希望的是使用Docker。主流的Kafka使用Zookeeper,但最近Kafka将会逐步舍弃Zookeeper而使用自带的KRaft所以以下步骤是基于Docker安装无Zookeeper的Kafka。原创 2022-10-19 16:31:56 · 6244 阅读 · 0 评论 -
【Py】接口签名校验失败可能是由于ensure_ascii的问题
客户端:requests服务端:Flask客户端发请求前对请求签名,服务端对签名进行校验服务端签名校验失败,即生成的签名与客户端的不一致假设我们的请求体为在对字典数据进行json序列化时使用了如下代码其中的ensure_ascii参数是控制是否在序列化时使用ascii编码,默认为使用。效果就是中文字符全部变为unicode编码,这是因为中文字符不在ascii编码中。json序列化后对其进行签名,得到signature再通过requests将请求发送出去可能你已经发现问题了:requests中的j原创 2022-06-02 12:54:31 · 1490 阅读 · 0 评论 -
【Py】模拟multipart/form-data请求并指定boundary格式
import requestsdata = { 'param1': 'paramVal1', 'param2': 'paramVal2'}files = [ ("file", ("file1.xml", open("file1.xml", "rb"), "text/xml")), ("file", ("file2.xml", open("file2.xml", "rb"), "text/xml"))]r = requests.post(url='http://lo原创 2021-11-04 17:02:31 · 4839 阅读 · 0 评论 -
【Py】try-except块中的Flask abort会被截获从而导致response与预期不符
今天在撸代码的时候出现一个问题:有些abort能够正常返回指定的状态码以及描述(description),但有些就直接返回200,而且没有任何描述这是由于你可能把abort包裹在try-except结构中了如下所示:def foo(): abort(400, description={ 'success': False, 'code': 4019, 'message': '事务执行失败,回滚', 'data': None原创 2021-10-20 18:14:25 · 400 阅读 · 0 评论 -
connexion中实现after_request
想要实现在代码中任意位置直接响应而不用层层return,可以使用abord()函数,但abort函数仅能触发400、401等状态码,而200、402等等则会报错:“ERROR no exception for 402”。而且abord返回的数据格式固定,其中detail通过abord(400, description={‘code’: 4001, ‘data’: None …})确定。我们希望仍使用abord函数,但返回的状态码为200,且返回的数据仅为detail的内容。{ 'detail':原创 2021-05-15 18:18:28 · 265 阅读 · 0 评论 -
解决多进程环境下pymongo连接报错No replica set members found yet
部署环境:uwsgiflaskpymongo版本: 3.11.3nginx问题描述今天将mongodb数据库换成Atlas的数据库,部署后发现报错No replica set members found yet, Timeout: 30s, Topology Description: <TopologyDescription id: 606eb750c8adfd36c462e02c, topology_type: ReplicaSetNoPrimary, servers: [<原创 2021-04-08 16:46:03 · 2053 阅读 · 0 评论 -
0407自学web后端之——MongoDB创建索引
MongoDB每个collection自带有’_id’索引,这个索引是默认的,无法删除,在这个基础上可以自行添加索引>>> db.jdy_data.createIndex({entryId: 1}, {background: true}){ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1}参考:https://www.runo原创 2021-04-07 09:26:13 · 149 阅读 · 0 评论 -
使用nginx以头文件中的自定义参数为标记进行限流
之前对项目中对ip进行限流nginx限流配置我们也可以对其他参数进行限流,比如头文件中的自定义参数比如头文件中有x-signature和x-deliverid两个自定义参数,我们希望对这两个参数进行限流例:# /etc/nginx/nginx.confhttp { ... # 限制并发连接 limit_conn_zone $http_x_deliverid zone=addr_deliverid:1m; limit_conn_zone $http_x_signature zone=add原创 2021-03-27 15:53:41 · 763 阅读 · 0 评论 -
uwsgi+nginx配置文件(待解决)
参考:https://www.jianshu.com/p/6b252125221b原创 2021-03-25 17:35:03 · 194 阅读 · 0 评论 -
nginx限流配置
参考:https://segmentfault.com/a/1190000004688125原创 2021-03-25 17:23:29 · 241 阅读 · 1 评论 -
nginx会默认忽略header中带下划线的变量
作为一个nginx小白,今天又遇到一个坑:nginx会默认忽略掉header中带下划线的变量所以就出现在纯flask环境下能正常获取到"x_signature"变量,而在uwsgi+nginx+flask环境下就怎么也获取不到,一开始一直以为是uwsgi的问题,没想到是nginx的锅。如果一定要接收带下划线的变量,则需要在nginx.conf中添加server { ... underscores_in_headers on; ...}参考:https://blog.gnuers.原创 2021-03-25 14:19:00 · 544 阅读 · 0 评论 -
解决swagger生成的flask代码中的AttributeError: module ‘typing‘ has no attribute ‘GenericMeta‘错误
swagger生成的flask代码存在一个bug位置在swagger_server目录下的util.py文件中解决办法就是把下面的代码 elif type(klass) == typing.GenericMeta: if klass.__extra__ == list: return _deserialize_list(data, klass.__args__[0]) if klass.__extra__ == dict:原创 2021-03-20 15:11:29 · 2032 阅读 · 0 评论 -
微信小程序生成二维码流程
业务上需要小程序能够生成定位到特定页的二维码,查了一下,可以实现,官方文档注意,虽然二维码总数没有限制,但是分钟频率有限制:accesstoken申请频率不能过频繁,官方建议accesstoken交给中控服务器统一管理而且出于安全考虑accesstoken需要对前端不可见综上,设计流程如下图:考虑到前期流量较小,对分钟调用频率以及服务器带宽较低,所以没有对二维码进行缓存,而且没有使用OSS,后期一旦流量,应选用二期方案,而且对请求需要进行限流 Rate Limit...原创 2021-03-19 11:46:02 · 521 阅读 · 0 评论 -
关于tornado5.0后客户端使用发生的变化
一个老的项目今天更新了一下环境,主要是把tornado从版本4升级到了最新的6.1,出现错误,错误发生的代码如下:class ForceRefreshHandler(tornado.web.RequestHandler): def get(self): tokenType = self.get_argument('type', 'UnKnown') # 获取token的口令 secret = self.get_argument('secret', '原创 2021-03-17 16:33:14 · 288 阅读 · 0 评论 -
Python捕获sqlalchemy异常内的pymysql异常
在使用pymysql时,我们可以捕获异常代码和异常信息来定位sql执行的问题,例如如果删除一张本就不存在的表,会报错import pymysql...try: cursor.execute("DROP TABLE game")except pymysql.err.OperationalError as e: print(e) code, msg = e.argspymysql.err.OperationalError(1051, "Unknown table 'web_data.game'原创 2021-03-10 17:35:59 · 4265 阅读 · 0 评论 -
mysql中float和decimal类型特点(不定时更新)
参考:http://blog.leanote.com/post/weibo-007/mysql_float_double_decimal原创 2021-03-09 18:26:04 · 191 阅读 · 0 评论 -
用Python对相同文件获取MD5,但MD5不同的解决办法
前段时间写了一个Python脚本,目的是定时从目标位置获取文件,上传到阿里云OSS,为了避免重复上传相同的文件,我在每次获取到文件后加了一个获取其MD5的步骤,并用这个MD5在OSS中查找,如果有则放弃上传,没有则用这个MD5作为文件名进行上传。逻辑很简单,但不曾想没几天OSS就涨到将近1T,这就很迷惑了,因为目标文件总共就几百G。所以真相只有一个!MD5查重失效了!!!看一下出错的代码:import hashlibimport requestsclass Archive: def __in原创 2021-02-26 20:12:07 · 1801 阅读 · 2 评论 -
乒乓缓存机制
A Ping Pong Buffer is a double buffer that is used to speed up a device that can overlap the I/O operation with the data processing operation. One buffer is used to hold a block of data so that a reader device will see a complete (old) version of the da...原创 2020-11-04 12:17:18 · 8648 阅读 · 0 评论 -
Pymongo insert时会自动添加‘_id’
在使用pymongo时遇到了一个小坑:在Flask框架中,将字典插入mongodb后再返回就报错@app.route('xxxx')def main(): ... data = { 'a':'a', 'b':'b' } mycol.insert_one(data) return dataTraceback (most recent call last): File "/home/xiang/.local/lib/python3.6/site-packages/flask/ap原创 2020-09-21 09:49:26 · 927 阅读 · 0 评论 -
python中的同步、异步、阻塞、非阻塞思维导图
绘图工具:OmniGrafflegraffle文件:https://github.com/MacwinWin/my_mind_map/blob/master/sync_async_blocking_nonblocking/同(异)步(非)阻塞思维导图.graffle原创 2020-09-06 10:46:04 · 243 阅读 · 0 评论 -
结合知乎高赞回答谈谈个人关于回调函数(callback)的理解
最近在学习异步机制的过程中,发现实现异步的一个重要方式是通过回调函数(callback),而关于回调函数知乎上有一个非常热门的问题“回调函数(callback)是什么?”,里面汇集了非常多的回答,有好多既精辟又准确的回答得到上千个赞同,推荐对与回调函数不太理解的同学把每个回答都看一看,经过一番对比就会有自己的理解。下面就是我对回调函数的理解:先来看一下得票最高的回答中构建的一个示例even.py#回调函数1#生成一个2k形式的偶数def double(x): return x * 2原创 2020-08-31 16:41:54 · 567 阅读 · 0 评论 -
用于调试的轻量web server和http请求工具
postmannccurlpython3在进行web开发或者接口调试的时候,免不了要进行模拟http请求,以查看服务端是否正常postmanweb serverhttp请求nccurlpython3原创 2020-07-22 17:38:19 · 1068 阅读 · 0 评论 -
记一次因2375端口暴露导致的服务器攻击事件
前几日在阿里云ECS上部署了一个web服务容器,没想到过了几天收到告警:云防火墙检测到您的系统IP:xx.xx.xx.xx 出现了高风险安全事件:主机存在挖矿行为。最开始以为是误报但是,SSH连接上以后发现:确实存在恶意容器,貌似是挖门罗币的一个容器,不禁一阵后背发凉:成肉鸡了?赶紧先rm、rmi把容器镜像删完,然后开始找原因搜索一番发现貌似是因为2375端口暴露在公网上了,这个端口是用来进行docker集群管理的,所以权限相当大,大到可以执行docker几乎一切命令:docker pull、d原创 2020-07-15 15:43:30 · 1289 阅读 · 0 评论 -
MySQL查询是否存在的三种方式
配置字段数记录数引擎有无索引4CPU-16GRAM282474115InnoDB无1CPU-1GRAM282474115InnoDB无方式一>>> select ifnull((select pk from xxxx where uuid = '45949FF60A02082400506E6D8090476' limit 1 ), 0)方式二>>> select 1 from xxxx where uuid ...原创 2020-07-14 14:31:09 · 10289 阅读 · 0 评论 -
ossutil64常用操作
ossutil64安装>>> wget http://gosspublic.alicdn.com/ossutil/1.6.16/ossutil64>>> sudo chmod 755 ossutil64>>> ./ossutil64 configThe command creates a configuration file and stores credentials.Please enter the config file name,th原创 2020-07-13 14:09:54 · 6672 阅读 · 0 评论 -
关于Context(上下文)的精辟解释
编程中什么是「Context(上下文)」? - vczh的回答 - 知乎https://www.zhihu.com/question/26387327/answer/32611575编程中什么是「Context(上下文)」? - Blackbelly的回答 - 知乎https://www.zhihu.com/question/26387327/answer/128743651...转载 2020-07-08 16:11:43 · 1073 阅读 · 0 评论 -
docker下使用RabbitMQ
背景:由于项目中想要使用celery,而celery推荐的Broker是RabbitMQ和redis,而默认的则仅有RabbitMQ,由于没接触过RabbitMQ,想要尝试一下安装>>> docker pull rabbitmq:3-management初始化>>> docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management>>> docker原创 2020-07-07 11:26:40 · 470 阅读 · 0 评论 -
0402自学web后端之——MongoDB安装、基本概念与基本操作
安装docker方式>>> docker pull mongo:latest>>> docker run -itd --name mongo -p 27017:27017 mongo --auth# 进入客户端 admin为数据库名称>>> docker exec -it mongodb mongo admindb.create...原创 2020-04-07 17:35:56 · 217 阅读 · 0 评论 -
0402自学web后端之——使用flask-mail发送邮件
安装:>>> pip3 install flask_mail设置环境变量>>> export MAIL_USERNAME=发件邮箱地址@163.com>>> export MAIL_PASSWORD=发件邮箱授权码注意!发件邮箱要开启SMTP,一般在邮箱的设置界面,并且MAIL_PASSWORD一定要填授权码,而非密码,以163为...原创 2020-04-02 10:07:54 · 951 阅读 · 0 评论 -
0401自学web后端之——认证
认证(Authentication)参考:https://www.jianshu.com/p/537b356d34c9https://segmentfault.com/a/1190000010312468https://www.jianshu.com/p/50ade6f2e4fd相关Python包itsdangerous,参考:https://itsdangerous.palle...原创 2020-04-01 17:09:54 · 439 阅读 · 0 评论 -
0401自学web后端之——Flask配置文件
输出默认configfrom flask import Flask, current_appapp = Flask(__name__)with app.app_context(): print(dict(current_app.config)) {'ENV': 'production', 'DEBUG': False, 'TESTING': False, 'PROPAGATE...原创 2020-04-01 16:56:40 · 219 阅读 · 0 评论 -
使用itsdangerous生成有时间限制的token
>>> from itsdangerous import TimedJSONWebSignatureSerializer as Serializer# 设置加密密钥为“key”,限制时间为60秒>>> s = Serializer("key", 60)>>> token = s.dumps({'id':'12345'}).decode('...原创 2020-04-01 14:21:30 · 587 阅读 · 0 评论 -
关于回调函数的精辟解释
回调函数(callback)是什么? - 常溪玲的回答 - 知乎https://www.zhihu.com/question/19801131/answer/13005983转载 2020-04-01 13:44:44 · 192 阅读 · 0 评论 -
MySQL count(*)优化
有一张表27个列,数据量约1700000+,引擎是InnoDB查询所有记录条数的时候发现速度非常慢,约30+sEXPLAIN后发现:首先将主键长度设置为32,并新建一个索引查询速度降至7.494s再次进行优化,添加一个自增的主键列,用它进行索引查询速度降至0.410s来一个对比配置数据条数数据列数原始速度第一次优化第二次优化4CPU-...原创 2020-03-25 16:19:59 · 270 阅读 · 1 评论 -
使用Blueprint将Flask代码拆分
项目中想把原来在一个文件中的Flask代码拆分,在另一个文件中调用该Flask代码,这里就用到了Blueprintmain.py>>> from module import server>>> simple_page = server.construct_blueprint(self.start_time, self.q)>>> app...原创 2020-03-02 15:16:33 · 376 阅读 · 0 评论 -
理解Python multiprocessing.Process start和join方法
以下代码来自:https://www.cnblogs.com/lipijin/p/3709903.html,这里只是将其中print转为python3方式,通过依次看这几段代码以及运行结果应该能够理解start和join方法,文字描述反而可能会造成误解。In [1]: #encoding:utf-8 ...: from multiprocessing import Process ...原创 2020-03-02 14:27:40 · 1900 阅读 · 0 评论 -
使用pyqtSignal中出现"AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'"
对PyQT的自定义信号还不太熟悉,今天在使用中出现错误AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'原来是定义的位置出错了应该是:>>> class MyForm(QtWidgets.QMainWindow):>>> sig = pyqtSign...原创 2020-02-28 17:20:12 · 2603 阅读 · 0 评论 -
PyQT5开发准备
时隔将近一年,又要把pyqt5的一些东西拾起来了,好多东西都已经忘了,为了避免再次以往,这里把开发需要准备的东西记录下来。>>> sudo apt install python3-pyqt5>>> sudo apt install qttools5-dev-tools>>> sudo apt install pyqt5-dev-tools...原创 2020-02-28 17:10:58 · 234 阅读 · 0 评论 -
关于PyQT5进程间使用pyqtSignal
最近一个项目中想要使用pyqtSignal实时在窗口中append另外一个进程中接收到的信号,但是试了好几次,都无法接收到emit信号,并且用id(signal)发现所有signal实例都是同一个。这就很奇怪了。搜索后发现,原来是因为pyqt的signal只能够在同一个进程的不同线程中进行传递,而跨进程就不行,需要用到进程间通信,如队列,才能解决。参考:https://www.v2ex.com...原创 2020-02-28 16:58:49 · 4565 阅读 · 2 评论