文章目錄
1. HTTP通信與Web框架
補上:藉助剛纔建立好的tcp連接將響應回傳
1.1 流程
客戶端將請求打包成HTTP的請求報文(HTTP協議格式的請求數據)
採用TCP傳輸發送給服務器端
服務器接收到請求報文後按照HTTP協議進行解析
服務器根據解析後獲知的客戶端請求進行邏輯執行
服務器將執行後的結果封裝成HTTP的響應報文(HTTP協議格式的響應數據)
採用剛纔的TCP連接將響應報文發送給客戶端
客戶端按照HTTP協議解析響應報文獲取結果數據
1.2 細節
客戶端不一定是瀏覽器,也可以是PC軟件、手機APP、程序
根據服務器端的工作,將其分爲兩部分:
服務器:與客戶端進行tcp通信,接收、解析、打包、發送http格式數據
業務程序:根據解析後的請求數據執行邏輯處理,形成要返回的數據交給服務器
服務器與Python業務程序的配合使用WSGI協議
1.3 web框架
能夠被服務器調用起來,根據客戶端的不同請求執行不同的邏輯處理形成要返回的數據的 程序
核心:實現路由和視圖(業務邏輯處理)
1.4 框架分類
重量級的框架:爲方便業務程序的開發,提供了豐富的工具、組件,如Django
輕量級的框架:只提供Web框架的核心功能,自由、靈活、高度定製,如Flask、Tornado
1.5 明確web開發任務
視圖開發:根據客戶端請求實現業務邏輯(視圖)編寫
模板、數據庫等其他的都是爲了幫助視圖開發,不是必備的
2. 認識Flask
2.1 簡介
Flask誕生於2010年,是Armin ronacher(人名)用Python語言基於Werkzeug工具箱編寫的輕量級Web開發框架。它主要面向需求簡單的小應用。
Flask本身相當於一個內核,其他幾乎所有的功能都要用到擴展(郵件擴展Flask-Mail,用戶認證Flask-Login),都需要用第三方的擴展來實現。比如可以用Flask-extension加入ORM、窗體驗證工具,文件上傳、身份驗證等。Flask沒有默認使用的數據庫,你可以選擇MySQL,也可以用NoSQL。其 WSGI 工具箱採用 Werkzeug(路由模塊) ,模板引擎則使用 Jinja2 。
可以說Flask框架的核心就是Werkzeug和Jinja2。
Python最出名的框架要數Django,此外還有Flask、Tornado等框架。雖然Flask不是最出名的框架,但是Flask應該算是最靈活的框架之一,這也是Flask受到廣大開發者喜愛的原因。
2.2 與Django對比
django提供了:
django-admin快速創建項目工程目錄
manage.py 管理項目工程
orm模型(數據庫抽象層)
admin後臺管理站點
緩存機制
文件存儲系統
用戶認證系統
而這些,flask都沒有,都需要擴展包來提供
2.3 Flask擴展包
Flask-SQLalchemy:操作數據庫;
Flask-migrate:管理遷移數據庫;
Flask-Mail:郵件;
Flask-WTF:表單;
Flask-script:插入腳本;
Flask-Login:認證用戶狀態;
Flask-RESTful:開發REST API的工具;
Flask-Bootstrap:集成前端Twitter Bootstrap框架;
Flask-Moment:本地化日期和時間;
Flask中文文檔:https://dormousehole.readthedocs.io/en/latest/
3. 創建虛擬環境
3.1 anaconda3
官網:https://www.anaconda.com/distribution/
3.2 使用anaconda3創建虛擬環境
anaconda3的具體使用可參考:https://blog.csdn.net/sunxinyu/article/details/78801534
使用conda創建名爲flask_py的虛擬環境:
conda create --name flask_py python=3.7
進入到flask_py虛擬環境中安裝flask:
pip install Flask==1.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
一次性導出虛擬環境中所有依賴包:
pip freeze > 任意路徑下的文件名.txt
一次性安裝剛纔虛擬環境中所導出的依賴包:
pip install -r 任意路徑下的文件名.txt
4. Flask1.1的初步使用
4.1 hello world
打開pycharm,創建一個新的pure項目,按照下面的要求配置好環境:
在項目下創建一個app.py文件,並寫入下面代碼:
from flask import Flask
app = Flask(__name__) # 讀取當前文件的位置
app.run() # Flask應用程序實例的run方法啓動WEB服務器
運行app.py文件,控制檯輸出如下信息,說明flask環境成功搭建:
在app.py中加上我們的視圖函數:
# 裝飾器的作用是將路由映射到視圖函數index
@app.route('/')
def index():
return 'Hello World'
再次運行,刷新頁面:
4.2 Response三劍客
HTTPresponse: 返回字符串
def index();
renturn '願所用中國青年向上走,有一份熱,發一份光'
render: 返回HTML文件
在項目根目錄下建一個templates文件夾,並在其中新建個test.html:
告訴pycharm,存放模板文件的路徑,否則會飄黃,右擊templates文件夾,設置如下:
templates文件夾變爲紫色,說明設置完成。
打開app.py,插入代碼如下:
from flask import render_template
@app.route('/test')
def index():
return render_template('test.html')
redirect: 302重定向
from flask import redirect
@app.route("/")
def test():
return redirect('/test')
@app.route("/test")
def index(): Content-Type: application/json
return render_template("test.html")
jsonify: Content-Type: application/json
from flask import jsonify
@app.route("/")
def test():
return jsonify({'winston':'xxxx','age':20})
send_file: 發送圖片或流媒體
from flask import send_file
@app.route("/")
def test():
return send_file("1.mp4")
4.3 run參數說明
Ctrl+鼠標點擊 app.run():
def run(self, host=None, port=None, debug=None, load_dotenv=True, **options):
host:監聽的ip
port:啓動的端口
debug:true 打開調試模式 Flase 關閉調試模式
load_dotenv:加載最近的.env和.flaskenv 文件以設置環境變量
具體可見flask官方文檔run:https://dormousehole.readthedocs.io/en/latest/api.html#flask.Flask.run
4.4 request
改寫test.html:
<form action="" method="post" enctype="multipart/form-data">
<p><input type="text" name="username"></p>
<p><input type="password" name="pwd"></p>
<p><input type="file" name="kkk"></p>
<p><input type="submit" value="提交"></p>
</form>
request中的常用方法:
from flask import request
@app.route("/",methods=('get','post'))
def test():
print(request.values) # 拿到url和form中的所用數據,但key相同時會覆蓋,通常不用
print(request.method) # 請求方式
if request.method == 'GET':
print(request.args.to_dict()) # 存儲的是所有FormData中的所有數據
print(request.data) # 當Content-Type無法被解析時,存放原始數據
print(request.url) # 請求地址
print(request.headers) # 請求頭內容
print(request.path) # url路由地址
print(request.host) # 主機地址
print(request.host_url) # 將主機地址轉換爲httpurl
if request.method == 'POST':
picture=request.files.get('kkk') # 獲取form表單中上傳的文件
# 記得前端要加上enctype="multipart/form-data"
picture.save(picture.filename) # 保存文件到本地
print(request.form.to_dict()) # 存儲的是所有URL中的所有數據
print(request.json) # Content-Type: application/json 存放在request.json中
return render_template('test.html')