首先是提醒自己的一些嘮嗑:
學會勞逸結合,文檔看累了可以看視頻,動手操作很關鍵,遇到問題先動腦子冷靜地想,不要跟着步驟都不帶腦子,想不出來了再查一查!有時候打出來的代碼很虛,但是實踐不花錢,實踐出真知,還是運行一下!
前后端分離的開發中,后端要做什么:
先明確一下交互過程:只需要后端寫好接口后,前端調用后端寫的接口即可。
交互的時候,只需要在同一台電腦,不同端口同時運行前端,后端,打開前端頁面,前端可使用后端數據,即交互成功。一般不用將前端文件放到后端的工程文件下,只要解決好跨域問題就ok了。
那么這時候后端要做什么就很明確了:
1寫接口:建立處理請求的函數,接受前端發送過來的信息,通過處理后,返回前端要的信息。
2設計數據庫,將數據庫和視圖函數聯系起來,使得數據可被處理。
在具體開發中中的步驟:
1和前端一起商量需求分析
2自己設計數據庫,理清各個表之間的關系
3編寫視圖函數和相關的處理函數
關於一些自己犯過的錯誤:
1 使用了中文的逗號
2 使用了錯誤的縮進
3 區分大小寫
4 注意下划線(像表名就是雙下划線)
5 自己用的包裝了嗎,上面from了嗎
6 裝飾器不要漏掉,使用對應的函數一定要用對應的裝飾器
上面說的這些編譯的時候編譯器也會提醒,問題不大,跟着編譯器改就可以了。錯誤處理的方法還可以嘗試一下斷點調試。
關於一些書本不會講,小白不懂的知識:
1 foo/bar:文化產物,這些詞沒有任何意義,通常被當做占位符來使用,可以代表任何東西。
關於一些小白記不住的命令,開始總喜歡查看:
數據庫操作:在終端進行:打開數據庫 mysql -u root –p
創建數據庫:Create database 數據庫名 charset=utf8;
use 數據庫名;
show tables;
修改運行端口 :在終端運行:flask run -p 8000
生成requirement文件:pip freeze> requirements.txt
常見的概念
1 路由URL:用來表示從互聯網上得到的資源位置和訪問這些資源的方法
2注冊路由:讓URL與函數建立關聯。
3 視圖函數:處理請求的函數。
4 客戶端:用來給用戶和服務器通信的各種軟件。
服務端:為用戶提供服務的服務器。
5 程序上下文:程序上下文存儲了程序運行所必須的信息
請求上下文:包含請求的各種信息
6 requirement文件:項目包含一個requirement文件,用於記錄所有的包和版本號,以便在服務器部署操作
7 API:應用程序編程接口。API由服務器(Server)提供(服務器有各種各樣的類型,一般我們瀏覽網頁用到的是web server,即網絡服務器),通過API,計算機可以讀取、編輯網站數據,就像人類可以加載網頁、提交信息等。
RESTFUL API :即滿足RESTful風格設計的API
8 藍本:相當於一個模子,使用它可以將程序模塊化
常用的一些函數裝飾器:
1 @app.route:裝飾器視圖函數
@app.route('/leave_message', methods=['POST', 'GET'])
參數:(1)自定義端點值,獲取對應的URL;
(2)使用methods參數傳入一個包含監聽的HTTP方法的可迭代對象
返回值:相應主體,狀態碼,首部字段
關於這里我想特別說一下格式,最好的方式是和前端約定好了,分享一個最常見的格式!
return jsonify({msg:"注冊過了",
status : 400
})
2 jsonify(): 將傳入參數序列化,轉換成JSON字符串作為響應的主體,然后生成一個響應對象,並且設置正確的MIME類型.
這個函數基本在返回值的時候都會用到。
3 @app.cli.command()裝飾器:用於注冊flask命令;參數即命令名稱
4 redirect函數():重定向目標URL
return redirect('http://www.example.com')
return redierct(url_for('hello'),狀態碼) ;使用redirect()函數時,默認的狀態碼為302,即臨時重定向,但是也可以傳入自己設定的狀態碼。
5 abort(404):調用的時候自己返回404錯誤響應,不需要再使用return,abort()函數之后的代碼不會再執行。
6 request.json.get('參數'):從前端獲取參數。
關於數據庫的操作:
數據庫中的概念:
外鍵:通過某鍵,把數據和另一張表關聯起來(一對多的關系)
1 db.drop_all():刪除表,通常在運行測試的時候需要這個來保證每次運行的時候都是干凈的表。
db.create_all():創建表
2 db.session.add()遞交數據
3 db.session.commit() 提交會話
關於一些難點:
1 外鍵不一定要用另一張表的主鍵,但是一定要設定:
unique=True
關於保存登錄狀態中的一些概念:
1使用session
cookie技術:通過在請求和相應報文中添加cookie數據來保存客戶端的狀態信息。
session:安全的cookie,指用戶對話,即服務器和客戶端/游覽器之間或者桌面程序和用戶之間建立的交互活動。
使用:(1)設置密匙:
app.secret_key="自己設定"
(2)登錄的時候把登陸對象的其中一個內容(下面這個事例,把學號作為登錄賬號放到session中了)
# 登入用戶,保存登錄狀態在session中
session["student_number"]=student_numberx
(3)檢查登錄的狀態的時候只需要在session中查詢
student_number=session.get("student_number")
(4)登出的時候只需要清除session: session.clear()
2 使用jwt,JWT(json web token):
定義:主流的token;主要作用就是把客戶端登錄信息[uid, authority,logintime]加密和解密
flask使用:flask_jwt_extend 即可,在后端配置好相應的密匙,並注冊jwt對象;
app.config['JWT_SECRET_KEY'] = "自己設定"
jwt = JWTManager(app) #注冊jwt
jwt登錄注冊步驟過程:
登錄的時候生成token:
access_token = create_access_token(identity=student_numberx)
檢查狀態的時候得到jwt的身份信息:
student_id=get_jwt_identity()
登出的時候只需要前端丟掉jwt令牌。
flask-jwt-extended的一些常用函數:
-
cerate_access_token()
默認生成的是identity中的內容 -
get_jwt_identity()
默認拿到的是create_access_token中的數據,如果有裝飾器@jwt_identity_loader裝飾后,拿到的是返回的數據,對應上圖中的identity數據關於使用jwt的一些坑:
1 不要漏掉
@jwt_required
關於postman的一些使用:
postman是用於模擬前端向后端發送數據的,基本的使用就是后端用postman調試之后沒問題就可以和前端進行交互了。
1 直接用游覽器打開的是最原始的,而且默認是get的請求
2關於如何使用postman模擬前端發送數據:
注意自己發送的數據格式,如果格式錯了,會有小叉叉提醒,旁邊還有美化的按鈕,可以幫助美化格式
3 關於使用jwt的用法
首先,在生成token的接口中,獲得接口:
# Identity 參數可以是任何json序列化的數據
access_token = create_access_token(identity=usernamex)#注意這里identity已經設置成主鍵了
#返回訪問的token
return jsonify(access_token=access_token), 200
在這里,把token給獲取(實際上是復制)下來。
然后在獲取jwt的接口中
token空白輸入處,輸入剛剛復制的token。這樣就成功了
看關於加密問題!
開發過程中會涉及到很多加密問題,
(1)加密密碼:使用哈希算法,創建數據庫對象的時候就是是用,將密碼的哈希值保存在數據庫中。
(2)token加密:token實際上就是一個身份令牌,對令牌加密就是token設置密匙 。
session加密:session就是對cookie加密,所以設置session密碼保護會話不被他人盜用。
(3)對前端返回的報文和后端返回的響應加密:可規定一個算法,前端加密,后端解密。可采用對稱加密和非對稱加密。
關於返回數據格式問題
前后端分離一般返回的數據格式是 json格式,json即key-value的格式:
return jsonify({"msg":"注冊成功",
"status" : 200
})
返回類對象的話,也應通過處理,變成這種格式,否則將會報:”非序列化“的錯:
messages = Message.query.order_by(func.rand()).first()
return jsonify({"body":messages.body,
"time":messages.timestamp,
"user_name":messages.user_id
})
這是我返回一個留言對象耍的小聰明。
注意的是,與前端交互的時候應規定好返回的格式。
關於開發中注意事項以及改進提高:
1 分清出模塊,區分功能,一個視圖函數做一個功能
(比如一個留言板,提交新留言就提交新留言,展示留言就展示留言)
2 攔截器:即把多余的請求,無用的請求在進到服務器之前就攔截。
3 開發時的一些注意事項,前端如果返回錯誤信息,后端要可以處理,而防止服務器崩掉。
參考:《Flask Web開發實戰:入門、進階與原理解析 - 李輝》
本文持續更新,如有錯處請多指教~