個人第一個python web開發框架(13)——工具函數包說明(四)

  string_helper.py是字符串操做包,主要對字符串進行檢查、過濾和截取等處理。html

  1 #!/usr/bin/evn python
  2 # coding=utf-8
  3 
  4 import re
  5 
  6 
  7 def check_string(text, pattern):
  8     """
  9     檢查字符串是否符合指定規則
 10     :param text: 須要檢查的字符串
 11     :param pattern: 正式表達式,如:'^[a-zA-Z]+$'
 12     :return: 含有指定字符時返回真,不然爲假
 13     """
 14     match = re.search(pattern, text)
 15     if match:
 16         return True
 17     else:
 18         return False
 19 
 20 
 21 def is_email(text):
 22     """
 23     驗證字符串是不是email
 24     :param text: 須要檢查的字符串
 25     :return: 符合返回True,不符合返回False
 26     """
 27     return check_string(text, '[^\._-][\w\.-]+@(?:[A-Za-z0-9]+\.)+[A-Za-z]+$')
 28 
 29 
 30 def is_phone(text):
 31     """
 32     驗證字符串是不是固定電話
 33     :param text: 須要檢查的字符串
 34     :return: 符合返回True,不符合返回False
 35     """
 36     return check_string(text, '\(?0\d{2,3}[) -]?\d{7,8}$')
 37 
 38 
 39 def is_mobile(text):
 40     """
 41     驗證字符串是不是手機號碼
 42     :param text: 須要檢查的字符串
 43     :return: 符合返回True,不符合返回False
 44     """
 45     return check_string(text, '^1[3578]\d{9}$|^147\d{8}$')
 46 
 47 
 48 def is_letters(text):
 49     """
 50     驗證字符串是否全是字母
 51     :param text: 須要檢查的字符串
 52     :return: 符合返回True,不符合返回False
 53     """
 54     return check_string(text, '^[a-zA-Z]+$')
 55 
 56 
 57 def is_idcard(text):
 58     """
 59     驗證字符串是不是身份證號碼
 60     :param text: 須要檢查的字符串
 61     :return: 格式正確返回True,錯誤返回False
 62     """
 63     ic = IdentityCard()
 64     return ic.check(text.upper())
 65 
 66 
 67 def filter_str(text, filter='\||<|>|&|%|~|\^|;|\''):
 68     """
 69     濾掉字符串
 70     :param text: 須要過濾的字符串
 71     :param filter: 過濾內容(正則表達式)
 72     :return: 去除特殊字符後的字符串
 73     """
 74     if text:
 75         return re.subn(filter, '', text)[0]
 76     else:
 77         return ''
 78 
 79 def filter_tags(htmlstr):
 80     """
 81     過濾HTML中的標籤
 82     :param htmlstr: 要過濾的內容
 83     :return:
 84     """
 85     re_cdata=re.compile('//<!\[CDATA\[[^>]*//\]\]>',re.I) #匹配CDATA
 86     re_script=re.compile('<\s*script[^>]*>[^<]*<\s*/\s*script\s*>',re.I)#Script
 87     re_style=re.compile('<\s*style[^>]*>[^<]*<\s*/\s*style\s*>',re.I)#style
 88     re_br=re.compile('<br\s*?/?>')#處理換行
 89     re_h=re.compile('</?\w+[^>]*>')#HTML標籤
 90     re_comment=re.compile('<!--[^>]*-->')#HTML註釋
 91     s=re_cdata.sub('',htmlstr)#去掉CDATA
 92     s=re_script.sub('',s) #去掉SCRIPT
 93     s=re_style.sub('',s)#去掉style
 94     s=re_br.sub('\n',s)#將br轉換爲換行
 95     s=re_h.sub('',s) #去掉HTML 標籤
 96     s=re_comment.sub('',s)#去掉HTML註釋
 97     #去掉多餘的空行
 98     blank_line=re.compile('\n+')
 99     s=blank_line.sub('\n',s)
