1. 程式人生 > >學習筆記八 介面開發,上傳下載,日誌

學習筆記八 介面開發,上傳下載,日誌

一.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表示按分鐘生成