學習筆記八 介面開發,上傳下載,日誌
阿新 • • 發佈:2019-01-04
一.requests模組
1.get和post請求
import requests url='http://127.0.0.1:8999/api/upload' data = {'username':'testuser1','passwd':'111111'} r = requests.get(url,params=data) #發get請求 r = requests.post(url,data=data) #發post請求 r.cookies #返回cookie r.status_code #返回的狀態碼200
get和post的data資料指定的關鍵字不同,需要注意。
2.請求返回處理
print(r.text) #結果返回的就是字串 print(r.json()) #結果返回的就是字典,必須返回的是json,才能轉成字典
返回結果r預設是二進位制形式,可以轉換為text和json,如果返回的結果不是json格式,那麼用r.json()會報錯。
3.帶cookie的請求
cookie可以放在訊息頭hearders中,也可以放在單獨的cookie裡,區別在於,headers中,可以將所有的cookie
作為cookie鍵的值,打包成一個字典。而單獨指定cookie要將所有的cookie都以多個key-value的形式寫入。
requests.get(url,headers{'cookie':'pt2ggui=o0511402865;RK=JQZpwBp1by'}) requests.get(url,cookies{'pt2ggui':'o0511402865','RK':'JQZpwBp1by'})
4.上傳檔案
使用file引數
import requests url='http://127.0.0.1:8999/api/upload' data = {'username':'testuser1','passwd':'111111'} r = requests.post(url,data=data,files={'file_name':open('account.xls','rb')} )
5.下載檔案
url='https://qiniuuwmp3.changba.com/1127063572.mp4' r = requests.get(url) f = open('sdfsdf.mp4','wb') f.write(r.content) f.close()
將返回的結果以二進位制形式寫入檔案儲存在本地
二.flask模組補充
當獲取從web端過來的值的時候,有兩種取值方式,如果使用者是以params形式提交的引數,則用value的形式獲取,如果用json的形式提交資料,則用json的形式獲取,如果需要分別對待,則需用is_json來判斷資料型別:(部分程式碼未貼出)
1 import json 2 import os 3 4 from . import tools 5 from .check_session import check_session 6 # import tools 7 8 from conf import setting 9 from conf.setting import log 10 import flask 11 import time 12 server = flask.Flask(__name__) 13 14 15 @server.route('/api/login',methods=['get','post']) 16 def login(): 17 uname = flask.request.values.get('username') 18 pd = flask.request.values.get('passwd') 19 sql = 'select * from app_myuser where username="%s"'%uname 20 log.debug('登入執行的sql是:%s'%sql) 21 res = tools.my_db(sql) 22 if res: 23 if tools.my_md5(pd) == res.get('passwd'): 24 uname_md5 = tools.my_md5(uname+str(time.time())) 25 # uname_md5 = tools.my_md5(uname) 26 key='session:%s'%(uname_md5) 27 user_info = {'user_id':res.get('id'),'user_name':uname} 28 r = tools.get_redis() 29 log.debug('連線redis成功') 30 r.set(key,json.dumps(user_info),setting.SESSION_EXPIRE) 31 res = {"code":0,"msg":"登入成功!",'session_id':uname_md5, 32 'login_time':time.strftime('%Y-%m-%d %H:%M:%S')} 33 log.warning('%s 使用者登陸成功'%uname) 34 else: 35 res = {"code":1,"msg":"密碼錯誤!"} 36 else: 37 log.warning('%s使用者不存在'%uname) 38 res = {'code':2,"msg":"使用者不存在"} 39 return json.dumps(res,ensure_ascii=False) 40 41 @server.route('/api/add_stu',methods=['post']) 42 def add_stu(): 43 if flask.request.is_json: 44 session_id = flask.request.json.get('session_id') 45 name= flask.request.json.get('name') 46 phone = flask.request.json.get('phone') 47 grade = flask.request.json.get('grade') 48 addr = flask.request.json.get('addr','北京') 49 sex = flask.request.json.get('sex','男') 50 age = flask.request.json.get('age',18) 51 gold = flask.request.json.get('gold',1000) 52 if session_id and name and phone and grade: 53 login_tag , data = check_session(session_id) 54 if login_tag: 55 insert_sql="insert into `jxz`.`app_student` ( `name`, `sex`," \ 56 " `age`, `addr`, `grade`, `phone`, `gold`)" \ 57 " values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s');"%(name,sex,age,addr,grade,phone,gold) 58 tools.my_db(insert_sql) 59 res = {'code':0,'msg':'學生資訊新增成功'} 60 else: 61 res = data 62 63 else: 64 res = {'code':3,'msg':'必填引數未填,請檢視介面文件!'} 65 else: 66 res = {'code':5,'msg':'入參是json型別的!'} 67 return json.dumps(res, ensure_ascii=False) 68 69 @server.route('/api/upload',methods=['post']) 70 def upload(): 71 session_id = flask.request.values.get('session_id') 72 file = flask.request.files.get('file_name') 73 if session_id and file: 74 login_tag, data = check_session(session_id) 75 if login_tag: 76 new_file_name = '%s_%s'%(int(time.time()),file.filename) 77 #防止檔名重複,所以把檔名前面加上了時間戳 78 abs_file_path = os.path.join(setting.UPLOAD_DIR,new_file_name) 79 #拼檔案的絕對路徑,這樣子就放到了uploads目錄下 80 file.save(abs_file_path)#儲存檔案 81 res = {'code':0,'msg':'上傳檔案成功!'} 82 else: 83 res = data 84 else: 85 res = {'code':3,'msg':'必填引數未填,請檢視介面文件!'} 86 return json.dumps(res, ensure_ascii=False)
三.傳送郵件
1 import yagmail 2 username='[email protected]' 3 password='8888123'#生成授權碼,qq、163、126都是授權碼 4 5 mail_server = 'smtp.163.com' 6 # mail_server = 'smtp.qq.com' 7 # mail_server = 'smtp.126.com' 8 9 m = yagmail.SMTP(user=username,password=password,host=mail_server) 10 # smtp_ssl=True,如果郵箱使用了安全協議,就需要加這個 11 #qq郵箱就是使用了安全協議 12 13 to = ['[email protected]','[email protected]','[email protected]'] 14 cc = ['[email protected]','[email protected]','[email protected]'] 15 16 m.send(to=to,cc=cc,subject='今天吃了嗎', 17 contents='今天吃魚肉了嗎,吃飽沒', 18 attachments=r'tools.py')
其中to是傳送方,多個的話用list,cc是抄送方,多個的話用list,attachments包含了附件
四.寫日誌nnlog模組
import nnlog LOG_FILE = os.path.join(BASE_PATH,'logs','server.log')#日誌檔案存放的路徑 log = nnlog.Logger(LOG_FILE,level='warn',backCount=5,when='D') #例項化好
log.debug('登入成功1!')
log.info('登入成功2!')
log.warning('登入成功3!')
log.error('登入成功4!')
在level處定義好日誌級別,預設為debug級別,debug<info<warning<error,日誌只會列印大於和等於level的級別日誌
backCount表示存放的個數,如果生成的日誌檔案超過這個數值則會刪除之前生成的日誌,when表示按什麼時間生成日誌,D表示按天生成,s表示按秒生成,m表示按分鐘生成