近期文章

Python 2019-01-13

python中的协程

先介绍下什么是协程:

协程,又称微线程,纤程,英文名Coroutine。协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行。

是不是有点没看懂,没事,我们下面会解释。要理解协程是什么,首先需要理解yield,这里简单介绍下,yield可以理解为生成器,yield item这行代码会产出一个值,提供给next(...)的调用方; 此外,还会作出让步,暂停执行生成器,让调用方继续工作,直到需要使用另一个值时再调用next()。调用方会从生成器中拉取值,但是在协程中,yield关键字一般是在表达式右边(如,data=yield),协程可以从调用方接收数据,也可以产出数据,下面看一个简单的例子:

>>> def simple_coroutine():
...     print('coroutine start')
...     x = yield
...     print('coroutine recive:',x)
...     
>>> my_co=simple_coroutine()
>>> my_co
<generator object simple_coroutine at 0x1085174f8>
>>> next(m...
Python 2018-11-18

函数装饰器和闭包

装饰器基础知识

装饰器是可调用对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。 假如有一个名为decorate的装饰器:

@decorate
def target():
    print('running target()')

上述代码的效果与下述写法一样:

def target():
    print('running target()')
target = decorate(target)

两种写法的最终结果一样:上述两个代码片段执行完毕后得到的target不一定是原来那个target函数,而是decorate(target)返回的函数。
严格来说,装饰器只是语法糖。装饰器可以像常规的可调用对象那样调用,其参数是另一个函数。有时,这样更方便,尤其是元编程(在运行时改变程序行为)时。
综上,装饰器的一大特征是,能把被装饰的函数替换为其他函数。第二个特性是,装饰器在加载模块时立即执行,这通常是在导入时(即python加载模块时。

闭包

闭包时指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。 参考下面函数:

def make_averager():
    series = []

    def averager(new_value):
       ...
Python 2018-10-05

为你的Django项目保驾护航

保证你的站点安全至关重要,如果你的站点被入侵,后果可能不仅仅是你的服务器被黑,更严重的可能是你的用户隐私数据被盗,造成严重的后果。 Django框架现在已经非常成熟,大多数常见的安全问题框架本身都有提供解决方案,下面大致介绍下一些常见的防御措施。

Https

现在的网站https基本都是标配了吧,如果你的网站还没有支持https,那么就要考虑是不是需要尽快为你的网站加上https,这里推荐使用免费的Let's Encrypt。本站使用的就是他们颁发的证书。可以参考该文章:
申请Let's Encrypt通配符证书 有大致的介绍。 如果你的站点已经支持了https访问的话,建议在settings.py中加入:

SECURE_SSL_REDIRECT = True #将http请求重定向到https
SESSION_COOKIE_SECURE = True #只在https才会将cookie发送到客户端
CSRF_COOKIE_SECURE = True

HTTP 严格传输安全协议(HSTS)

HSTS最为核心的是一个HTTP响应头(HTTP Response Header)。正是它可以让浏览器得知,在接下来的一段时间内,当前域名只能通过HTTPS进行访问,并且在浏览器发现当前连接不安全的情况下,强制拒绝用户的后续访问要求。 如本站:

strict-transpor...
Linux 2018-09-18

使用Docker部署Ngrok实现内网穿透

以前写过一篇文章, ubuntu安装ngrok并使用nginx代理,介绍了在ubuntu上安装ngrok,但是是需要在系统中安装gvm等依赖,而且过程还是挺麻烦的,正好今天有时间,于是试着使用Docker来部署下,下面介绍下如何部署。

准备工作

域名解析

首先,需要在你的域名提供商处增加两条A记录解析到你的服务器,比如我的是 ngrok.lylinux.net*.ngrok.lylinux.net。这样你可以使用subdomain的方式,来实现穿透。

配置

目录结构如下图所示, 目录结构

可以看到,有必须的Dockerfile文件,build.sh是编译ngrok的脚本,config.yml是客户端使用的配置文件,下面分别介绍下。

Dockerfile

FROM golang:1.7.1-alpine
ADD build.sh /
RUN apk add --no-cache git make openssl
RUN git clone https://github.com/inconshreveable/ngrok.git --depth=1 /ngrok
RUN sh /build.sh
EXPOSE 8081
VOLUME [ "/ngrok" ]
CMD [ "/ngrok/bin/ngrokd"]

可以看到,我们是基于golang:1.7.1-alpine...

Linux 2018-08-27

openssl使用rsa加解密

生成公钥私钥

使用命令生成私钥:

openssl genrsa -out rsa_private_key.pem 1024  

参数:genrsa 生成密钥 -out 输出到文件 rsa_private_key.pem 文件名 1024 长度

从私钥中提取公钥:

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

参数: rsa 提取公钥 -in 从文件中读入 rsa_private_key.pem 文件名 -pubout 输出 -out 到文件 rsa_public_key.pem 文件名

shell加解密

新建一个decrypt.txt 内容是lylinux 使用公钥加密:

openssl rsautl -encrypt -in decrypt.txt -inkey rsa_public_key.pem -pubin -out encrypt.data

参数: rsautl 加解密 -encrypt 加密 -in 从文件输入 decrypt.txt 文件名 -inkey 输入的密钥 rsa_public_key.pem 上一步生成的公钥 -pubin 表名输入是公钥文件 -out输出到文件 encrypt.data 输出文件名 使用私...

Linux 2018-07-29

php无法连接mysql解决办法

前段时间把我的阿里云机器上面跑的服务修改成了docker部署,但是在升级了mysql容器之后发现另一个wordpress的站一直无法打开,提示无法连接数据库,这个很奇怪,只是升级了下mysql容器,用户名密码等都没有修改,为什么会无法连接呢? 打开了下wordpressdebug模式,发现如下错误信息:

Warning: mysqli_real_connect(): Unexpected server respose while doing caching_sha2 auth: 109 in /wordpress/wp-includes/wp-db.php on line 1531
Warning: mysqli_real_connect(): MySQL server has gone away in /wp-includes/wp-db.php on line 1531
Warning: mysqli_real_connect(): (HY000/2006): MySQL server has gone away in /wordpress/wp-includes/wp-db.php on line 1531

网上查找了下资料才发现在mysql 8以后会出现这样的情况:

MySQL 8

When running a PHP version before 7.1.1...

发现更多