Python2下的urllib2库在处理异常事件时候的最佳实践

Python2下的urllib2库在处理异常事件时候的最佳实践

我们闲话少说,来看下面的一段代码:

import urllib2

url='http://httpbin.org/status/500'
try:
    request = urllib2.Request(url)
    response = urllib2.urlopen(request)
    print(response.read())
except urllib2.HTTPError as e:
    print('HTTPError')
    print(response.read())

上面的代码的核心需求是在异常时把服务端返回的异常报文打印出来,以便后续的排障,当然我们也看到了在except后面的异常处理代码块里面的最后一行,也确实在尝试打印服务端返回的异常报文,但是呢如果不太有经验的小伙伴可能会遇到下面的报错,

 ✘  ~/Downloads  /usr/bin/python /Users/sharp/Downloads/test.py
HTTPError
Traceback (most recent call last):
  File "/Users/sharp/Downloads/test.py", line 10, in <module>
    print(response.read())
NameError: name 'response' is not defined

其实这样的处理方式在python3中是可以的,但是至于python2为什么不可以,不知道是受限于什么,下面我来说一下解决的办法,见如下代码:

import urllib2

url='http://httpbin.org/status/500'
try:
    request …
阅读更多
探索SikuliX IDE下的Python Requests库的安装及最佳实践

探索SikuliX IDE下的Python Requests库的安装及最佳实践

背景

最近在玩一些自动化的东西,用到了java开发的SikuliX IDE工具,由于要和网站交互那么我自然想到了用大名鼎鼎的Python Requests库了,可是不管我怎么样在电脑上反反复复的用pip2或pip3卸载然后重装requests都会报下面的错误,

错误原文我也贴一下:

[error] script [ sikulix ] stopped with error in line 1
[error] ImportError ( No module named requests )
[error] --- Traceback --- error source first
line: module ( function ) statement 
1: main (  <module> )     import requests
[error] --- Traceback --- end -------------- …
阅读更多
近3k Star的Python重试库Tenacity的最佳实践探索

近3k Star的Python重试库Tenacity的最佳实践探索

背景

最近在写一些模拟SSO登陆的脚本,由于SSO不是很稳定,总是时不时的超时或者返回5xx错误,但都是偶发性的,如果不进行一定程度的容错处理,那么监控平台将会有太多无效告警,不过在脚本经过Tenacity加持改造的情况下,监控平台的误告大有改善,下面就让我们一起来探索一下这一款近3k Star的Python重试库Tenacity的最佳实践。

过程

本次探索依赖另一个大名鼎鼎的Python库Requests,所以我们先来安装一下依赖和Tenacity库本身。

$ pip3 install requests==2.25.1
$ pip3 install tenacity==7.0.0

下面来看一个小demo,

import requests
from tenacity import *

@retry(reraise=True,stop=stop_after_attempt(2),wait=wait_fixed(2))
def main():
    print("****** Start Try " + str(main.retry.statistics['attempt_number']) + ' ******')
    resp = requests.get('https://httpstat.us/200?sleep=5000', timeout=3)
    print(resp.status_code)

try:
    main()
except requests.exceptions.RequestException as e:
    print(str(e))

其输出如下:

$ python3 demo.py
****** Start …
阅读更多
由return语句和异常捕获之间的一个小细节来看Python的execution flow

由return语句和异常捕获之间的一个小细节来看Python的execution flow

这个小细节的阐述将由一个小实验来展开,这个小实验依赖一个python库requests,用下面的命令安装一下:

$ pip install requests

安装完之后我们来看下面的代码:

import requests
def main():
    try:
        resp = requests.get('https://httpstat.us/200?sleep=5000', timeout=3)
        status_code = resp.status_code
    except requests.exceptions.Timeout as e:
        print(str(e))
    return status_code

print(main())

上述代码由于请求了一个https的地址,所以最好用python3来运行,首先来看一下运行结果:

$ python3 demo.py
HTTPSConnectionPool(host='httpstat.us', port=443): Read timed out. (read timeout=3)
Traceback (most recent call last):
  File "demo.py", line 10, in <module>
    print(main())
  File …
阅读更多
一个细节导致python2的importlib库报错

一个细节导致python2的importlib库报错

最近在对zabbix依赖的接口主动探测脚本做配置化改造,脚本里面用到了importlib提供的动态import功能,由于这一次一时性起全程vim操作没有用pycharm,vim一时爽,一直用一直爽,雾~ 等会我会说到不用pycharm导致的问题。

下面我用一个demo来复现一下问题,也便于大家理解,以下是目录结构和代码内容:

$ tree
├── demo
│   ├── cc_test.py
├── demo.py

$ cat demo.py
import importlib
path='cc'
lib=importlib.import_module('demo.'+path+'_test')
print(lib.ccc)

$ cat demo/cc_test.py
ccc='111'

你可以按照上面的目录结构和代码内容组织好,然后用python2运行一下,大致会报下面的错误,

