string_helper.py是字符串操作包,主要对字符串进行检查、过滤和截取等处理。

 #!/usr/bin/evn python
# coding=utf-8 import re def check_string(text, pattern):
"""
检查字符串是否符合指定规则
:param text: 需要检查的字符串
:param pattern: 正式表达式,如:'^[a-zA-Z]+$'
:return: 含有指定字符时返回真,否则为假
"""
match = re.search(pattern, text)
if match:
return True
else:
return False def is_email(text):
"""
验证字符串是否是email
:param text: 需要检查的字符串
:return: 符合返回True,不符合返回False
"""
return check_string(text, '[^\._-][\w\.-]+@(?:[A-Za-z0-9]+\.)+[A-Za-z]+$') def is_phone(text):
"""
验证字符串是否是固定电话
:param text: 需要检查的字符串
:return: 符合返回True,不符合返回False
"""
return check_string(text, '\(?0\d{2,3}[) -]?\d{7,8}$') def is_mobile(text):
"""
验证字符串是否是手机号码
:param text: 需要检查的字符串
:return: 符合返回True,不符合返回False
"""
return check_string(text, '^1[3578]\d{9}$|^147\d{8}$') def is_letters(text):
"""
验证字符串是否全是字母
:param text: 需要检查的字符串
:return: 符合返回True,不符合返回False
"""
return check_string(text, '^[a-zA-Z]+$') def is_idcard(text):
"""
验证字符串是否是身份证号码
:param text: 需要检查的字符串
:return: 格式正确返回True,错误返回False
"""
ic = IdentityCard()
return ic.check(text.upper()) def filter_str(text, filter='\||<|>|&|%|~|\^|;|\''):
"""
滤掉字符串
:param text: 需要过滤的字符串
:param filter: 过滤内容(正则表达式)
:return: 去除特殊字符后的字符串
"""
if text:
return re.subn(filter, '', text)[0]
else:
return '' def filter_tags(htmlstr):
"""
过滤HTML中的标签
:param htmlstr: 要过滤的内容
:return:
"""
re_cdata=re.compile('//<!\[CDATA\[[^>]*//\]\]>',re.I) #匹配CDATA
re_script=re.compile('<\s*script[^>]*>[^<]*<\s*/\s*script\s*>',re.I)#Script
re_style=re.compile('<\s*style[^>]*>[^<]*<\s*/\s*style\s*>',re.I)#style
re_br=re.compile('<br\s*?/?>')#处理换行
re_h=re.compile('</?\w+[^>]*>')#HTML标签
re_comment=re.compile('<!--[^>]*-->')#HTML注释
s=re_cdata.sub('',htmlstr)#去掉CDATA
s=re_script.sub('',s) #去掉SCRIPT
s=re_style.sub('',s)#去掉style
s=re_br.sub('\n',s)#将br转换为换行
s=re_h.sub('',s) #去掉HTML 标签
s=re_comment.sub('',s)#去掉HTML注释
#去掉多余的空行
blank_line=re.compile('\n+')
s=blank_line.sub('\n',s)
s=replaceCharEntity(s)#替换实体
return s def replaceCharEntity(htmlstr):
"""
替换常用HTML字符
:param htmlstr: 要替换的字符
:return:
"""
CHAR_ENTITIES={'nbsp':' ','':' ',
'lt':'<','':'<',
'gt':'>','':'>',
'amp':'&','':'&',
'quot':'"','':'"',}
re_charEntity=re.compile(r'&#?(?P<name>\w+);')
sz=re_charEntity.search(htmlstr)
while sz:
entity=sz.group()#entity全称,如&gt;
key=sz.group('name')#去除&;后entity,如&gt;为gt
try:
htmlstr=re_charEntity.sub(CHAR_ENTITIES[key],htmlstr,1)
sz=re_charEntity.search(htmlstr)
except KeyError:
#以空串代替
htmlstr=re_charEntity.sub('',htmlstr,1)
sz=re_charEntity.search(htmlstr)
return htmlstr def string(text, is_return_null=False):
"""
sql字符串拼接专用函数
会在字符串两边添加'单撇号,用于生成数据库sql语句
:param text: 需要添加'的字符串
:param is_return_null: 是否返回null,是的话在字符串为空时返回null,否则返回''
:return:
"""
if not text is None and text != '':
return "'" + str(text) + "'"
elif not is_return_null:
return "''"
else:
return "null" def cut_str(text, length):
"""
将字符串截取指定长度
:param text: 需要进行截取的字符串
:param length: 字符串保留的长度
:return:
"""
if not text or not isinstance(text, str):
return text
tem = ''
try:
tem = text.decode('utf8')
except:
pass
if not tem or tem == '':
try:
tem = text[0:length]
except:
tem = text
return tem[0:length] class IdentityCard:
"""身份证号码验证类""" def __init__(self):
self.__Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
self.__Ti = ['', '', 'X', '', '', '', '', '', '', '', ''] def calculate(self, code):
"""计算校验位"""
sum = 0
for i in range(17):
sum += int(code[i]) * self.__Wi[i]
return self.__Ti[sum % 11] def check(self, code):
"""检查输入的号码是否正确""" if (len(code) != 18):
return False
if self.calculate(code) != code[17]:
return False return True

  check_string()函数主要是用来检查字符串是否符合指定规则用的,它被is_开头的各个函数所调用。is_开头的几个函数怎么使用,请看测试用例。

