接口開發、異常處理、網絡編程


一.接口開發,有依賴關系的接口開發

1.場景:用戶登錄后發表文章

用戶登錄接口代碼示例:

import flask,time,json
from lib import tools
server  = flask.Flask(__name__)

@server.route('/login',methods=['get'])
def login():
   username = flask.request.values.get('username')
   pwd = flask.request.values.get('pwd')
   if username == 'zhouly' and pwd=='123456':
      session_id = tools.my_md5(username+time.strftime('%Y%m%d%H%M%S'))
      key = 'txz_session:%s'%username
      tools.op_redis(key,session_id,600)
      res = {'session_id':session_id,'error_code':0,'msg':'登錄成功',
            'login_time':time.strftime('%Y%m%d%H%M%S') } #給用戶返回的信息
      json_res = json.dumps(res,ensure_ascii=False)#返回結果弄成json
      res = flask.make_response(json_res)  #構造成返回結果的對象
      res.set_cookie(key,session_id,3600) #最后的數字是cookie的失效時間。
      return res

代碼執行結果,用戶登錄成功,返回cookie值給客戶端,在客戶端查看cookie內容:

1.在瀏覽器頁面點擊頁面內容中點擊鼠標右鍵,在彈出的快捷菜單中選擇"檢查"選項

2.在彈出的頁面選擇"pplication"菜單查看cookies內容

3.在redis數據庫中查看session_id 內容

用戶要再執行發布文章操作,要拿客戶端的cookie中的session_id與redis數據庫中的session_id做匹配,如果是一樣的,表示該用戶已經登錄系統,可以執行發布文章操作.

用戶發布文章的代碼示例:

@server.route('/posts')
def posts():
   cookies = flask.request.cookies  #所有的cokies
   username = ''  #
   session = ''#定義這兩個變量是為了,在沒有傳cookie的時候用的。
   for key,value in cookies.items():
      if key.startswith('txz_session'): #判斷cookie以txz_session開頭的話,取到它
         username = key
         session = value  #調用接口的時候用戶傳過的seesion,從cookie里面取過來的
   redis_session = tools.op_redis(username) #從redis里面獲取到的的cookie
   if redis_session == session:  #判斷傳過來的seeion和redis里面的session一樣
      title = flask.request.values.get('title')#獲取文章標題
      conent = flask.request.values.get('content')#獲取文章內容
      article_key ='article:%s'%title     #key都以article開頭
      tools.op_redis(article_key,conent) #把文章寫入redis
      res = {'msg':'文章發表成功!','code':0}
   else:
      res = {'msg':'用戶未登錄!','code':2009}

   return json.dumps(res,ensure_ascii=False)

在瀏覽器執行posts接口

二、項目添加環境變量、搭建環境說明

1.添加環境變量

import sys,os

BASE_PATH=sys.path.insert(0,r'E:\syz\syz-code\day8\new_api')#路徑前面加r,避免換行符\n

 

BASE_PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#__file__獲取當前路徑

BASE_PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

#獲取到程序的主目錄,將當前路徑設置為環境變量,可以在任意程序、任意平台設置,__file__獲取當前路徑,路徑分隔符為/,所以前面要加絕對路徑os.path.abspath

 

2.搭建測試環境

第一次搭建測試環境工作內容:

1、申請服務器資源,有N台服務器,Windows, Linux,Windows,(.net開發的),Linux的跨平台

2、安裝依賴軟件,

java : tomcat jdk1.7 oracle/mysql redis

python: nginx ,apache,python3 ....

3、獲取源代碼(編譯、打包)

4、導入基礎數據(建表、執行sql)

5、修改配置文件

6、啟動服務

日常部署工作內容:

1、獲取源代碼(編譯、打包)

2、執行sql(可選)

3、修改配置文件

4、重啟服務

 

三、異常處理

即便Python程序的語法是正確的,在運行它的時候,也有可能發生錯誤。運行期檢測到的錯誤被稱為異常。

大多數的異常都不會被程序處理,都以錯誤信息的形式展現。

異常以不同的類型出現,這些類型都作為信息的一部分打印出來: 例子中的類型有 ZeroDivisionError,NameError 和 TypeError。

錯誤信息的前面部分顯示了異常發生的上下文,並以調用棧的形式顯示具體信息。

try語句按照如下方式工作;

  • 首先,執行try子句(在關鍵字try和關鍵字except之間的語句)
  • 如果沒有異常發生,忽略except子句,try子句執行后結束。
  • 如果在執行try子句的過程中發生了異常,那么try子句余下的部分將被忽略。如果異常的類型和 except 之后的名稱相符,那么對應的except子句將被執行。最后執行 try 語句之后的代碼。
  • 如果一個異常沒有與任何的except匹配,那么這個異常將會傳遞給上層的try中。

