PythonWeb框架學(xué)習(xí)【Flask】-創(chuàng)新互聯(lián)

了解flask

flask 是利用Python編寫的輕量級(jí)Web應(yīng)用框架
Flask也被稱為 “microframework” ,因?yàn)樗褂煤?jiǎn)單的核心,用 extension 增加其他功能。

Flask沒(méi)有默認(rèn)使用的數(shù)據(jù)庫(kù)、窗體驗(yàn)證工具。
其 WSGI 工具箱采用 Werkzeug   模板引擎則使用 Jinja2   Flask使用 BSD 授權(quán)
WSGI(PythonWeb服務(wù)器網(wǎng)關(guān)接口)

Python Web Server Gateway Interface
Python應(yīng)用程序或框架和Web服務(wù)器之間的一種接口

十載的正安網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營(yíng)銷網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整正安建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“正安網(wǎng)站設(shè)計(jì)”,“正安網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
BSD開源協(xié)議

一個(gè)給于使用者很大自由的協(xié)議,BSD 代碼鼓勵(lì)代碼共享,但需要尊重代碼作者的著作權(quán)。


利用flask實(shí)現(xiàn)一個(gè)最小應(yīng)用

創(chuàng)建一個(gè).py文件(test.py),添加代碼如下:
# 導(dǎo)入Flask類,該類的實(shí)例將作為我們的WSGI應(yīng)用
from flask import Flask
# 實(shí)例化Flask類,第一個(gè)參數(shù)應(yīng)當(dāng)是包或者模塊名,單一模塊使用__name__即可
app = Flask(__name__)

# route裝飾器用于確定觸發(fā)函數(shù)的url
@app.route('/')
def index():
# 函數(shù)的返回值為用戶在瀏覽器中獲取的值
    return 'Hello World'
運(yùn)行可以直接在代碼中調(diào)用run方法,然后執(zhí)行該.py文件即可
app.run(host='0.0.0.0', port=5000) 
# 0.0.0.0開放所有ip,port用于指定端口
# host指定開放ip,port指定端口號(hào),默認(rèn)127.0.0.1(回環(huán)地址)5000端口
或者在命令行中導(dǎo)出環(huán)境變量,然后執(zhí)行
export FLASK_APP=test.py # 非當(dāng)前目錄下須添加絕對(duì)路徑
flask run # 運(yùn)行
此時(shí)利用瀏覽器訪問(wèn)ip+端口(如127.0.0.1:5000),可以看到Helloworld字符

注意在瀏覽器訪問(wèn)時(shí),ip后須加端口號(hào),如果不加,默認(rèn)使用http服務(wù)(80端口)

Python Web框架學(xué)習(xí)【Flask】


設(shè)置路由

web應(yīng)用使用有意義的url,有助于用戶理解記憶,提高用戶體驗(yàn)
例如: 
            百度主頁(yè):www.baidu.com
            百度新聞:news.baidu.com
            百度貼吧:tieba.baidu.com

上面我們用到的route裝飾器就是用來(lái)綁定url和函數(shù)

例如下面這一段表示,用戶訪問(wèn)ip/時(shí)觸發(fā)的函數(shù)為index
@app.route('/')
def index():
    return 'Hello World'
此外,還可以動(dòng)態(tài)變化url

利用<variable_name> 的方式,將url的一部分標(biāo)記為變量,并傳遞給函數(shù)
@app.route('/<username>')
def user():
    return 'Hello %s'%username # 根據(jù)url變量部分返回字符串
還可以利用<converter:variable_name>,選擇轉(zhuǎn)換器,為變量指定規(guī)則
@app.route('/<int:username>') # 指定變量為整型
def user():
    return 'Hello %s'%username

Python Web框架學(xué)習(xí)【Flask】


模板渲染

當(dāng)我們需要向用戶返回一個(gè)完善的html頁(yè)面時(shí)
如果將html源碼全部貼在return后面顯然會(huì)讓人頭疼

Flask自動(dòng)為我們配置Jinja2模板引擎
我們可以利用render_template調(diào)用模板,并傳入?yún)?shù)進(jìn)行渲染
@app.route('/user/')
def user():
    username = 'testUser' # 測(cè)試數(shù)據(jù)
    return render_template('user.html',user=username)