#!/usr/bin/evn python
# coding=utf-8 import unittest
from common import string_helper class StringHelperTest(unittest.TestCase):
"""字符串操作包测试类""" def setUp(self):
"""初始化测试环境"""
print('------ini------') def tearDown(self):
"""清理测试环境"""
print('------clear------') def test_is_email(self):
self.assertEqual(string_helper.is_email('aaaaa'), False)
self.assertEqual(string_helper.is_email('aaaa@xxx.com'), True)
self.assertEqual(string_helper.is_email('xxx@xxx.com.xx'), True) def test_is_phone(self):
self.assertEqual(string_helper.is_phone('aaaaa'), False)
self.assertEqual(string_helper.is_phone(''), False)
self.assertEqual(string_helper.is_phone(''), True)
self.assertEqual(string_helper.is_phone('010-123456'), False)
self.assertEqual(string_helper.is_phone('010-12345678'), True)
self.assertEqual(string_helper.is_phone('010 12345678'), True)
self.assertEqual(string_helper.is_phone('0757 12345678'), True) def test_is_mobile(self):
self.assertEqual(string_helper.is_mobile('aaaaa'), False)
self.assertEqual(string_helper.is_mobile(''), False)
self.assertEqual(string_helper.is_mobile(''), True)
self.assertEqual(string_helper.is_mobile(''), False) def test_is_letters(self):
self.assertEqual(string_helper.is_letters(''), False)
self.assertEqual(string_helper.is_letters('1ds2f12sdf'), False)
self.assertEqual(string_helper.is_letters('absbdsf'), True)
self.assertEqual(string_helper.is_letters('ADdfFSds'), True) def test_is_idcard(self):
self.assertEqual(string_helper.is_idcard(''), False)
self.assertEqual(string_helper.is_idcard('aaaaaaaaa'), False)
self.assertEqual(string_helper.is_idcard(''), False)
self.assertEqual(string_helper.is_idcard('34022319000821047X'), True) if __name__ == '__main__':
unittest.main()

  filter_str()函数用来将指定的特殊字符全部过滤掉

    def test_filter_str(self):
print(string_helper.filter_str('aaa'))
print(string_helper.filter_str('aaa<>&\''))
print(string_helper.filter_str('aaa<|>|&|%|~|^|;|\''))

  执行结果:

------ini------
aaa
aaa
aaa
------clear------

  filter_tags函数将代码上的全部html标签过滤掉(网上找到来的代码)

    def test_filter_tags(self):
print(string_helper.filter_tags('<html><body><b>aaa</b></body></html>'))

  执行结果:

------ini------
aaa
------clear------

  string()函数主要用于拼接sql语句用的,用于在字符串的两边添加 ' 这个单撇号,如果is_return_null这个参数为True时,输入内容为空则返回null字符

    def test_string(self):
print(string_helper.string(-1))
print(string_helper.string({'test': 'abc'}))
print(string_helper.string(''))
print(string_helper.string('aaa'))
print(string_helper.string('', True))

  执行结果:(使用print打印到控制台的结果,字符串不输出""双引号,实际上存储到变量中时,下面内容都会加上双引号)

------ini------
'-1'
'{'test': 'abc'}'
''
'aaa'
null
------clear------

  cut_str()函数会将输入的字符串按指定长度截取

    def test_cut_str(self):
print(string_helper.cut_str('', 5))
print(string_helper.cut_str('aaa', 5))
print(string_helper.cut_str('将字符串截取指定长度', 5))
print(string_helper.cut_str('aa将字符串截取指定长度', 5))

  执行结果:

------ini------

aaa
将字符串截
aa将字符
------clear------

  verify_helper.py是验证码生成包,调用比较简单,这里就不再详细说明,到后面章节会有详细例子。

  web_helper.py是web操作包,主要是对web服务进行相关处理。它需要启动web服务后基于web服务下才行进行测试操作,不能直接运行测试用例进行测试,大家可以先了解一下里面函数的功能。

 #!/usr/bin/evn python
# coding=utf-8 import json
import re
import urllib.parse
from bottle import response, HTTPResponse, request
from common import json_helper def get_ip():
"""获取当前客户端ip"""
try:
ip = request.remote_addr
except:
ip = ''
if not ip:
try:
ip = request.environ.get('REMOTE_ADDR')
except:
pass
return ip def get_session():
"""获取当前用户session"""
return request.environ.get('beaker.session') def return_msg(state, msg, data={}):
"""
接口输出数据到客户端
:param state: 状态码(公共参数,-1=出错,0=正常)
:param msg: 说明信息(公共参数)
:param data: 数据字典
:return: 返回组合后的json字符串
"""
msg = {
"state": state,
"msg": msg,
"data": data
}
# 将字典转为字符串输出
message = json.dumps(msg, cls=json_helper.CJsonEncoder)
return message def return_raise(msg=''):
"""
直接终止程序,返回结果给客户端
修改bottle的异常状态码和异常返回body内容
:param msg: 输出内容
:return: 输出字符串
"""
res = response.copy(cls=HTTPResponse)
res.status = 200
res.body = str(msg)
raise res def get_form(args_name, msg, is_strip=True, lenght=0, is_check_null=True, notify_msg='', is_check_special_char=True):
"""
获取客户端Form方式提交的参数值
:param args_name: 参数名
:param msg: 参数中文名称
:param is_strip: 字符串两端是否自动去除空格
:param lenght: 参数长度最大限制,0为不限制
:param is_check_null: 是否要求进行非空检测,True:当参数值为空时,返回错误提示客户端不能为空
:param notify_msg: 非必填项,当参数值为空时,默认返回“xxx 不允许为空”这个提示,如果这个变量有值,则直接返回这个变量值,即定制好的错误提示
:param is_check_special_char: 判断参数值是否含有特殊字符,True=默认会对特殊字符进行判断,False=不做判断处理,需要手动对接收参数值进行过滤处理,去除危险字符
:return: 返回处理后的参数
"""
args_value = ''
if request.method.upper() in ('POST', 'PUT', 'DELETE'):
try:
if request.json:
args_value = str(request.json.get(args_name, '')).strip()
else:
args_value = str(request.forms.get(args_name, '')).strip()
except:
args_value = str(request.forms.get(args_name, '')).strip()
if not args_value:
args_value = str(request.POST.get(args_name, '')).strip() return __request_handle(args_value, msg, is_strip, lenght, is_check_null, notify_msg, is_check_special_char) def get_query(args_name, msg, is_strip=True, lenght=0, is_check_null=True, notify_msg='', is_check_special_char=True):
"""
获取客户端Get方式提交的参数值
:param args_name: 参数名
:param msg: 参数中文名称
:param is_strip: 字符串两端是否自动去除空格
:param lenght: 参数长度最大限制,0为不限制
:param is_check_null: 是否要求进行非空检测,True:当参数值为空时,返回错误提示客户端不能为空
:param notify_msg: 非必填项,当参数值为空时,默认返回“xxx 不允许为空”这个提示,如果这个变量有值,则直接返回这个变量值,即定制好的错误提示
:param is_check_special_char: 判断参数值是否含有特殊字符,True=默认会对特殊字符进行判断,False=不做判断处理,需要手动对接收参数值进行过滤处理,去除危险字符
:return: 返回处理后的参数
"""
return __request_handle(__get(args_name), msg, is_strip, lenght, is_check_null, notify_msg, is_check_special_char) def __get(args_name):
"""
从get请求中提取请求值(直接使用python的GET获取参数时,有时转换编码时会出现乱码,所以还是直接采用截取后直接转码比较好)
例如:http://127.0.0.1:81/manage/manager/?page=0&rows=20&sidx=id&sord=desc&name=%E5%BC%A0%E4%B8%89
:param args_name: 要取值的参数名:name
:return: 截取的编码值:%E5%BC%A0%E4%B8%89
"""
get = '?' + request.query_string
start_index = get.find('&' + args_name + '=')
if start_index == -1:
start_index = get.find('?' + args_name + '=')
if start_index == -1:
return ''
end_index = get.find('&', start_index + 1)
if end_index == -1:
return get[start_index + len(args_name + '=') + 1:]
else:
return get[start_index + len(args_name + '=') + 1:end_index] def __request_handle(args_value, msg, is_strip, lenght, is_check_null, notify_msg, is_check_special_char):
"""
对客户端提交的参数进行各种判断与处理
:param args_value: 参数值
:param msg: 参数中文名称
:param is_strip: 字符串两端是否自动去除空格
:param lenght: 参数长度最大限制,0为不限制
:param is_check_null: 是否要求进行非空检测,True:当参数值为空时,返回错误提示客户端不能为空
:param notify_msg: 非必填项,当参数值为空时,默认返回“xxx 不允许为空”这个提示,如果这个变量有值,则直接返回这个变量值,即定制好的错误提示
:param is_check_special_char: 判断参数值是否含有特殊字符,True=默认会对特殊字符进行判断,False=不做判断处理,需要手动对接收参数值进行过滤处理,去除危险字符
:return: 返回处理后的参数
"""
# 如果参数为空,则返回该参数不允许为空的json串给前端
if is_check_null and not args_value:
if notify_msg:
return_raise(return_msg(-1, notify_msg))
else:
return_raise(return_msg(-1, "%s 不允许为空" % msg))
elif not args_value:
return args_value # 把utf-8的url编码解码成中文字符
try:
args_value = urllib.parse.unquote(args_value)
except:
pass # 替换特殊的空字符
args_value = args_value.replace(u'\xa0', u'')
# 是否字符串两端去空格
if is_strip:
args_value = args_value.strip()
# 判断是否超出指定长度
if lenght > 0 and len(args_value) > lenght:
return_raise(return_msg(-1, "%s 超出 %s 个字符" % (msg, lenght))) # 如果参数含有特殊字符,则返回该参数不允许有特殊字符的json串给前端
if is_check_special_char:
re_result = re.search('\||<|>|&|%|~|\^|;|\'', args_value)
if re_result:
return_raise(return_msg(-1, "%s 含有特殊字符,请重新输入" % msg))
return args_value

  get_ip():获取当前客户端ip地址

  get_session():获取当前客户的session

  return_msg():生成统一的返回给客户端的内容(json格式)。输出内容有state:状态码,一般使用-1表示出现错误,0表示正常,可以根据需要进行修改或添加更多的状态码;msg:状态文说明,出错时返回出错内容提示;data:需要返回的其他内容全部会放在这里。

  return_raise():当调用这个函数时,会直接终于代码的执行,直接将结果输出到客户端。

  get_form():获取客户端Form方式提交的参数值

  get_query():获取客户端Get方式提交的参数值

  本文对应的源码下载

