python装饰器
装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器用于有以下场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
类似于中间件,类似于设计模式中的装饰器
装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器用于有以下场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
类似于中间件,类似于设计模式中的装饰器
迭代类似于遍历
迭代器作用:在进行遍历时,每每循环一次都会返回下一个数据,直到读完所有的数据为止。迭代器的作用就是记住访问到了第几条数据,以便于拿到下一条数据。
迭代器的本质:使多个不同类型的对象可以一起遍历,比如一个列表中既又元祖又有列表又有字符串
迭代器必须有__iter__和__next__方法。
迭代器优点:节省内存。不依赖索引取值。惰性计算。
迭代器的缺点:不能直观的查看里面的数据。取值时不走回头路,只能一直向下取值。
本质:是一个迭代器,即生成器是一种特殊的迭代器。
特点:惰性运算,开发者自定义。
生成器函数:在生成器函数中,用yield语句而不是return语句,yield语句一次返回一个结果。在其中两个结果的中间,函数是挂起的状态,以便于下次从离开的地方开始执行而不是从头开始。
生成器表达式:类似于列表推导式,但生成器是按需取结果,而不是一次性来构建一个结果列表。
缺点:只能遍历一次,最后一次会报异常
#首先拉取jenkins镜像
docker pull jenkins/jenkins
#以root身份运行镜像
docker run -d -uroot -p 9077:8080 -p 50000:50000 --name jenkins -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime jenkins/jenkins
#通过ip加端口号进入jenkins 127.0.0.1:9077
#切换进入docker镜像
docker exec -it d1949b69ce49 bash
#编辑密码所在文件 获取密码
cat /var/jenkins_home/secrets/initialAdminPassword
安装推荐的插件
安装必备的插件,在jenkins插件中搜索
Generic Webhook Trigger
GitLab
#服务器安装expect
apt install expect
在jenkins搜索栏输入Manage搜索,选择系统管理
需要在Jenkins系统设置中取消勾选“Enable authentication for '/project' end-point”
新建一个jenkins任务,选择第一个
进入任务配置,构建触发器选择入下图所示
构建步骤输入以下脚本
#!/usr/bin/expect
#web服务器
spawn ssh root@127.0.0.1
expect {
"(yes/no*" {send "yes\r";exp_continue}
"password:" {send "pwd\r";exp_continue}
eof
}
expect "*]$"
send "su root\n"
expect "*password"
send "pwd\n"
expect "*]$"
send "cd /var/www/project\n"
expect "*]#"
send "git pull\n"
expect "*]#"
send "exit\n"
expect "*]#"
多台服务器配置多个脚本链接,保存
登录你的gitlab
添加插件
# 取值必须values
query_data = Model.objects.filter().values('id')
# 返回必须转一次list
return JsonResponse(list(data),safe=False)
感觉django没有吹得那么好,orm转个json这么费劲
import copy
from prettyprinter import cpprint as p
campaign_bigo_no = campaign_bigo = {
'cpm': 0,
}
# 默认是传引用
campaign_bigo['cpm'] = 1
p(campaign_bigo_no)
p(campaign_bigo)
# 传值
campaign_bigo_no = copy.deepcopy(campaign_bigo)
campaign_bigo['cpm'] = 1
p(campaign_bigo_no)
p(campaign_bigo)
print('%.4f' % 1.22761)
1.2276
print('%.3f' % 1.2276)
1.228
print('%.2f' % 1.2276)
1.23
linux下python版本升级
1、下载python版本
wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz
2、编译,防止出现安装错误
yum install gcc-c++ gcc make cmake zlib-devel bzip2-devel openssl-devel ncurse-devel -y
3、3.7版本需要一个新的包libffi-devel,安装此包之后再次进行编译安装即可
yum install libffi-devel -y
4、解压与创建
tar -zxvf Python-3.7.2.tar.xz
#进入python3.7.2目录
cd Python-3.7.2
#创建目录
mkdir -p /usr/local/python3
#配置(指定安装目录)
./configure --prefix=/usr/local/python3 --enable-optimizations
5、编译与安装
make && make install ,使用sudo命令时,记得make 和make install 都要有
6、更换版本,创建新版本Python3.7的软链接
ln -s /usr/local/python3/bin/python3.7 /usr/bin/python
先看下软链接,系统版本多的话,有可能会创建软链接失败,我就失败了。
7、查看是否成功
python -V ,能看到新的版本证明成功
优先安装 uwsgi 用于接受nginx转发来的请求
pip3 install uwsgi
在项目目录下新建 uwsgi.ini
[uwsgi]
socket=127.0.0.1:9090 #接受nginx转发来的请求
chdir=/Applications/MAMP/htdocs/python_all_rivers #项目目录
module=reptlie.wsgi:application #wsgi文件目录
max-requests=5000 #最大请求数
daemonize=/var/log/yourproject.log #log文件地址 启动失败等日志都在里面
启动 uwsgi 切换到uwsgi.ini文件目录 载入配置方式启动
uwsgi --ini uwsgi.ini
查看是否启动
ps aux|grep uwsgi
root 295550 2.2 0.9 50184 38108 ? S 14:48 0:00 uwsgi --ini reptlie/uwsgi.ini
root 295554 0.0 0.0 9032 728 pts/0 S+ 14:48 0:00 grep --color=auto uwsgi
如需关闭 kill掉当前uwsgi pid
nginx配置
server {
listen 80;
server_name python.allreviers.com;#你自己的域名
location / {
uwsgi_pass 127.0.0.1:9090; #必须和uwsgi中的设置一致
include uwsgi_params;
index index.html index.htm;
client_max_body_size 35m;
}
}
重启nginx即可
注:每次修改python文件后都需要kill掉 uwsgi 重新载入配置启动
如果是crontab 执行 python selenium 的话 会出现一个因为环境变量引起的报错
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
解决方案是命令行改成
export DISPLAY=:0.0 && /usr/local/bin/python3.7 /srv/project/manage.py report >> /var/log/csj_login.log # django-cronjobs for priject
在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0:0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上