第一個(gè)參數(shù)為需要調(diào)用的html模板,后面?zhèn)魅腙P(guān)鍵字參數(shù)
在html中利用關(guān)鍵字訪問(wèn)數(shù)據(jù)

render_template默認(rèn)會(huì)從當(dāng)前目錄下的templates文件夾中尋找模板

Python Web框架學(xué)習(xí)【Flask】

user.html中添加一個(gè)p標(biāo)簽,利用‘{{user}}‘的形式顯示user參數(shù)的值

Python Web框架學(xué)習(xí)【Flask】

利用瀏覽器訪問(wèn)

Python Web框架學(xué)習(xí)【Flask】


模板繼承

大多情況下,同一個(gè)域名下的各個(gè)子頁(yè)面風(fēng)格大致相同,具有相同的框架
比如同樣的導(dǎo)航欄,底部等等

為避免重復(fù)工作,可以制作一個(gè)共用的基礎(chǔ)模板,然后通過(guò)模板繼承來(lái)實(shí)現(xiàn)共用框架
基礎(chǔ)模板
基模板(base.html)中寫好了頭部和尾部,在身體部分放置了可以重載的塊
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h2 >我是模板頭部</h2>

{% block body %}
<p>可重載部分</p>
{% endblock %}

<h2 >我是模板尾部</h2>

</body>
</html>
子模板(use_base.html)
{% extends "base.html" %} <--! 擴(kuò)展了基礎(chǔ)模板 -->
{% block body %}
<p >
    這是子模板新加入的內(nèi)容
</p>
{% endblock %}
訪問(wèn)頁(yè)面

Python Web框架學(xué)習(xí)【Flask】

如果需要在子模板中調(diào)用父模板,需要在block中使用{{ super() }}

請(qǐng)求對(duì)象

首先導(dǎo)入請(qǐng)求對(duì)象

    from flask import Flask

通過(guò)使用 method 屬性可以操作當(dāng)前請(qǐng)求方法
通過(guò)使用 form 屬性處理表單數(shù)據(jù)(在 POST 或者 PUT 請(qǐng)求 中傳輸?shù)臄?shù)據(jù))

在.py文件中添加代碼如下:
@app.route('/login/',methods=['POST','GET']) # methods默認(rèn)只支持GET
def login():
    # 當(dāng)請(qǐng)求的方法為POST時(shí)
    if request.method=='POST':
        # 通過(guò)form表單獲取提交的數(shù)據(jù)
        un = request.form['username']
        pw = request.form['password']
        # 判斷用戶名密碼是否正確
        if un =='root' and pw =='redhat':
            # 正確返回登錄成功
            return '登錄成功'
        else:
            # 錯(cuò)誤返回登錄頁(yè)面并提示
            return render_template('login.html',error='用戶名或密碼錯(cuò)誤')
    # 請(qǐng)求方法不為POST時(shí),返回登錄頁(yè)面
    return render_template('login.html')
在form 表單中利用input提交信息,并指定key值(username/password)
編寫好一個(gè)簡(jiǎn)易的登錄頁(yè)面,如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="/login/" method="post"> <--! 以post的方式提交表單-->
    <input type="text" placeholder="請(qǐng)輸入用戶名" name="username">
    <input type="password" placeholder="請(qǐng)輸入密碼" name="password">
    <input type="submit" value="登錄">
    <p >{{error}}</p> <--! 登錄失敗時(shí)顯示錯(cuò)誤信息 -->        
</form>

</body>
</html>
登錄頁(yè)面

Python Web框架學(xué)習(xí)【Flask】

登錄成功

Python Web框架學(xué)習(xí)【Flask】

登錄失敗

Python Web框架學(xué)習(xí)【Flask】

如果需要對(duì)Url中傳遞的參數(shù)(例如ip?key=value)進(jìn)行操作
可以使用request.args.get('key')

文件上傳

用 Flask 處理文件上傳很容易
記得要在html頁(yè)面中設(shè)置表單 enctype="multipart/form-data" 屬性
否則瀏覽器將不會(huì)傳送你的文件

在獲取原文件名時(shí)可以使用filename屬性,但該值可以偽造,不可信
想要把客戶端上源文件名作服務(wù)器上的文件名時(shí)
可以使用Werkzeug 提供的secure_filename()函數(shù)

需要導(dǎo)入
                    from werkzeug.utils import secure_filename
在.py文件中添加代碼如下:
from werkzeug.utils import secure_filename