版权声明:本文原创发表于 博客园,作者为 AllEmpty 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

python开发QQ群:669058475(本群已满)、733466321(可以加2群)    作者博客:http://www.cnblogs.com/EmptyFS/

我的第一个python web开发框架(13)——工具函数包说明(四)的更多相关文章

  1. 我的第一个python web开发框架(41)——总结

    我的第一个python web开发框架系列博文从17年6.7月份开始写(存了近十章稿留到9月份才开始发布),到今天结束,一年多时间,想想真不容易啊. 整个过程断断续续,中间有段时间由于工作繁忙停了好长 ...

  2. 我的第一个python web开发框架(14)——后台管理系统登录功能

    接下来正式进入网站的功能开发.要完成后台管理系统登录功能,通过查看登录页面,我们可以了解到,我们需要编写验证码图片获取接口和登录处理接口,然后在登录页面的HTML上编写AJAX. 在进行接口开发之前, ...

  3. 我的第一个python web开发框架(10)——工具函数包说明(一)

    PS:原先是想直接进入功能开发,要用到什么函数时再创建,这样也容易熟悉每个函数的由来和使用方法,但考虑到这样操作,到时会经常在不同文件间切换,不好描述,容易造成混乱,所以还是使用函数库这种方式来说明. ...

  4. 我的第一个python web开发框架(5)——开发前准备工作(了解编码前需要知道的一些常识)

    中午吃饭时间到了,小白赶紧向老菜坐的位置走过去. 小白:老大,中午请你吃饭. 老菜:哈哈...又遇到问题了吧,这次得狠狠宰你一顿才行. 小白:行行行,只要您赏脸,米饭任吃,嘻嘻,我们边走边聊. ... ...

  5. 我的第一个python web开发框架(1)——前言

    由于之前经验不是很丰富,写的C#系统太过复杂,所以一直想重写,但学的越多越觉得自己懂的越少,越觉的底气不足.所以一直不敢动手,在内心深处对自己讲,要静下心来认真学习,继续沉淀沉淀.这两年多以来找各种机 ...

  6. 我的第一个python web开发框架(3)——怎么开始?

    小白与小美公司经过几次接触商谈,好不容易将外包签订了下来,准备开始大干一场.不过小白由于没有太多的项目经验,学过python懂得python的基本语法,在公司跟着大家做过简单功能,另外还会一些HTML ...

  7. 我的第一个python web开发框架(22)——一个安全小事故

    在周末的一个早上,小白还在做着美梦,就收到了小美的连环追魂call,电话一直响个不停. 小白打着哈欠拿起电话:早上好美女. 小美:出事了出事了,我们公司网站一早访问是一片空白,什么内容都没有了,你赶急 ...

  8. 我的第一个python web开发框架(8)——项目结构与RESTful接口风格说明

    PS:再次说明一下,原本不想写的太啰嗦的,可之前那个系列发布后发现,好多朋友都想马上拿到代码立即能上手开发自己的项目,对代码结构.基础常识.分类目录与文件功能结构.常用函数......等等什么都不懂, ...

  9. 我的第一个python web开发框架(9)——目录与配置说明

    和老大聊完后,小白回家接收到相关工具函数包后,就按要求开始干活,首先要做的是熟悉配置参数和了解工具函数有哪些实用的工具. 由于这个项目比较简单,所以不用创建那么多分类,只需要api.common.co ...

  10. 我的第一个python web开发框架(17)——产品管理

    这是后台管理系统最后一个功能,产品管理,它的接口与页面功能与上一章差不多. 获取产品列表接口 @get('/api/product/') def callback(): ""&qu ...

