Flask開發:初識Flask

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')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章