100     s=replaceCharEntity(s)#替換實體
101     return s
102 
103 def replaceCharEntity(htmlstr):
104     """
105     替換經常使用HTML字符
106     :param htmlstr: 要替換的字符
107     :return:
108     """
109     CHAR_ENTITIES={'nbsp':' ','160':' ',
110                 'lt':'<','60':'<',
111                 'gt':'>','62':'>',
112                 'amp':'&','38':'&',
113                 'quot':'"','34':'"',}
114     re_charEntity=re.compile(r'&#?(?P<name>\w+);')
115     sz=re_charEntity.search(htmlstr)
116     while sz:
117         entity=sz.group()#entity全稱,如&gt;
118         key=sz.group('name')#去除&;後entity,如&gt;爲gt
119         try:
120             htmlstr=re_charEntity.sub(CHAR_ENTITIES[key],htmlstr,1)
121             sz=re_charEntity.search(htmlstr)
122         except KeyError:
123             #以空串代替
124             htmlstr=re_charEntity.sub('',htmlstr,1)
125             sz=re_charEntity.search(htmlstr)
126     return htmlstr
127 
128 
129 def string(text, is_return_null=False):
130     """
131     sql字符串拼接專用函數
132     會在字符串兩邊添加'單撇號,用於生成數據庫sql語句
133     :param text: 須要添加'的字符串
134     :param is_return_null: 是否返回null,是的話在字符串爲空時返回null,不然返回''
135     :return:
136     """
137     if not text is None and text != '':
138         return "'" + str(text) + "'"
139     elif not is_return_null:
140         return "''"
141     else:
142         return "null"
143 
144 
145 def cut_str(text, length):
146     """
147     將字符串截取指定長度
148     :param text: 須要進行截取的字符串
149     :param length: 字符串保留的長度
150     :return:
151     """
152     if not text or not isinstance(text, str):
153         return text
154     tem = ''
155     try:
156         tem = text.decode('utf8')
157     except:
158         pass
159     if not tem or tem == '':
160         try:
161             tem = text[0:length]
162         except:
163             tem = text
164     return tem[0:length]
165 
166 
167 class IdentityCard:
168     """身份證號碼驗證類"""
169 
170     def __init__(self):
171         self.__Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
172         self.__Ti = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
173 
174     def calculate(self, code):
175         """計算校驗位"""
176         sum = 0
177         for i in range(17):
178             sum += int(code[i]) * self.__Wi[i]
179         return self.__Ti[sum % 11]
180 
181     def check(self, code):
182         """檢查輸入的號碼是否正確"""
183 
184         if (len(code) != 18):
185             return False
186         if self.calculate(code) != code[17]:
187             return False
188 
189         return True
View Code

  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('12345678'), False)
        self.assertEqual(string_helper.is_phone('01012345678'), 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('123456789'), False)
        self.assertEqual(string_helper.is_mobile('13012345678'), True)
        self.assertEqual(string_helper.is_mobile('14012345678'), False)

    def test_is_letters(self):
        self.assertEqual(string_helper.is_letters('123456'), 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('123456789'), False)
        self.assertEqual(string_helper.is_idcard('aaaaaaaaa'), False)
        self.assertEqual(string_helper.is_idcard('340223190008210470'), False)
        self.assertEqual(string_helper.is_idcard('34022319000821047X'), True)
        

if __name__ == '__main__':
    unittest.main()

 

  filter_str()函數用來將指定的特殊字符所有過濾掉python

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

  執行結果:web

------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>'))

  執行結果:sql