随机推荐

  1. Java课程设计--GUI密码生成器201521123033

    1.团队课程设计题目 基于GUI的密码生成器 团队博客链接 2.个人负责模块 (1)界面设计 (2)部分错误输入的提示 (3)一键复制密码功能的实现 3.个人代码的提交记录截图 4.个人代码展示以及代 ...

  2. 201521123106 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前 ...

  3. 201521123001 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 答: 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需 ...

  4. 【C# in depth 第三版】温故而知新(2)

    声明 本文欢迎转载,原文地址:http://www.cnblogs.com/DjlNet/p/7522869.html 前言 我们接了上一篇的未完待续,接着我们的划重点之行.....哈哈 理解:LIN ...

  5. JavaEE error整理(不断更新)

    该文章用于整理开发中遇到的一些错误,及解决方法,不断整理更新. 1. 缺包异常 异常1:java.lang.NoClassDefFoundError: org/apache/commons/loggi ...

  6. eclipse复制到IDEA中文不匹配,编译失败

    今天使用把eclipse的包复制到Intellij Idea下,结果在编译的时候,它说我的数据是GBK,而Idea默认的数据是UTF-8,因此出错了... 解决:在项目中直接把对象的encoding. ...

  7. 一个JavaScript触发器插件,可通过指定频次、指定时间内触发指定的处理函数

    js-trigger是一个JavaScript触发器插件,可通过指定频次.指定时间内触发指定的处理函数 Tango<tanwei_yx@126.com> 特性 支持AMD/CMD/Comm ...

  8. Download the Hibernate Tools

    首先去官网上下载最新版本的Hibernate Tools JBoss Tools 4.5.0.Final Requirements: Java 8 and Eclipse Oxygen 4.7 有 4 ...

  9. [js高手之路] es6系列教程 - Set详解与抽奖程序应用实战

    我们还是从一些现有的需求和问题出发,为什么会有set,他的存在是为了解决什么问题? 我们看一个这样的例子,为一个对象添加键值对 var obj = Object.create( null ); obj ...

  10. POJ 3923 Ugly Windows(——考察思维缜密性的模拟题)

    题目链接: http://poj.org/problem?id=3923 题意描述: 输入一个n*m的屏幕 该屏幕内有至少一个对话框(每个对话框都有对应的字母表示) 判断并输出该屏幕内处于最表层的对话 ...