<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[司开星的专栏]]></title><description><![CDATA[Python 开发者]]></description><link>https://blog.youkuaiyun.com/chroming</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; chroming]]></copyright><item><title><![CDATA[私有接口添加HTTPS私有证书及客户端验证]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/82057401</link><guid>https://blog.youkuaiyun.com/chroming/article/details/82057401</guid><author>chroming</author><pubDate>Sun, 26 Aug 2018 01:55:20 +0800</pubDate><description><![CDATA[有些布在公网的私有接口不想被他人使用, 需要添加一些验证方式。

一般的公开接口只有客户端的TOKEN认证, 这样可以验证提交到接口的数据是否是允许的客户端提交的. 但这样无法验证接口的真实性, 也无法防止中间人攻击。

本文主要研究给私有接口添加HTTPS连接并验证客户端真实性。

服务器证书



生成私有证书

要生成证书首先要有个私钥:

openssl genrsa -out ssl.k...]]></description><category></category></item><item><title><![CDATA[如何向PyPi(pip)提交模块]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/82057399</link><guid>https://blog.youkuaiyun.com/chroming/article/details/82057399</guid><author>chroming</author><pubDate>Sun, 26 Aug 2018 01:53:56 +0800</pubDate><description><![CDATA[向 https://pypi.python.org/pypi 提交自己的模块步骤如下：


在模块中添加几个必需文件；
使用打包命令将模块打包；
使用模块twine将模块上传到pypi。


所需文件



setup.py

setup.py 中包含了你要提交模块的大部分信息。其写法如下：



from setuptools import setup, find_packages

setup...]]></description><category></category></item><item><title><![CDATA[调试卡死的Python进程]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/82057397</link><guid>https://blog.youkuaiyun.com/chroming/article/details/82057397</guid><author>chroming</author><pubDate>Sun, 26 Aug 2018 01:53:12 +0800</pubDate><description><![CDATA[有时线上程序运行过程中出现卡死（阻塞），无法通过断点或log找到问题，需通过其他方式调试。本文基于CentOS 7。

通用调试方法

查看进程号： 
ps auxf

查看此进程卡在哪个系统回调：

strace -p pid

pid替换为实际进程号。此命令会返回一个系统回调和文件操作符。

检查上一条命令系统回调的文件操作符的含义：

ls -l /proc/pid/fd

数字就是文件操作...]]></description><category></category></item><item><title><![CDATA[Python2 异步网络请求库比较]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/82057394</link><guid>https://blog.youkuaiyun.com/chroming/article/details/82057394</guid><author>chroming</author><pubDate>Sun, 26 Aug 2018 01:52:28 +0800</pubDate><description><![CDATA[封装库



grequests



简介

requests作者写的基于gevent的异步请求库。



地址

https://github.com/kennethreitz/grequests



示例



import grequests

urls = [
    'http://www.heroku.com',
    'http://python-tablib.org',
  ...]]></description><category></category></item><item><title><![CDATA[理解Python函数装饰器]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/82057376</link><guid>https://blog.youkuaiyun.com/chroming/article/details/82057376</guid><author>chroming</author><pubDate>Sun, 26 Aug 2018 01:41:51 +0800</pubDate><description><![CDATA[旧文更新后重发。 
Python中的函数装饰器是一种能在不修改函数的前提下给函数添加额外功能的写法。

什么是装饰器



一个函数修改需求

假设已经存在一个函数:



import random

def func_a():
    print(&quot;I'm func_a, get a random number %s&quot; % random.random())

现在想给函数加一句显示 ，最简单的...]]></description><category></category></item><item><title><![CDATA[Python 的列表推导式]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/77104878</link><guid>https://blog.youkuaiyun.com/chroming/article/details/77104878</guid><author>chroming</author><pubDate>Sat, 12 Aug 2017 05:50:48 +0800</pubDate><description><![CDATA[Python 的列表推导式、字典推导式

列表推导式

列表解析是用一行代码实现根据一个列表生成另一个列表的写法。

基本写法

要实现从一个列表中获取满足条件的某些元素组成新的列表：

[x for x in [1,2,3,4] if x % 2 == 0]

这行代码输出是 [2, 4]。如果没有 if 的话就是直接复制整个列表。

其他用法

修改新列表的元素：

[x/2 for x in]]></description><category></category></item><item><title><![CDATA[Sentry API 使用笔记]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/77104875</link><guid>https://blog.youkuaiyun.com/chroming/article/details/77104875</guid><author>chroming</author><pubDate>Sat, 12 Aug 2017 05:49:47 +0800</pubDate><description><![CDATA[Sentry API 使用笔记

本文为使用Sentry API的笔记, 并非搭建Sentry的笔记

官方文档:  https://docs.sentry.io/api/

官方社区:  https://forum.sentry.io/

官方提醒：(2017年5月) The current version of the web API is known as v0 and is conside]]></description><category></category></item><item><title><![CDATA[lxml.html 中几种解析器的区别]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/77104874</link><guid>https://blog.youkuaiyun.com/chroming/article/details/77104874</guid><author>chroming</author><pubDate>Sat, 12 Aug 2017 05:48:57 +0800</pubDate><description><![CDATA[lxml.html 中几种解析器的区别

lxml 自2.0版本起有了专门用于处理html的模块lxml.html, 模块中包含几种解析html的方式, 以载入html文档为例:

from lxml.html import fromstring, soupparser, html5lib

html = 'x=1'

a = fromstring(html)
b = soupparser.fro]]></description><category></category></item><item><title><![CDATA[pipenv 简要指南]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/77104873</link><guid>https://blog.youkuaiyun.com/chroming/article/details/77104873</guid><author>chroming</author><pubDate>Sat, 12 Aug 2017 05:48:25 +0800</pubDate><description><![CDATA[pipenv 简要指南

pipenv是requests作者的一个项目, 整合了virtualenv, pip, pipfile, 用于更方便地为项目建立虚拟环境并管理虚拟环境中的第三方模块.

安装

直接使用pip即可安装:

pip install pipenv

新建虚拟环境

pipenv管理虚拟环境是按项目来的, 要为你的某个项目新建一个虚拟环境, 只需要在项目目录下运行如下命令:

]]></description><category></category></item><item><title><![CDATA[bettercap]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/77104872</link><guid>https://blog.youkuaiyun.com/chroming/article/details/77104872</guid><author>chroming</author><pubDate>Sat, 12 Aug 2017 05:47:57 +0800</pubDate><description><![CDATA[bettercap简单使用笔记

安装

sudo gem install bettercap

简单使用

在所有设备的网页插入html:

sudo bettercap --proxy-module injecthtml --html-file a.html

监控所有设备流量:

sudo bettercap -X

监控指定设备流量:

sudo bettercap -X -T 192.1]]></description><category></category></item><item><title><![CDATA[使用 PyPDF2 操作 pdf 文件]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/77104871</link><guid>https://blog.youkuaiyun.com/chroming/article/details/77104871</guid><author>chroming</author><pubDate>Sat, 12 Aug 2017 05:47:20 +0800</pubDate><description><![CDATA[使用 PyPDF2 操作 pdf 文件

Python 中读写 pdf 文件最常用的模块是 PyPDF2。

PyPDF2 将读与写分成两个类来操作：

from PyPDF2 import PdfFileWriter, PdfFileReader

writer = PdfFileWriter()
reader = PdfFileReader(open("document1.pdf", "rb"]]></description><category></category></item><item><title><![CDATA[CC许可协议详解]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/77104869</link><guid>https://blog.youkuaiyun.com/chroming/article/details/77104869</guid><author>chroming</author><pubDate>Sat, 12 Aug 2017 05:43:26 +0800</pubDate><description><![CDATA[CC许可协议详解

简要说明

协议内容

CC许可协议（知识共享许可协议）是博客中最常见的许可协议。协议中主要规定了以下四种权利：


署名(BY)：转载此作品时要附上原作者名称等信息。
非商业使用(NC)：这个作品不能被用作商业目的。
禁止演绎(ND)：转载时不能修改原内容。
相同方式共享(SA)：如果转载时修改了原内容那必须以相同的CC许可协议发布修改后的内容。


四种权利可以相互组合形成]]></description><category></category></item><item><title><![CDATA[CC许可协议详解]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/77104866</link><guid>https://blog.youkuaiyun.com/chroming/article/details/77104866</guid><author>chroming</author><pubDate>Sat, 12 Aug 2017 05:39:40 +0800</pubDate><description><![CDATA[CC许可协议详解

简要说明

协议内容

CC许可协议（知识共享许可协议）是博客中最常见的许可协议。协议中主要规定了以下四种权利：


署名(BY)：转载此作品时要附上原作者名称等信息。
非商业使用(NC)：这个作品不能被用作商业目的。
禁止演绎(ND)：转载时不能修改原内容。
相同方式共享(SA)：如果转载时修改了原内容那必须以相同的CC许可协议发布修改后的内容。


四种权利可以相互组合形成]]></description><category></category></item><item><title><![CDATA[Python 程序扩展名（py, pyc, pyw, pyo, pyd)及发布程序时的选择]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/52083387</link><guid>https://blog.youkuaiyun.com/chroming/article/details/52083387</guid><author>chroming</author><pubDate>Mon, 01 Aug 2016 10:18:27 +0800</pubDate><description><![CDATA[在写Python程序时我们常见的扩展名是py, pyc，其实还有其他几种扩展名。下面是几种扩展名的用法。]]></description><category></category></item><item><title><![CDATA[扩展名改为pyw后无法运行的问题记录]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/52045054</link><guid>https://blog.youkuaiyun.com/chroming/article/details/52045054</guid><author>chroming</author><pubDate>Wed, 27 Jul 2016 14:15:50 +0800</pubDate><description><![CDATA[py的扩展名改为pyw后在windows下直接双击运行会调用pythonw执行程序，不会打开控制台窗口，适合用来运行GUI界面的python源码。但在一次实际使用过程中发现在将扩展名py改成pyw后程序无法正常运行，某些功能不正常。由于没有控制台也看不到有什么错误。改回扩展名后则正常。上网搜索之后找到一个类似问题，http://stackoverflow.com/questions/24835155]]></description><category></category></item><item><title><![CDATA[一次失败的QThread多线程加载Webpage.load()页面的尝试]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/51955999</link><guid>https://blog.youkuaiyun.com/chroming/article/details/51955999</guid><author>chroming</author><pubDate>Tue, 19 Jul 2016 15:09:19 +0800</pubDate><description><![CDATA[问题前段时间在用PyQt4写网页加载部分时一开始用的从QWebView.load()(QWebFrame.load())，但由于这样会卡住GUI，于是换了QNetworkAccessManager模块来访问网络，返回内容用setcontent()传递给QWebView：http://blog.youkuaiyun.com/chroming/article/details/51832244当时还觉得解决了一个挺有]]></description><category></category></item><item><title><![CDATA[从QWebView.load()(QWebFrame.load())切换到QNetworkAccessManager引起的CSS加载不了的问题记录]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/51832244</link><guid>https://blog.youkuaiyun.com/chroming/article/details/51832244</guid><author>chroming</author><pubDate>Tue, 05 Jul 2016 15:50:57 +0800</pubDate><description><![CDATA[从QWebView.load()(QWebFrame.load())切换到QNetworkAccessManager引起的CSS加载不了的问题记录近期使用PyQt4 写了一个程序，其中有个部分是显示网页。一开始使用的是简单的QWebView.load()（QWebFrame.load() 也能实现同样的功能）：self.webView.load(QUrl(url))显示效果没什么问题。但在实际使用中]]></description><category></category></item><item><title><![CDATA[Python连接SQL Server入门]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/51541959</link><guid>https://blog.youkuaiyun.com/chroming/article/details/51541959</guid><author>chroming</author><pubDate>Mon, 30 May 2016 23:02:50 +0800</pubDate><description><![CDATA[Python连接SQL Server入门模块import pyodbc模块说明pyodbc模块是用于odbc数据库（一种数据库通用接口标准）的连接，不仅限于SQL server，还包括Oracle,MySQL,Access,Excel等。另外除了pyodbc还有其他几种连接SQL server的模块，感兴趣的可以在这里找到：https://wiki.python.org/moin/SQL%20Ser]]></description><category></category></item><item><title><![CDATA[HTTPS中的对称密钥加密，公开密钥加密，数字证书]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/50995384</link><guid>https://blog.youkuaiyun.com/chroming/article/details/50995384</guid><author>chroming</author><pubDate>Mon, 28 Mar 2016 09:06:22 +0800</pubDate><description><![CDATA[HTTPS中的对称密钥加密，公开密钥加密，数字证书密钥我们将未加密的内容称为明文，加密之后的内容称为密文。简单来说，要加密一段明文，可以将这段内容输入到一个加密函数中，输出密文。但这种简单的加密方式存在被人盗取到加密函数从而破解明文的危险，且加密函数一般构成复杂，一旦被盗取更换成本较高。于是人们想出了一个办法，在加密函数中再添加一个参数，这个参数只有通信双方知道，没有参数则无法正确解密出密码。这个参]]></description><category></category></item><item><title><![CDATA[详解HTTPS中数字证书验证系统]]></title><link>https://blog.youkuaiyun.com/chroming/article/details/50995378</link><guid>https://blog.youkuaiyun.com/chroming/article/details/50995378</guid><author>chroming</author><pubDate>Mon, 28 Mar 2016 09:04:26 +0800</pubDate><description><![CDATA[关于浏览器验证网站数字证书的流程网上的资料一般讲的都不是很清楚。在查阅了不少资料后终于搞清楚这部分。CA下发给网站的证书都是一个证书链，也就是一层一层的证书，从根证书开始，到下级CA，一层一层，最后一层就是网站证书。浏览器收到服务器发送的证书后，需要验证其真实性。而证书的签名是通过签名算法和上级CA的私钥生成的，并非很多文章里简单说的靠CA私钥生成。浏览器需要用上级CA的公钥才能解密签名，并与生成的]]></description><category></category></item></channel></rss>