1. 程式人生 > >接口開發、異常處理、網絡編程

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

表示 技術 必須 pwd 錯誤 有一個 申請 網絡編程 encode

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

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)

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