------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打印到控制檯的結果,字符串不輸出""雙引號,實際上存儲到變量中時,下面內容都會加上雙引號json

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

 

  cut_str()函數會將輸入的字符串按指定長度截取session

    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))

  執行結果:ide

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

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

 

 

  verify_helper.py是驗證碼生成包,調用比較簡單,這裏就再也不詳細說明,到後面章節會有詳細例子。

 

  web_helper.py是web操做包,主要是對web服務進行相關處理。它須要啓動web服務後基於web服務下才行進行測試操做,不能直接運行測試用例進行測試,你們能夠先了解一下里面函數的功能。

  1 #!/usr/bin/evn python
  2 # coding=utf-8
  3 
  4 import json
  5 import re
  6 import urllib.parse
  7 from bottle import response, HTTPResponse, request
  8 from common import json_helper
  9 
 10 
 11 def get_ip():
 12     """獲取當前客戶端ip"""
 13     try:
 14         ip = request.remote_addr
 15     except:
 16         ip = ''
 17     if not ip:
 18         try:
 19             ip = request.environ.get('REMOTE_ADDR')
 20         except:
 21             pass
 22     return ip
 23 
 24 
 25 def get_session():
 26     """獲取當前用戶session"""
 27     return request.environ.get('beaker.session')
 28 
 29 
 30 def return_msg(state, msg, data={}):
 31     """
 32     接口輸出數據到客戶端
 33     :param state:   狀態碼(公共參數,-1=出錯,0=正常)
 34     :param msg:     說明信息(公共參數)
 35     :param data:    數據字典
 36     :return:        返回組合後的json字符串
 37     """
 38     msg = {
 39         "state": state,
 40         "msg": msg,
 41         "data": data
 42     }
 43     # 將字典轉爲字符串輸出
 44     message = json.dumps(msg, cls=json_helper.CJsonEncoder)
 45     return message
 46 
 47 
 48 def return_raise(msg=''):
 49     """
 50     直接終止程序,返回結果給客戶端
 51     修改bottle的異常狀態碼和異常返回body內容
 52     :param msg:     輸出內容
 53     :return:        輸出字符串
 54     """
 55     res = response.copy(cls=HTTPResponse)
 56     res.status = 200
 57     res.body = str(msg)
 58     raise res
 59 
 60 
 61 def get_form(args_name, msg, is_strip=True, lenght=0, is_check_null=True, notify_msg='', is_check_special_char=True):
 62     """
 63     獲取客戶端Form方式提交的參數值
 64     :param args_name: 參數名
 65     :param msg: 參數中文名稱
 66     :param is_strip: 字符串兩端是否自動去除空格
 67     :param lenght: 參數長度最大限制,0爲不限制
 68     :param is_check_null: 是否要求進行非空檢測,True:當參數值爲空時,返回錯誤提示客戶端不能爲空
 69     :param notify_msg: 非必填項,當參數值爲空時,默認返回「xxx 不容許爲空」這個提示,若是這個變量有值,則直接返回這個變量值,即定製好的錯誤提示
 70     :param is_check_special_char: 判斷參數值是否含有特殊字符,True=默認會對特殊字符進行判斷,False=不作判斷處理,須要手動對接收參數值進行過濾處理,去除危險字符
 71     :return: 返回處理後的參數
 72     """
 73     args_value = ''
 74     if request.method.upper() in ('POST', 'PUT', 'DELETE'):
 75         try:
 76             if request.json:
 77                 args_value = str(request.json.get(args_name, '')).strip()
 78             else:
 79                 args_value = str(request.forms.get(args_name, '')).strip()
 80         except:
 81             args_value = str(request.forms.get(args_name, '')).strip()
 82         if not args_value:
 83             args_value = str(request.POST.get(args_name, '')).strip()
 84 
 85     return __request_handle(args_value, msg, is_strip, lenght, is_check_null, notify_msg, is_check_special_char)
 86 
 87 
 88 def get_query(args_name, msg, is_strip=True, lenght=0, is_check_null=True, notify_msg='', is_check_special_char=True):
 89     """
 90     獲取客戶端Get方式提交的參數值
 91     :param args_name: 參數名
 92     :param msg: 參數中文名稱
 93     :param is_strip: 字符串兩端是否自動去除空格
 94     :param lenght: 參數長度最大限制,0爲不限制
 95     :param is_check_null: 是否要求進行非空檢測,True:當參數值爲空時,返回錯誤提示客戶端不能爲空
 96     :param notify_msg: 非必填項,當參數值爲空時,默認返回「xxx 不容許爲空」這個提示,若是這個變量有值,則直接返回這個變量值,即定製好的錯誤提示
 97     :param is_check_special_char: 判斷參數值是否含有特殊字符,True=默認會對特殊字符進行判斷,False=不作判斷處理,須要手動對接收參數值進行過濾處理,去除危險字符
 98     :return: 返回處理後的參數
 99     """
