1. 程式人生 > 其它 >PLC資料採集與MES系統對接

PLC資料採集與MES系統對接

flask使用

1.flask介紹web應用互動

flask優勢
“微”, 輕量級web框架, 核心精簡, 允許拓展

虛擬環境 (重點)
虛擬環境: 獨立的python環境, 可以避免同一個框架的多版本衝突

三個命令:
建立虛擬環境 mkvirtualenv -p python3 env22

退出虛擬環境 deactivate

進入虛擬環境 workon env22

檢視所有虛擬環境 workon 雙擊tab

mac安裝虛擬環境: https://www.jianshu.com/p/dc7ec6a303e3
基本使用
3.1 第一個flask程式
安裝第三方包

pip install flask==0.10.1

檢視當前直譯器安裝的第三方包

pip freeze

第一個flask應用

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
return 'index'

if __name__ == "__main__":
app.run(host='0.0.0.0', port=8080, debug=True)

  

run方法引數

if __name__ == "__main__":
app.run(host='0.0.0.0', port=8080, debug=True)
# host 繫結ip 萬能ip 0.0.0.0 可以接收外網/區域網/本機的訪問
#port 監聽埠號
#debug 是否開啟除錯模式 作用1,可以在網頁中顯示python錯誤 2,更新程式碼後伺服器會自動重啟


3.2 路由的基本定義

# 1,methods引數 用於設定路由支援的請求方式,以列表的方式,元素必須大寫
@app.route('/',methods=['GET','POST']) # 2,路由必須以路徑分隔符 ‘/’ 開頭
def index():
return 'index'
if __name__ == "__main__":
print(app.url_map)
# 3,url_map記錄了web應用的所有路由規則,(url,支援的請求方式,檢視函式標記(函式名))
app.run(host='0.0.0.0', port=8080, debug=True)  


3.3 請求物件
3.3.1 基本資料

print(request.url) # 獲取請求物件的url
print(request.method) # 獲取請求的物件的請求方式
print(request.headers) # 獲取請求頭內容(請求頭是一個類字典物件)
print(request.headers.get('host')) # 建議使用get 方法獲取健值,沒有健的時候返回None而不報錯  

3.3.2 查詢字串 (重點)[類字典物件]

print(request.args.get('username')
print(request.args.get('age')

  

3.3.3 請求體 (重點)
請求體資料(3種)[可使用postman進行測試]
1,文字

print(request.data)

  

2,健值對資料(form表單)

# <input type='text' name='username' value='ls'>
print(request.form.get('username')


3,檔案(圖片,視訊等)

# <input type='file' name='boy' >
file = request.files.get('boy') # 獲取檔案內容
file.save('1.jpg') # 儲存檔案

  


3.4 響應
3.4.1 自定義響應物件

@app.route('/')
def index():
response = set_response('index') # 為響應物件的響應體傳參,預設為None
print('response.headers') # 列印響應頭,也可以為其重新賦值
return response

  


3.4.2 返回json (重點)[主要是將字典轉成json字串物件]

@app.route('/')
def index():
dict={
'name':'ls'
'age':18
}
return jsonify(dict)
# jsonify將dict轉成json字串並自動將Content-Type設定為application/json
# 也支援jsonify(name='zs',age=18)
# 建議使用此方式,不推薦使用json.dump(dict)

  


3.4.3 重定向

@app.route('/')
def index():
return 'index'
@app.route('/demo')
def demo():
return redirect(url_for('index') # 開發經常是redirect 和 url_for 配合使用
# 也可redirect('/') 直接指向一個url地址

  


3.4.4 自定義狀態碼

@app.route('/')
def index():
return 'index',700 # 設定第二個返回值為狀態嗎
# 作用:可以快速排錯

  

4. 異常處理

@app.route('/')
def index():
a = 1 / 0
abort(ZeroDivisionError) # 丟擲異常(只能丟擲http錯誤)
return 'index'
@errorhanler(404)
def error_404(e): # 捕獲到異常
return '頁面不存在'
@errorhanler(ZeroDivisionError)
def error_zero(0):
return '0不能作為除數'

  


四. 狀態保持 (重點)
狀態保持: 記錄使用者訪問資訊的機制, 如 是否顯示過幫助資訊, 是否已登入, 搜尋記錄等

4.1 cookie
特點:

將資料儲存在客戶端(使用者的電腦上), 可以減輕伺服器壓力

訪問網站時, 瀏覽器會自動將該網站的cookie資料傳送給伺服器

使用場景:

儲存一些不太重要的資料

cookie互動過程


cookie實現過程

@app.route('/detail3')
def detail3():
req_c = request.cookies.get('i_help') #
if req_c:

return '顯示漫畫'

response = make_response('顯示幫助') # type:Response
response.set_cookie('i_help', '1',max_age=86400) # 設定cookie資料
# max_age設定cookie過期時間,預設為-1(瀏覽器關閉即失效) 為0(立即失效)正數單位為毫秒
return response

  


cookie設定過期時間
max-age:

-1: 預設值, 當瀏覽器關閉時, cookie會被刪除

0 : 立即刪除cookie

正數: max-age=5, 表示5秒後cookie資料被刪除

細節
一旦儲存了cookie, 訪問網站的任意路由時, cookie資料都會被瀏覽器傳送

同源策略: cookie資料只會發給對應的網站

前端js也可以讀寫cookie

4.2 session
特點:
將資料儲存在服務端(伺服器的資料庫中), 安全性更高

使用場景:

儲存一些重要/敏感的資料

session互動過程


session實現免密碼登陸

from datetime import timedelta

from flask import Flask,request,session,redirect,url_for

app = Flask(__name__)

app.secret_key = 'test'

session.permanent = True

app.permanent_session_lifetime = timedelta(days=7)

@app.route('/',methods=['GET','POST'])
def index():
username = session.get("name")
print(username)
if username:
return '歡迎回來%s'%username
return '首頁'

@app.route('/login.html',methods=['GET','POST'])
def login():
method = request.method
if method == 'GET':
with open('./login.html') as f:
content = f.read()

return content

username = request.form.get('username')
password = request.form.get('password')
if username == 'ls' and password == '111':
session["name"] = username
# print(session.get("name"))
return redirect(url_for('index'))
else:
return '登陸失敗'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)

  


2. Session細節
生成隨機字串 base64.b64encode(os.urandom(48))

設定session的過期時間

# session.permanent 預設為False,如果設定為True,則預設時間為31天
session.permanent = True
app.permanent_session_lifetime = timedelta(days=7)
# 也可以設定hours = 2

  

刪除session

session.pop('name',None) # 設定預設值None,即使健不存在也不報錯

  


flask中預設的session儲存機制沒有使用傳統的session儲存機制(資料儲存到服務端的資料庫中), 而是將session資料加密後儲存到了cookie中