一.接口開發,有依賴關系的接口開發
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)