近期笔记
网商工具平台 将近期Coding时需要谷歌的点,记录一下,主要是 Python Flask Jquery 方面
Python
Python 正则
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
正则表达式实例
- 字符类
实例 | 描述 |
---|---|
[Pp]ython | 匹配 “Python” 或 “python” |
rub[ye] | 匹配 “ruby” 或 “rube” |
[aeiou] | 匹配中括号内的任意一个字母 |
[0-9] | 匹配任何数字。类似于 [0123456789] |
[a-z] | 匹配任何小写字母 |
[A-Z] | 匹配任何大写字母 |
[a-zA-Z0-9] | 匹配任何字母及数字 |
[^aeiou] | 除了aeiou字母以外的所有字符 |
[^0-9] | 匹配除了数字外的字符 |
- 特殊字符类
实例 | 描述 |
---|---|
. | 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式 |
\d | 匹配一个数字字符。等价于 [0-9] |
\D | 匹配一个非数字字符。等价于 [^0-9] |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v] |
\w | 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’ |
\W 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’ |
re.match && re.search
re.match(pattern, string, flags=0)
re.search(pattern, string, flags=0)
import re
line = 'Doge is a friend of mine and we are good friends.'
dog = re.search('friend', line)
print(dog.group())
dogs = re.search(r'(.*) and (.*)', line)
print(dogs.groups())
cat = re.match('Doge', line)
print(cat.group())
cats = re.match(r'(.*) are (.*)', line)
print(cats.groups())
output:
friend
('Doge is a friend of mine', 'we are good friends.')
Doge
('Doge is a friend of mine and we', 'good friends.')
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
csv
csv.reader(csvfile, dialect='excel', **fmtparams)
按列读取CSV文件,返回值当做一个大list
>>> import csv, os
>>> os.chdir('/Users/fish/Git/test/')
>>> content = csv.reader(open('test.csv', encoding = 'utf-8'))
>>> for line in content:
... print(line)
...
['GREAL', 'Great Lakes Food Market', 'Howard Snyder', 'Marketing Manager', '(503) 555-7555', '2732 Baker Blvd.', 'Eugene', 'OR', '97403', 'USA']
['HUNGC', 'Hungry Coyote Import Store', 'Yoshi Latimer', 'Sales Representative', '(503) 555-6874', 'City Center Plaza 516 Main St.', 'Elgin', 'OR', '97827', 'USA']
['LAZYK', 'Lazy K Kountry Store', 'John Steel', 'Marketing Manager', '(509) 555-7969', '12 Orchestra Terrace', 'Walla Walla', 'WA', '99362', 'USA']
['LETSS', "Let's Stop N Shop", 'Jaime Yorres', 'Owner', '(415) 555-5938', '87 Polk St. Suite 5', 'San Francisco', 'CA', '94117', 'USA']
config
和csv不同,一般系统的配置文件就是 K-V 表,python 中用 configparser 模块来处理。 比如系统system.config 文件如下:
[dev]
traceid=sh /home/log/tools/traceidCheck/whereru.sh
sql=sh /home/log/tools/traceidCheck/exeSql.sh
traceidQuick=sh /home/log/tools/traceidCheck/whereru_fast.sh on
[test]
sit_status = cat /Users/fish/Git/test/sit.txt
system_detail = cat /Users/fish/Git/test/dec.py
class Config:
def __init__(self, path):
self.config = configparser.ConfigParser()
self.config.read(path + '/config/command.config')
def get_config(self, session, name):
return self.config[session][name]
比如要获取 dev 配置下 sql 命令对应的 value, 用 config[‘dev’][‘sql’] 来获取。
Database sqlite3
python 自带了个 “DB”, sqlite3 中的 DB 其实就是个支持 sql 命令的小文件。 和 PHP 等其他语言连接 DB 差不多,有个 “游标” 的概念。简单操作如下:
class DB:
def __init__(self, file):
self.db= file
def executeDB(self, sql):
conn = sqlite3.connect(self.db)
cur = conn.cursor()
try:
print('Executing command: ' + sql)
cur.execute(sql)
conn.commit()
output = cur.fetchall()
return output
except:
print('Error executing sql: %s' % sql)
Bootstrap
Jquery
元素选取:
- 直接选取
$('div')
- #id 选择
$('#divid')
- .class 选择
$('.active')
- 复杂的
$("p.intro")
$("p:first")
$('#serverTable tr');
事件操作
用的最多的还是 $('#id').click(...)
$("#executeButton").click(function () {
$.post("/submitExecute", {cmd: $('#executeCmd').val()}, function (data) {
$('#textOutput').text(data['contents']);
})
});
常见 DOM 事件:
鼠标事件 | 键盘事件 | 表单事件 | 文档/窗口事件 |
---|---|---|---|
click | keypress | submit | load |
dblclick | keydown | change | resize |
mouseenter | keyup | focus | scroll |
mouseleave | blur | unload |
元素绑定回车
$('#executeCmd').bind('keyup', function (event) {
if (event.keyCode == "13") {
$('#executeButton').click();
}
});
Ajax
$('#register').click(function () {
$.post('/register', {username: $('#username').val(), password: $('#password').val()},
function (data) {
alert(data);
window.location.reload();
});
});
获取页面Cookie
function getCookie(c_name) {
if (document.cookie.length > 0) {
c_start = document.cookie.indexOf(c_name + "=");
if (c_start != -1) {
c_start = c_start + c_name.length + 1;
c_end = document.cookie.indexOf(";", c_start);
if (c_end == -1) c_end = document.cookie.length;
return unescape(document.cookie.substring(c_start, c_end))
}
}
return ""
}
链路图 Gojs
画大饼图 Achart
其他
- 页面刷新
window.location.reload()
- 添加class
$('#id').addClass('active')
- 改变值
$('#id').text('xxxx')
- 改变href
$('#a').href('/')
- 显示、隐藏
$('#id').hide() $('#id').show()
Flask
Jinja2
中用于获取 py 文件传过来的值, , 是比较常用的属性。其实前端界面比较繁琐,需要一步步调试出来。
flask_login
账户系统,需要 pip install flask_login
来利用这个模块,非常方便。
import flask.ext.login as flask_login
login_manager = flask_login.LoginManager()
login_manager.init_app(app)
app.secret_key = 'super secret string'
@app.route('/login', methods=['GET', 'POST'])
def login():
users = getUsers(app.root_path + '/script/bank.db')
if flask.request.method == 'GET':
return render_template('login.html', flag='false')
try:
username = flask.request.form['username']
if flask.request.form['password'] == users[username]:
user = User()
user.id = username
flask_login.login_user(user, remember=True)
return flask.redirect(flask.url_for('sql'))
else:
return render_template('login.html', flag='true')
except:
return render_template('login.html', flag='true')
class User(flask_login.UserMixin):
pass
@login_manager.user_loader
def user_loader(username):
if username not in users:
return
user = User()
user.id = username
return user
@login_manager.request_loader
def request_loader(request):
username = request.form.get('username')
if username not in users:
return
user = User()
user.id = username
# user.is_authenticated = request.form['password'] == users[username]
return user
@login_manager.unauthorized_handler
def unauthorized_handler():
return flask.redirect(flask.url_for('login'))
在需要账户登录的界面, 添加 @flask_login.login_required
@app.route('/sql', methods=['get', 'post'])
@flask_login.login_required
def sql():
if request.method == 'POST':
traceid = request.form['traceid']
username = request.form['username']
gmt = time.ctime()
# filter sql, delete/select is not allowed
if 'delete' in traceid:
output = {'contents': '只能执行update/select命令'}
return jsonify(output)
# get system command on file command.config
config = Config(app.root_path)
cmd = config.get_config('default', 'sql') + ' "' + traceid + '"'
print(cmd)
output = os.popen(cmd)
# write sql to db
db = DB(app.root_path + '/script/bank.db')
db.executeDB('insert into sqlHistory values("%s", "%s", "%s")' % (username, traceid, gmt))
output = {'contents': output.read()}
return jsonify(output)
else:
db = DB(app.root_path + '/script/bank.db')
sqlHistory = db.executeDB('select * from sqlHistory order by gmt_modified desc limit 50')
output = ''
for sql in sqlHistory:
output = output + str(sql)[1:-1] + '\n'
return render_template('sql.html', sqlHistory=output)
参考资料
blog comments powered by Disqus
Published
04 November 2015