Django项目实战总结二

  • 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值