一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多只有一個分支會被執行。

處理程序將只針對對應的try子句中的異常進行處理,而不是其他的 try 的處理程序中的異常。

一個except子句可以同時處理多個異常,這些異常將被放在一個括號里成為一個元組,例如:

except (RuntimeError, TypeError, NameError): pass

代碼示例:

first = input('請輸入除數:')
second = input('請輸入被除數:')
try:
    first = int(first)
    second = int(second)
    res = first/second
    li = [1,2,3,4]
# except ValueError as e: #這個e代表錯誤信息,如果上面的兩行代碼出現了 ValueError這個錯
#     print(e)
#     print('請輸入整數')
# except ZeroDivisionError as e:
#     print(e)
#     print('除數不能為0')
except Exception as e:   #上面代碼出異常的時候走這里,
    print(e)
    print('出錯了')

else: #沒有出錯,也不是必須寫的
    print('並沒有出錯')#這個是沒有異常的時候走
    print(res)
finally:#不管出錯或者沒有出錯都會執行它,也不是必須寫的。比例:關閉數據庫連接的操作會用到
    print('我是finally')

知識點: except與except Exception的區別,except只捕捉某一個異常,except Exception捕捉所有的異常

 

四、網絡編程

1、打開一個網頁,把網頁內容寫入到baidu.html文件

from urllib import request,parse

url = 'http://www.nnzhp.cn'

req = request.urlopen(url) #打開一個url,發get請求

content = req.read().decode() #獲取返回結果

fw = open('baidu.html','w',encoding='utf-8')

fw.write(content)

 

2.測試學生信息接口,取接口的返回信息error_code的值進行判斷

from urllib import request,parse

import json

url='http://api.nnzhp.cn/api/user/stu_info?stu_name=xiaohei'

req = request.urlopen(url) #打開一個url,發get請求

content = req.read().decode() #獲取返回結果

res_dic = json.loads(content) #返回的是json,要把json轉成字典

if res_dic.get('error_code') == 0:

print('測試通過')

else:

print('測試失敗',res_dic)

 

3、測試用戶登錄接口

from urllib import request,parse

url = 'http://api.nnzhp.cn/api/user/login'

data = {

'username':'niuhanyang',

'passwd':'密碼'

} #請求數據

data = parse.urlencode(data) #urlencode,自動給你拼好參數

# xx=xx&xx=11

req = request.urlopen(url,data.encode()) #發post請求

print(req.read().decode())

 

4、使用requests模塊發送get請求

import requests

url='http://api.nnzhp.cn/api/user/stu_info'

data={'stu_name':'小黑'}

req=requests.get(url,params=data)

print(req.json())#返回的是字典

print(req.text)#string類型,json串

 

5、使用requests模塊發送post請求,測試用戶登錄,返回信息

url = 'http://api.nnzhp.cn/api/user/login'

data = {'username':'niuhanyang','passwd':'密碼'} #請求數據

req = requests.post(url,data) #發送post請求

print(req.json())

 

6、使用requests模塊發送post請求,入參是json類型

import random

phone=random.randint(10000000000,99999999999)

url='http://api.nnzhp.cn/api/user/add_stu'

data = {

"name":"zhouly",

"grade":"天蠍座",

"phone":phone,

"sex":"男",

"age":28,

"addr":"河南省濟源市北海大道32號"

}

req = requests.post(url,json=data)

print(req.json())

 

7、使用requests模塊發送post請求,添加cookies

url = 'http://api.nnzhp.cn/api/user/gold_add'

data = {'stu_id':468,'gold':10000}

djl = {'niuhanyang':'337ca4cc825302b3a8791ac7f9dc4bc6'}

req = requests.post(url,data,cookies=djl)

print(req.json())

 

8、使用requests模塊發送get請求,添加header信息

url = 'http://api.nnzhp.cn/api/user/all_stu'

header = {

'Referer':'http://api.nnzhp.cn/'

}

req = requests.get(url,headers=header)

print(req.json())

 

9、上傳文件

url= 'http://api.nnzhp.cn/api/file/file_upload'

data = {

'file':open(r'C:\Users\bjniuhanyang\Desktop\圖\6bd9026dt935575932465&690.jpg','rb')

}

#圖片要用rb方式打開

req= requests.post(url,files=data)

print(req.json())

 

10、下載文件

url = 'http://up.mcyt.net/?down/46779.mp3'

req = requests.get(url)

fw = open('aaa.mp3','wb')

fw.write(req.content)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM