測開6 - Python(網絡編程、接口開發)

python課的開頭我已經反覆聽了好幾遍了,始終沒有接觸到網絡編程和接口開發這部分。再加上上週的課由於公司出遊耽誤了,心裏其實仍是很忐忑的,很擔憂跟不上進度或者跟的吃力,以後就沒有什麼動力和正向反饋支撐我繼續學習了。一成天的課聽下來以爲好像也沒有想象中那麼難,主要仍是零散的知識點,容易出現眼睛會了腦子不會的狀況辣!☀︎☀︎☀︎python

 1⃣️ 網絡編程nginx

  主要是發送請求➡️拿到結果➡️對結果進行處理。用到的是 request 模塊,如下經過請求的不一樣類型來分別總結。web

  a. get 請求sql

1 url = 'http://api.nnzhp.cn/api/user/stu_info'
2 d = {"stu_name":"jiaolf"}
3 r = requests.get(url,d)

   對返回結果,直接打印 r 發現結果是 <Response [200]>,對結果 r 的處理,有如下三種狀況:數據庫

1 print(r.json())    #返回的是一個字典
2 print(r.text)    #返回的是一個字符串(好比須要寫入文件/數據庫)
3 print(r.content)    #返回的是bytes類型,能夠用來寫音視頻文件

  示例:取到某個 URL 的圖片並保存編程

1 url = 'http://b-ssl.duitang.com/uploads/item/201805/13/20180513224039_tgfwu.png'
2 res = requests.get(url)
3 with open('image.png','wb') as fw:
4     fw.write(res.content)

  以上須要注意的是,寫的內容是 res.contentjson

  b. post 請求
flask

  由於 post 請求大多不能把參數放在 URL 中,因此這裏在傳參數時須要把參數放入到一個字典中。須要什麼樣的參數,取決於接口的定義。api

1 url = 'http://api.nnzhp.cn/api/user/login'
2 data = {'username':'jiaolifei','password':'123'}
3 res = requests.post(url,data)
4 print(res.text)

  c. 傳 cookie、headercookie

  有不止一種方法,可是其餘的太麻煩,因此只總結一種簡單實用的。

1 url = 'http://qun.qq.com/cgi-bin/qun_mgr/get_friend_list'
2 d = {'bkn':12344555}
3 header = {'cookie':'*********'}
4 r = requests.post(url,d,headers=header)
5 print(r.json())

  以上,d 至關於普通請求中的必填參數,而 cookie 須要單獨把它放在 header 中

  d. 傳文件

1 url = 'http://api.nnzhp.cn/api/file/file_upload'
2 r = requests.post(url,files = {'file':open('jiaolf.png','rb')})    #file這裏根據接口來決定,須要使用rb模式
3 print(r.text)

 

2⃣️ 接口開發

  由於上面總結了網絡編程的部分,與接口相關,乾脆就把接口開發跟它放到一塊兒,瞭解了開發以後,就會對接口的使用有更深的理解。

  接口開發用到的是 flask 模塊,是一個輕量級 web 開發框架。

  接口開發的做用一般有:一、mock 接口;二、給別人提供數據。接口開發至關於服務端的工做,因此須要用到 server。

 1 import flask
 2 server = flask.Flask(__name__)    #把當前的python文件看成一個服務啓動
 3 #第一種,get 請求且無參數
 4 @server.route('/login')    #裝飾器,這裏是訪問路徑
 5 def login():
 6     d = {'code':0,'msg':'登陸成功!'}
 7     return json.dumps(d,ensure_ascii=False)    #訪問即返回以上信息,無入參
 8 
 9 #第二種,get請求且有參數
10 @server.route('/get_data')
11 def table_data():
12     table_list = ['app_user','app_student']
13     table_name = flask.request.args.get('table_name')
14     limit = flask.request.args.get('limit')
15     if table_name:
16         if table_name in table_list:
17             sql = 'select * from '+table_name+' limit '+limit
18             data = read_table(sql)    #read_table是個函數,傳入sql,返回結果
19          else:
20             data = {'code':-1,'msg':'沒有權限!'}
21     else:
22         data = {'code':1,'msg':'balabala'}
23     return json.dumps(data,ensure_ascii=False)
24 
25 #第三種,post請求
26 @server.route('/post_data',method=['post','get'])    #這裏get加不加均可以
27 def post():
28     username = flask.request.args.get('username')    #參數在url裏面時,用它
29     username2 = flask.request.values.get('username2')    #參數在body裏面,用它
30     file = flask.request.files.get('filename')
31     #cookie = flask.request.cookies.get('cookie')
32     #headers = flask.request.headers.get('header')
33     #headers = flask.request.json.get('header')    #json格式的
34     print(file.file_name)    #獲取文件名
35     file.save(file.filename)
36     return username+username2
37 
38 server.run(host='0.0.0.0',port=9999,debug=True)    #加上host後在同一個局域網能夠訪問。server.run一般不用這個,性能較差,實際應用會使用nginx

  根據以上備註說明:

  一、訪問方式:第一種,127.0.0.1:9999/login;第二種,127.0.0.1:9999/get_data?table_name=app_user&limit=5;第三種,由於參數不能放在 url,因此須要藉助 postman 等工具,使用方法與以前接口測試的方法是同樣的

  二、定義get/post請求,一般是經過在定義 ‘@server……’ 時在訪問路徑後面加上 ‘method = ['post','get']‘,這裏 get 和 post 能夠都寫,也能夠只寫一個。

  三、server.run 只能寫一次。註釋中也寫了,實際會用 nginx,以後有時間去了解下 nginx

相關文章
相關標籤/搜索