阿小信大人的头像
Talk is cheap. Show me the code. Linus Torvalds

celery 4.1.0 版本定时任务执行时间 bug2017-12-27 16:15

**为什么使用celery代替crontab?**

关于celery,他是一个分布式的任务队列。

项目中有较多的定时任务,开始是用crontab实现的,考虑到未来的拓展和管理,决定使用celery的beat来实现定时任务。

虽然对于简单的周期性定时任务使用crontab就能做到,但是一旦需要处理的任务变多需要分布式处理时crontab不便于管理。

celery通过消息队列来实现分布式可以保证定时任务不被重复执行,消息队列已经为你自动实现了同步机制。例外也可以打破crontab的每分钟才执行一次的速度限制,只要有任务消息到来我就能处理,可以使任务更加高效的被执行。使用消息

......
#Python#   评论[0]阅读全文[82]

记一次系统性能bug排查2017-11-23 17:34

在客户的环境中,我们的代码表现为twisted封装的http接口处理web请求忽快忽慢。客户反映一个页面上有获取绘图数据的请求,一页在一个屏幕上大概显示九个图,每次打开页面总有几个图一直在加载,刷新页面后之前没加载出来的出来了但是其他原本正常的又变成加载中了,而且要很慢才会返回结果,其他接口也类似这种情况,但是没有大的并发量也没有太大的数据量的环境莫名其妙的运行了几天就变成这样了。

项目是起了twistd三个进程分别跑在`127.0.0.1:8001`, `127.0.0.1:8002`, `127.0.0.1:8003`,然后用nginx代理的,查看nginx的log,可以看到很多

......
#Python#   评论[1]阅读全文[88]

Flask中日志按照日志级别分开保存到不同文件2017-11-21 19:17

目标是想让代码中的日志按照不同的级别保存到不同的文件,即不管是框架本身的debug日志还是我们自己写的debug日志都保存到debug.log,info日志都保存在info.log,以此类推。

如果是为不同级别设置不同的logger,每个logger对应不同的文件handler,然后封装自己的日志函数调用对应的logger来记录日志确实是可以记录到不同的文件,但是这样只能记录自己代码中打的log而不会记录flask框架打印的log,因为框架使用的logger名称和我们使用的logger不一样,要达到我们的目标不能在logger上做处理,应该对和框架同一个logger上的handler做处

......
#Python#   #flask 评论[0]阅读全文[180]

urllib2请求https的ssl验证报错2017-06-26 15:41

Python 2.7.9 之后,当使用urllib.urlopen打开一个 https 链接时,会验证一次 SSL 证书。

urllib2请求https时,报错:`urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed `

解决方案:

使用ssl创建未经验证的上下文,在urlopen中传入上下文参数

import ssl
import urllib2

context = ssl._create_un

......
#Python#   评论[0]阅读全文[697]

PyYAML有序更新yaml文件2017-05-04 16:07

yaml默认load进来是个字典,所以无法保持原本的顺序,要想不改变原本的yaml结构更新yaml文件内容需要用到以下方法

:::python
from collections import OrderedDict
import yaml

def ordered_yaml_load(yaml_path, Loader=yaml.Loader,
object_pairs_hook=OrderedDict):
class OrderedLoader(Loader):

......
#Python#   评论[0]阅读全文[619]

Sentry插件编写总结2017-03-03 09:34


sentry插件需要特定的结构才能正常工作,最简单的结构即为本插件的文件结构。

sentry-rtx *
│ .gitignore
│ README.md
│ setup.cfg
│ setup.py *

└─ sentry_rtx *
plugin.py *
tof_api.py
__init__.py

主要编写其中的setup.py和plugin.py

在`sentry_rtx/plug

......
#Python#   评论[0]阅读全文[607]

requests使用multipart/formdata提交post请求的hack姿势2016-10-31 21:19

今天调别人一个接口,需要用formdata的方式发post,没有报错信息,还真是折腾了好一会儿。

一直以为就是常用的post方法里面传递一个dict给data参数发请求,结果没想到不是,还是基本功不够啊。

先来看中规中矩的请求方式:(自己构建formdata的请求体)

:::python
from pprint import pprint
import requests

BOUNDARY = 'my-cute-multipart-formdata-boundary'
CRLF = '\r\n'
URL =

......
#Python#   评论[4]阅读全文[2146]

flask通过nginx代理后base_url拿不到正确的url_scheme2016-04-14 12:31

Nginx配置了https请求后,用户发起https请求时首先和Nginx建立连接,完成SSL握手,而后Nginx作为代理是以http协议将请求转给gunicorn处理的,Nginx再把gunicorn的输出通过SSL加密发回给用户,这中间是透明的,gunicorn只是在处理http请求而已。

这时即使请求时用的是https,flask中的request中`wsgi.url_scheme`收到的仍然是http,所以在其他url相关的地方的值都是http链接。

解决办法是在flask中使用ProxyFix,并且确保nginx配置中设置了`Host`和`X-Forwarded-Prot

......
#Python#   #flask 评论[0]阅读全文[945]