100     return __request_handle(__get(args_name), msg, is_strip, lenght, is_check_null, notify_msg, is_check_special_char)
101 
102 
103 def __get(args_name):
104     """
105     從get請求中提取請求值(直接使用python的GET獲取參數時,有時轉換編碼時會出現亂碼,因此仍是直接採用截取後直接轉碼比較好)
106     例如:http://127.0.0.1:81/manage/manager/?page=0&rows=20&sidx=id&sord=desc&name=%E5%BC%A0%E4%B8%89
107     :param args_name: 要取值的參數名:name
108     :return: 截取的編碼值:%E5%BC%A0%E4%B8%89
109     """
110     get = '?' + request.query_string
111     start_index = get.find('&' + args_name + '=')
112     if start_index == -1:
113         start_index = get.find('?' + args_name + '=')
114         if start_index == -1:
115             return ''
116     end_index = get.find('&', start_index + 1)
117     if end_index == -1:
118         return get[start_index + len(args_name + '=') + 1:]
119     else:
120         return get[start_index + len(args_name + '=') + 1:end_index]
121 
122 
123 def __request_handle(args_value, msg, is_strip, lenght, is_check_null, notify_msg, is_check_special_char):
124     """
125     對客戶端提交的參數進行各類判斷與處理
126     :param args_value: 參數值
127     :param msg: 參數中文名稱
128     :param is_strip: 字符串兩端是否自動去除空格
129     :param lenght: 參數長度最大限制,0爲不限制
130     :param is_check_null: 是否要求進行非空檢測,True:當參數值爲空時,返回錯誤提示客戶端不能爲空
131     :param notify_msg: 非必填項,當參數值爲空時,默認返回「xxx 不容許爲空」這個提示,若是這個變量有值,則直接返回這個變量值,即定製好的錯誤提示
132     :param is_check_special_char: 判斷參數值是否含有特殊字符,True=默認會對特殊字符進行判斷,False=不作判斷處理,須要手動對接收參數值進行過濾處理,去除危險字符
133     :return: 返回處理後的參數
134     """
135     # 若是參數爲空,則返回該參數不容許爲空的json串給前端
136     if is_check_null and not args_value:
137         if notify_msg:
138             return_raise(return_msg(-1, notify_msg))
139         else:
140             return_raise(return_msg(-1, "%s 不容許爲空" % msg))
141     elif not args_value:
142         return args_value
143 
144     # 把utf-8的url編碼解碼成中文字符
145     try:
146         args_value = urllib.parse.unquote(args_value)
147     except:
148         pass
149 
150     # 替換特殊的空字符
151     args_value = args_value.replace(u'\xa0', u'')
152     # 是否字符串兩端去空格
153     if is_strip:
154         args_value = args_value.strip()
155     # 判斷是否超出指定長度
156     if lenght > 0 and len(args_value) > lenght:
157         return_raise(return_msg(-1, "%s 超出 %s 個字符" % (msg, lenght)))
158 
159     # 若是參數含有特殊字符,則返回該參數不容許有特殊字符的json串給前端
160     if is_check_special_char:
161         re_result = re.search('\||<|>|&|%|~|\^|;|\'', args_value)
162         if re_result:
163             return_raise(return_msg(-1, "%s 含有特殊字符,請從新輸入" % msg))
164     return args_value
View Code

  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/

相關文章
相關標籤/搜索