-
mkdown语法概要
**这是加粗的文字**
*这是倾斜的文字*`
>这是引用的内容
---分隔线或***
![image]
-=* 一个空格表示无序列表
*111
*222
*333
1.数字加点有序列表
表格
表头|表头|表头
---|:--:|---:
内容|内容|内容
内容|内容|内容
'代码 '
'''多行代码
'''
-
django总结
1.正则的分组匹配,读取结果
uuid_find = re.search(uuid_patterns, line)
uuid = uuid_find.group('uuid')
uuid_find.group()
uuid_find.groups()
正则或者,forms.RegexField(r'(^[a-z]+)|(bcache[0-9]+)',min_length=3)
设置@method_decorator(ensure_csrf_cookie)保证服务器应答的cookie中一定带有csrftoken
//获取csrftoken
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
beforeSend: function (xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
},
#页面跳转为何cookie添加多次
#跨页面并保存原先页面的两个方式
1,变量放在cookie里面
2.变量放入session里面
3.参数放在url里面,新的url再带回来;这样写也可以解决href有动态参数的问题
<script language="JavaScript">
$(".cluster_url").on("click", function () {
window.location.href='{% url 'Cluster:Index' %}'+get_cur_server();
});
#对类函数进行装饰,并使用self的属性
def request_time(func):
def wrapper(self, *args, **kwargs):
start = time.time()
res = func(self, *args, **kwargs)
end = time.time()
print '{}() running time is: {}'.format(self.__class__.__name__, end - start)
print end - start
return res
return wrapper
3、put和delete方法参数处理
from django.http import QueryDict
form=ManagerPostForm(QueryDict(request.body))
4、设置了content_type="application/json",前端才会把json_str当成json转换
5、pycharm批量正则替换,cleaned_data\["(.*?)"\],,self.get_argument\("$1"\)
-
tornado总结
1.csrf字段
xhr.setRequestHeader("X-Xsrftoken", getCookie2('_xsrf'));
1、tornado同步改成异步写法
a、main.py里面 增加异步任务池:config['async_do'] = concurrent.futures.ThreadPoolExecutor(config['max_threads_num'])
b、视图函数需要异步的加上@gen.coroutine , 耗时操作放在yield async_do(exec, cmd),async_do是从上面配置读的全局线程池
2、或取参数中的数组
self_get_arguments("reload[]")
3、tornado服务器下用ajax请求一个超长时间的请求,没有返回就进入error或者complete回调里面了
改成同步也是一样,都是大概在18分钟(1080s)左右断开,ajax用异步timeout也没有用;无奈只能后台缓存结果,前台用ajax轮询的方式实现(这种方式本身应该更主流,同步web服务器也可以使用
4、tornado协程里面调普通函数则直接返回,raise gen.Return(response.body) 代替return;线程池里面不要用yield 协程,会使并发的多线程不一起返回,线程池里面应该是阻塞的本身耗时的应用
-
python总结
1、obj.func = types.MethodType(func, obj) #动态给类变量加方法 import types
2、 #如果需要多个分割符,用re.split
str.strip() #默认\r,\n, \t,''都包含
4、python解决字典中的值是列表问题的方法
d1.setdefault('bob_hu',[]).append(2)//原理是setdefault是key不在字典中的时候,将键和默认值设置进去;否则调用get方法
d1.setdefault('name1',{})[key]=value
4、python不能断点到global声明语句
5 、logger日志
logger = logging.getLogger('main')
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler('/opt/wizard/main.log')
fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter('[%(asctime)s -%(levelname)s -%(filename)s:%(lineno)d -%(funcName)s]:%(message)s'))
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(logging.Formatter('[%(asctime)s -%(levelname)s -%(filename)s:%(lineno)d -%(funcName)s]:%(message)s'))
logger.addHandler(fh)
logger.addHandler(ch)
6、时间datetime
dt_start=datetime.datetime.strptime(str(datetime.datetime.now().date())+'01:00', '%Y-%m-%d%H:%M')
dt_end=datetime.datetime.strptime(str(datetime.datetime.now().date())+'03:00', '%Y-%m-%d%H:%M')
dt_now=datetime.datetime.now()
dt_start<dt_now<dt_end
7、字符格式python内部字符格式是unicode,而系统可能是utf-8,读取系统字符串要str.encode('utf-8'),python再输入到日志文件时候要增加参数 encoding=‘utf-8’,但是列表里面的中文字符串不能被解析; utf-8字符串是这样的‘\xe6\xb2\xa1\xe6\x9c\x89’,unicode字符串是‘u'\u6ca1\u6709’这样的,可以对bytes(utf8_str).decode('utf-8')转成unicode字符;
8、路径通配符 from glob import glob,glob列出所有可能路径,一般选第一个;如果是shell则直接用通配符*
9、socket
import socket
server=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1',8111))
server.listen(5)
conn, addr= server.accept()
conn.send('{"status": "running","progress": "20","log_message": "xxxx20"}')
try:
s.settimeout(2000)
except socket.timeout:
pass
10、解决跨线程使用sqlalchemy session的问题
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
session_factory = sessionmaker(bind=some_engine)
Session = scoped_session(session_factory)
11、sqlalchemy工具中的批量更新数据
session.query(E3cLog).filter(E3cLog.read == 0).update({E3cLog.read:1}, synchronize_session=False)
query().filter().with_lockmode('update')写锁
12、格式化显示,字典或者jsonjson.dumps(new,indent=4, sort_keys=True)
13、用withlock,代替lock.aquire,release
14、生成器表达式是可迭代的,反之不成立
next((i for i in range(10) if not i%4), -1) #找到第一个符合条件的数,取一次生成器
for block in iter(partial(f.read, 1024), ''): #生成不出来,退出
res.append(block)
15、strip(".rpm")去掉结尾的.rpm使用错误,可改成下面
rstrip("rpm").rstrip("."),split(".rpm")[0]
-
git总结
#先建立本地仓库
git init
git status
git add * -v
git status
git commit -a 并输入说明
git clone /opt/edu /opt/gitstore/edu
#远端建立非裸仓库:
cd /opt/gitstore/edu
git config --bool core.bare false
.git/config
[receive]
denyCurrentBranch=ignore
git remote -v 查看远端位置
git remote add master /opt/gitstore/edu #添加远端分支
git push -u master master
git push --set-upstream master master #设置远端分支为上
git pull origin master(远端,本端)
git push origin master(远端,本端)
git reset --hard #远端使用后才能看到提交的文件
find . -name ".git" | xargs rm -Rf
#从库上下载代码
1. git pull (一句命令搞定)
git branch 看看分支
git checkout aaa 切换分支aaa
git branch aaa 创建aaa分支
git checkout -b aaa
git log
git diff HEAD~2 --q
git branch -r 查看远端分支
$ git reset --hard HEAD^ 回退到上个版本
$ git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前
$ git reset --hard commit_id 退到/进到 指定commit的sha码
#
游
git tag v0.0.1.11
-
shell命令
#find, while, awk
find /var/lib/ceph/osd -name journal | while read line ; do ls -lih $line ; done|awk -F "->" '{print $2}'
find /dir -name "*.pyc" | xargs rm -rf
sed -i '/\/var\/lib\/ceph\/osd\/ceph-{}/d' /etc/fstab //d表示删除,替换则换成字符串
while read line;do echo $line;cat /sys/class/net/$line/speed 2>&1;done //将标准错误也输出到标准输出,解决处理结果数据混乱
2>&1 标准错误输出到标准输出
-
service开机服务
[Unit]
Description=e3cwizard_glusterfs_mount
After=network.target
Requires=network.target
[Service]
ExecStart=/usr/bin/python /opt/wizard/shell/automount.py $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
#Restart=on-failure
Restart=always
RestartSec=3s
[Install]
WantedBy=multi-user.target
service文件如上,可以在另一个程序里面启动起来,或者在rpm安装中指定服务操作
\cp /opt/wizard/shell/e3cwizard_glusterfs_mount.service /usr/lib/systemd/system/ #拷贝到对应系统路径
chmod a+x /usr/lib/systemd/system/e3cwizard_glusterfs_mount.service
chmod a+x /opt/wizard/shell/automount.py
systemctl enable e3cwizard_glusterfs_mount.service #激活服务
systemctl start e3cwizard_glusterfs_mount.service
局域网服务访问不了tornado防火墙没关,iptables firewalld