$ python2 demo.py
Traceback (most recent call last):
  File "demo.py", line 3, in <module>
    lib=importlib.import_module('demo.'+path+'_test')
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/Users/sharp/Downloads/demo.py", line …
阅读更多
如何解决Win10进入WSL报rpc服务器不可用

如何解决Win10进入WSL报rpc服务器不可用

今天进入Wsl里面的Ubuntu时提示rpc服务器不可用错误,英文应该是rpc server is unavailable。

一番折腾发现是前几天因为配置Win10的hosts绑定时由于在ip后煞笔的加了端口号,导致hosts绑定怎么弄都不生效,然后听信网上的说法用命令行修改注册表关闭了Win10的DNS客户端,如果是这样的话解决方法很简单,重新执行下面的命令,把dns客户端设置为自动启动,然后重启电脑即可,之前用命令行修改注册表关的dns客户端的不要幻想用service.msc去启动,你会发现都是灰色的不给你启动的机会,命令如下:

REG add “HKLM\SYSTEM\CurrentControlSet\services\dnscache” /v Start /t REG_DWORD /d 2 /f

注意要用管理员权限启动powershell窗口哦,也不要忘记重启电脑,上面的/d 后面的数字2代表开启自动启动。

有啥疑问欢迎评论留言哈,每一条评论我都会收到邮件通知然后及时回复大家的。

阅读更多
‌保姆级最简单实现django的站点地图sitemap

‌保姆级最简单实现django的站点地图sitemap

首先打开你的项目下的setting.py文件,然后找到 INSTALLED_APPS这个列表变量,然后在里面加入如下两项:

['django.contrib.sites',
'django.contrib.sitemaps',]

然后在settings.py中的任意位置加入一个  SITE_ID = 1 的变量,然后在你的项目根目录运行下面的命令进行数据库同步,

python manage.py migrate

然后我们来到项目的urls.py文件中,先import一个用于sitemap的django类和你的假定表示文章的数据库模型Post,

from django.contrib.sitemaps import GenericSitemap
from blog.models import Post

紧接着,我们在urls.py中新建一个字典,再定义一个path(),如下:

article_dict = {
    'queryset': Post.objects.all(),
}

path('sitemap.xml', sitemap,
                    {'sitemaps': {'blog': GenericSitemap(article_dict, priority=0.6)}})

然后我们还要到项目的models.py中假定你的表示文章的数据库模型Post()中新增一个如下函数,

def get_absolute_url(self):
    return reverse('article_detail', args=[str(self.slug)])

说明一下,上述的self.slug表示你的文章的url链接的数据库字段名,如果你用id当做url的话,上述就应该用self.id了。

最后我们来到django admin面板,找到站点管理下的站点-站点(如果你的面板是英文的自行改成中文就行了),点进去把里面的域名和显示名称中的example.com改成你自己的域名就行了,好了,现在大工告成,你可以在这访问一下本站的 sitemap链接 测试一下。

阅读更多
如何对1K+应用产生的Elasticsearch索引进行运维治理

如何对1K+应用产生的Elasticsearch索引进行运维治理

背景

最近在全面接手估计有1k+的生产日志的运维工作,每天面临着大量的投诉,大部分的诉求都是日志突然没了,为了对生产故障进行排查要紧急查看日志,由于应用系统数量和种类繁多,以及所有日志系统的网络架构的复杂性导致出现这种问题有时并不能快速解决,与其每天被动的的接受开发的投诉,还不如主动的对这1K+应用产生的Elasticsearch索引进行运维治理。

其实应用突然没日志无外乎下面几种:

  • k8s pod里面的log挂载点发生了变化
  • log4j里面的日志路径发生了变化
  • 应用上云后log4j里面的路径没有进行同步变更
  • 还有的windows机器上的filebeat偶尔会挂掉
  • k8s集群新增了节点,pod重启后漂移到了新增的未部署filebeat的节点上了
  • 还有就是本站的这篇博客提到的类似error也会导致采集不到日志

经过最近几天的主动治理,发现当我主动找到开发反馈业务系统半个月或一个多月没日志的时候开发都很配合工作,部门的SLA水平因此在渐渐提高中,可见主动的对Elasticsearch索引的运维治理还是很有必要的。

下面的脚本运行了之后会列出脚本运行时刻往前30天(可以自定义,下面有提到)没有采集到一条日志的应用,然后你就可以抢在开发的前面,主动的去看是上面提到的“应用突然没日志无外乎下面几种”中的哪一种情况导致的了。

运行环境

  • python 3.6.8 (用到了asyncio的一个在3.6存在的方法,没在3.7测试)
  • Elasticsearch 6.x or 7.x 均可

依赖部署

python3 -m pip install 'elasticsearch[async]==7.11.0'
python3 -m pip install requests

使用说明

usage: es.py [-h] -v VERSION

A tool to do some governance on es index via …
阅读更多