【08】Python itsdangerous、sys.argv、glob、異常處理

1.itsdangerous 

第三方模塊。python

通常狀況下,用戶登陸時,根據密碼(有時候加鹽)等生成token,和id一塊兒-->存入redis;mysql

用戶再次訪問時(好比說支付時),請求中帶着id和token,後臺會將用戶帶來的token和redis中的進行對比,若一致,則匹配。git

  • 使用itsdangerous僅需生成一次,且不用存redis。

1.1加密token

1 import itsdangerous
2 
3 salt='sdf234^#$@G'#設置鹽值
4 t = itsdangerous.TimedJSONWebSignatureSerializer(salt,expires_in=30)#expires_in設置過時時間
5 res = t.dumps({'username':'yangfan','user_id':1})#參數爲要加密的數據,爲字典
6 token = res.decode()#返回bytes類型 decode解碼
7 print(token)
#運行結果
eyJhbGciOiJIUzUxMiIsImlhdCI6MTU0MjAzMDg3NywiZXhwIjoxNTQyMDMwOTA3fQ.eyJ1c2VybmFtZSI6InlhbmdmYW4iLCJ1c2VyX2lkIjoxfQ.jLwz4aL1ETAPFOs6CmDXYNECu4lNPVg0HjTcLkn-CUtWtrB9yKkO6fczxVJuwECEW83Y6FTgy47oV3X_EL45OQ

1.2解密token

1 import itsdangerous
2 
3 salt='sdf234^#$@G'
4 t = itsdangerous.TimedJSONWebSignatureSerializer(salt,expires_in=30)
5 s='eyJhbGciOiJIUzI1NiIsImlhdCI6MTU0MTgyMDA1NiwiZXhwIjoxNTQxODIwMDg2fQ.eyJ1c2VybmFtZSI6InlhbmdmYW4iLCJ1c2VyX2lkIjoxfQ.FUfs92HuVKrt61AKpMjv1Iye8QDP7XUGOfgcrSusMv8'
6 res = t.loads(s)
7 print(res)
#若是解析成功,返回原來加密的參數
{'username':'yangfan','user_id':1}

#若是token已過時,會報錯
......
  File "C:\Users\tyourai\AppData\Local\Programs\Python\Python36\lib\site-packages\itsdangerous\signer.py", line 169, in unsign
    raise BadSignature("Signature %r does not match" % sig, payload=value)
itsdangerous.exc.BadSignature: Signature b'FUfs92HuVKrt61AKpMjv1Iye8QDP7XUGOfgcrSusMv8' does not match

 

2.sys.argv

2.1sys.argv的做用

sys.argv的做用是獲取到運行python文件時,傳入參數redis

  • 默認若是運行python文件的時候,不傳參數,argv裏面只有一個元素,就是當前這個python文件的文件名
1 import sys
2 print(sys.argv)
#運行結果,是個List
['D:/個人文檔/day11/test.py']

2.2實例

 1 import flask
 2 import sys
 3 import time
 4 server = flask.Flask(__name__)
 5 
 6 @server.route('/')
 7 def index():
 8     return '<h1>success</h1>'
 9 if len(sys.argv)>1: #有參數傳入,不傳參時list長度爲1
10     port = sys.argv[1]
11     if port.isdigit():
12         server.run(port=port)#輸入的參數做爲端口號
13     elif port=='--help':
14         print('這個python文件的做用是讓你發財!')
15     elif port=='--time':
16         print(time.strftime('%Y-%m-%d %H:%M:%S'))
17     else:
18         print('端口號必須是整數!')
19 else:
20     print('運行錯誤!請在運行的時候指定端口號\n'
21           '請按照下面的方式運行python文件!\n'
22           'python mock_server.py 8989')

 

3.glob

內置模塊,可用來過濾目錄下的文件sql

  • 使用之前的方法
import os
print(os.listdir())#獲取當前目錄下的文件,返回List

for f in os.listdir():
    if f.endswith('.py'):
        os.remove(f)#刪除指定目錄下.py結尾的文件
  • 使用glob來實現
1 import glob
2 #過濾目錄下的文件
3 print(glob.glob('*.py'))#返回一個List,內容是以.py結尾的文件
4 print(glob.glob('*1*'))#中間包含1的文件
#運行結果
C:\Users\tyourai\AppData\Local\Programs\Python\Python36\python.exe D:/個人文檔/day11/test.py
['a.py', 'b.py', 'mock_server.py', 'op_mysql.py', 'test.py', 'token111.py', '做業1,下載qq頭像.py', '呵呵呵.py', '析構函數.py', '類變量.py', '繼承.py']
['token111.py', '做業1,下載qq頭像.py']

Process finished with exit code 0

 

4.異常處理  

4.1基本格式

1 def calc(a,b):
2     try:
3         res = a/b
4     except ZeroDivisionError as e: #能夠捕捉到ZeroDivisionError
5          res = '除數不能爲零, %s'%e
6     return res
7 # res = calc('k',1) #TypeError try後能夠跟多個except
8 # res = calc(10,0)  # ZeroDivisionError
9 # res = calc(10,0) #TypeError

 4.2else和finally

1 money = input('enter:')
2 try:
3     money = int(money)
4 except Exception as e:#產生異常了,走這邊
5     print('輸入金額錯誤!')
6 else:#沒有出現異常的話就走這裏
7     print(money+1)
8 finally:#不管怎樣都會執行
9     print('finally')

4.3e.args 

1 try:
2     x = 2 / 0
3 except Exception as e:
4     print(e)
5     print(e.args) #這是一個元組,在實際使用中,做爲返回值
6     print(type(e))
7     print(type(e.args))
8 else:
9     print('hahaha')
division by zero
('division by zero',)
<class 'ZeroDivisionError'>
<class 'tuple'>
相關文章
相關標籤/搜索