@app.route('/upload/',methods=['POST','GET'])
def upload():
    # 當(dāng)請(qǐng)求方法為POST的時(shí)
    if request.method == 'POST':
        # 讀取上傳的文件
        try:
            filename=None
            f = request.files['file_upload']
            # 獲取文件名
            filename = secure_filename(f.filename)
            # 保存文件到doc下
            f.save('doc/%s'%filename)
        except:
            # 未獲取到文件提示上傳失敗
            return render_template('upload.html',error='上傳失敗')
        # 返回上傳界面,傳遞文件名
        return render_template('upload.html',filename=filename)
    # 返回上傳界面
    return render_template('upload.html')
編寫一個(gè)簡(jiǎn)易的上傳html界面如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!-- 上傳文件 -->
<form action="/upload/" enctype="multipart/form-data" method="post">
    <input type="file" placeholder="未選擇文件" name="file_upload">
    <input type="submit" value="提交文件">

    <!--當(dāng)文件上傳成功時(shí),顯示提交成功-->
    {% if filename %}
        <p >{{ filename }}提交成功</p>
    {% endif%}
    <!--未上傳顯示失敗-->
    <p >{{ error }}</p>

</form>
</body>
</html>
上傳界面

Python Web框架學(xué)習(xí)【Flask】

上傳成功

Python Web框架學(xué)習(xí)【Flask】

上傳失敗

Python Web框架學(xué)習(xí)【Flask】


重定向和錯(cuò)誤

使用 redirect() 函數(shù)可以重定向
使用 abort() 可以 更早退出請(qǐng)求,并返回錯(cuò)誤代碼
需要從flask中導(dǎo)入
            from flask import abort,redirect

在.py文件中添加代碼如下:
@app.route('/error/')
def error():
    abort(401) # 退出并返回一個(gè)401錯(cuò)誤頁(yè)面

@app.route('/redirect/')
def direct():
    return redirect('/') # 重定向至/下(顯示Helloworld)
返回錯(cuò)誤頁(yè)面

Python Web框架學(xué)習(xí)【Flask】

我們還可以使用 errorhandler() 裝飾器可以定制出錯(cuò)頁(yè)面,在.py中添加代碼如下:
# 定制401出錯(cuò)界面為指定html 'error401.html'
@app.errorhandler(401)
def forbidden():
    return render_template('error401.html')
編寫一個(gè)簡(jiǎn)易401html錯(cuò)誤界面如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h2>這是一個(gè)401錯(cuò)誤頁(yè)面</h2>

</body>
</html>
新的自定義401錯(cuò)誤頁(yè)面

Python Web框架學(xué)習(xí)【Flask】


響應(yīng)對(duì)象

視圖函數(shù)(即被route裝飾器裝飾的函數(shù))的返回值 會(huì)自動(dòng)轉(zhuǎn)換為一個(gè)響應(yīng)對(duì)象

轉(zhuǎn)換規(guī)則:

  • 如果視圖返回的是一個(gè)響應(yīng)對(duì)象,那么就直接返回它。
  • 如果返回的是一個(gè)字符串,那么根據(jù)這個(gè)字符串和缺省參數(shù)生成一個(gè)用于返回的 響應(yīng)對(duì)象。
  • 如果返回的是一個(gè)元組,那么元組中的項(xiàng)目可以提供額外的信息。元組中必須至少 包含一個(gè)項(xiàng)目,且項(xiàng)目應(yīng)當(dāng)由 (response, status, headers) 或者 (response, headers) 組成。 status 的值會(huì)重載狀態(tài)代碼, headers 是一個(gè)由額外頭部值組成的列表或字典。
  • 如果以上都不是,那么 Flask 會(huì)假定返回值是一個(gè)有效的 WSGI 應(yīng)用并把它轉(zhuǎn)換為 一個(gè)響應(yīng)對(duì)象。
如果想要在視圖函數(shù)內(nèi)部獲取響應(yīng)對(duì)象的結(jié)果,可以使用make_response()函數(shù)

參考資料

官方中文文檔

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

新聞標(biāo)題:PythonWeb框架學(xué)習(xí)【Flask】-創(chuàng)新互聯(lián)
瀏覽路徑:http://muchs.cn/article20/dsgojo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、手機(jī)網(wǎng)站建設(shè)品牌網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)