久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

第19天:Web 開發(fā) Flask 介紹

 Python技術(shù) 2021-06-17

WEB開發(fā)是現(xiàn)在程序必會的技能,,因為大部分軟件都以Web形式提供,及時制作后臺開發(fā),,或者只做前臺開發(fā),,也需要了解Web開發(fā)的概念和特點,。由于Python是解釋性腳本語言,用來做Web開發(fā)非常適合,,而且Python有上百種Web開發(fā)框架,,以及成熟的模板技術(shù),使得Web開發(fā)如虎添翼,。今天借用Flask框架,,快速學(xué)習(xí)一下Python的Web開發(fā)知識。

Flask框架

Flask的設(shè)計易于使用和擴展,。它的初衷是為各種復(fù)雜的Web應(yīng)用程序構(gòu)建堅實的基礎(chǔ),。可以自由地插入任何擴展,。也可以自由構(gòu)建自己的模塊,。Flask適合各種項目。它對原型設(shè)計特別有用,。Flask依賴于兩個外部庫:Jinja2模板引擎和Werkzeug WSGI工具包,。Flask是最精致,功能最豐富的微框架之一,。Flask還很年輕,,擁有蓬勃發(fā)展的社區(qū),一流的擴展和漂亮的API,。Flask具有快速模板,,強大的WSGI功能,在Web應(yīng)用程序和庫級別的完整單元可測性,,以及大量文檔等優(yōu)點。選用Flask框架也是因為它方便入手,,結(jié)構(gòu)簡單,,零配置,是個學(xué)習(xí)Python Web開發(fā)的好工具,。

安裝Flask

像其他模塊一樣,,F(xiàn)lask的安裝很簡單,下面通過pip包管理器來安裝

pip install flask

檢查一下是否安裝正確 在命令行下輸入 python 進入命令行模式 引入flask模塊 回車

>>> import flask>>>

如果沒有錯誤提醒,,就說明安裝成功了

Hello world

下面寫個最簡單的Web應(yīng)用 hello.py

from flask import Flask  # 引入Flask模塊
app = Flask(__name__) # 創(chuàng)建一個應(yīng)用
@app.route('/')def index():    # 定義根目錄處理器    return '<h1>Hello World!</h1>'    if __name__ == '__main__':    app.run() # 啟動服務(wù)

打開終端,,跳轉(zhuǎn)到hello.py文件所在的文件夾,進入python命令行模式,,啟動服務(wù)

>>> python hello.py

如果一起正常的話會有類似下面的反饋

* Serving Flask app "hello" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

因為是通過app.run()啟動的服務(wù),,所以會有個錯誤提示,提醒不能將此Web應(yīng)用部署在生產(chǎn)環(huán)境中,,可以暫時忽略

此時,,打開瀏覽器,,輸入 127.0.0.1:5000/ 或者 localhost:5000/, 就可以看到 Hello World!歡迎字樣,。

路由

路由是Web開發(fā)中一個很重要的概念,,用來將不同的請求,映射到響應(yīng)的處理方法上,,這個方法被稱為視圖函數(shù),。比如剛才的Hello應(yīng)用,將根請求,,映射到index處理方法上,,下面簡單了解下Flask對路由的支持 Flask通過修飾器(和Java的注解類似)來建立路由映射關(guān)系的,已經(jīng)看到修飾器是app.rotue()

簡單路由

如 訪問 /hello

@app.route('/hello')def hello(): return 'Hello!'
動態(tài)路由

如訪問 /user/bob 或者 /user/lily 都會映射到同一視圖函數(shù)上

@app.route('/user/<name>')def user(name): return '<h1>Hello, %s! </h1>' % name

動態(tài)域名中動態(tài)的部分可以作為視圖函數(shù)的參數(shù),,也支持多個動態(tài)參數(shù),,如訪問 /user/bob/23

@app.route('/user/<name>/<age>')def user(name, age): return "<h1> Hello, %s, you're %s years old" % (name, age)

還可以指定動態(tài)部分的數(shù)據(jù)類型,如

@app.route('/post/<int:post_id>')def show_post(post_id): # show the post with the given id, the id is an integer return 'Post %d' % post_id
@app.route('/path/<path:subpath>')def show_subpath(subpath): # show the subpath after /path/ return 'Subpath %s' % escape(subpath)

支持的數(shù)據(jù)類型

類型說明
string(默認值) 任何不包含斜杠的文本
int正整數(shù)
float正浮點數(shù)
path類似 string ,,但可以包含斜杠
uuid接受 UUID 字符串
指定HTTP 方法

HTTP協(xié)議,,支持多種HTTP 方法,例如HEAD,、OPTIONS,,以及常用的GETPOST等,,F(xiàn)lask自動處理了HEADOPTIONS,,路由默認接受的方法是GET,如果要匹配其他請求方法,,可以在路由方法的methods參數(shù)來指定

@app.route('/login', methods=['GET', 'POST'])def login(): if request.method == 'POST': return do_the_login() else: return show_the_login_form()
復(fù)合路由

也可以將多個路由規(guī)則,,用于一個視圖函數(shù), 如訪問/job/ 和訪問 /work/效果是一樣的

@app.route('/job/')@app.route('/work/')def show_works(): return 'This is works page'

再復(fù)雜一點的例子

@app.route('/users/', defaults={'page': 1})@app.route('/users/page/<int:page>')def show_users(page): pass

上面的代碼表示,當訪問/user/或者 /user/page/<pageindex> 時,,都會有show_users視圖函數(shù)來處理, 而且還為/user/提供了默認值,,即訪問/user/相當于訪問 /user/page/1

請求和響應(yīng)

Web應(yīng)用,最重要的事情就是處理接收到的請求,,并返回響應(yīng),。Flask框架也一樣,它提供了請求對象request和響應(yīng)對象response,,可以方便的在視圖函數(shù)中使用,。

請求

Flask將客戶端發(fā)送的HTTP請求封裝成了request請求對象,并且使用上下文(context)臨時將request變?yōu)槿挚稍L問的,,于是在視圖還是中,,就可以直接使用了。

注意: request并非真正的全局變量,!試想,,在多線程服務(wù)器中,,多個線程同時處理不同客戶端發(fā)送的不同請求時,每個線程看到的request對象必然不同,。Falsk使用上下文讓特定的變量在一個線程中全局可訪問,,與此同時卻不會干擾其他線程。

Flask有兩種上下文,,分別為程序上下文和請求上下文,,各自對應(yīng)的全局變量如下表:

變量名上下文類型備注
current_app程序上下文表示當前運行的程序?qū)嵗?/td>
g程序上下文處理請求時用作臨時存儲對象,每次請求都會重新設(shè)值
request請求上下文客戶端發(fā)來的request請求對象
session請求上下文請求攜帶的會話信息

使用request對象前,,需要先引入

from flash import request

request對象提供了豐富的屬性和方法,,這里舉個例子:通過使用 method 屬性可以操作當前請求方法,通過使用 form 屬性處理表單數(shù)據(jù)(在 POST 或者 PUT 請求 中傳輸?shù)臄?shù)據(jù)),。以下是使用上述兩個屬性的例子:

@app.route('/login', methods=['POST', 'GET'])def login(): error = None if request.method == 'POST': if valid_login(request.form['username'], request.form['password']): return log_the_user_in(request.form['username']) else: error = 'Invalid username/password' # the code below is executed if the request method # was GET or the credentials were invalid return render_template('login.html', error=error)

注意:當 form 屬性中不存在這個鍵時會發(fā)生什么,?會引發(fā)一個 KeyError 。如果不處理這個錯誤 ,,就會顯示一個 HTTP 400 Bad Request 錯誤頁面,。

如果要操作 URL (如 ?key=value )中提交的參數(shù)可以使用 args 屬性,如 : searchword = request.args.get('key', '')

請求鉤子

有時在處理請求之前或之后執(zhí)行代碼會很有用,。例如,,在請求開始時,可能需要創(chuàng)建數(shù)據(jù)庫連接或者認證發(fā)起請求的用戶,。為了避免在每個視圖函數(shù)中都使用重復(fù)的代碼,,F(xiàn)lask提供了注冊通用函數(shù)的功能,注冊的函數(shù)可在請求被分發(fā)到視圖函數(shù)之前或之后調(diào)用,。請求鉤子使用修飾器實現(xiàn),。Flask支持以下4種鉤子:

  1. before_first_request:注冊一個函數(shù),在處理第一個請求之前運行,。

  2. before_request:注冊一個函數(shù),,在每次請求之前運行。

  3. after_request:注冊一個函數(shù),,如果沒有未處理的異常拋出,在每次請求之后運行,。

  4. teardown_request:注冊一個函數(shù),,即使有未處理的異常拋出,也在每次請求之后運行,。

示例: 在接受到第一個請求是,,打印一句話:

@app.before_first_requestdef first_quest(): print("run before first request")

在請求鉤子函數(shù)和視圖函數(shù)之間共享數(shù)據(jù)一般使用上下文全局變量g。例如,,before_request處理程序可以從數(shù)據(jù)庫中加載已登錄用戶,,并將其保存到g.user中,。隨后調(diào)用視圖函數(shù)時,視圖函數(shù)再使用g.user獲取用戶,。

響應(yīng)

響應(yīng)是Web服務(wù)器對請求的一個回應(yīng),,在Flask中,有多種形式的響應(yīng),。視圖函數(shù)的返回值會自動轉(zhuǎn)換為一個響應(yīng)對象,。如果返回值是一個字符串,那么會被 轉(zhuǎn)換為一個包含作為響應(yīng)體的字符串,、一個 200 OK 出錯代碼 和一個 text/html 類型的響應(yīng)對象,。如果返回值是一個字典,那么會調(diào)用 jsonify() 來產(chǎn)生一個響應(yīng),。以下是轉(zhuǎn)換的規(guī)則:

  1. 如果視圖返回的是一個響應(yīng)對象,,那么就直接返回它。

  2. 如果返回的是一個字符串,,那么根據(jù)這個字符串和缺省參數(shù)生成一個用于返回的 響應(yīng)對象,。

  3. 如果返回的是一個字典,那么調(diào)用 jsonify 創(chuàng)建一個響應(yīng)對象,。

  4. 如果返回的是一個元組,,那么元組中的項目可以提供額外的信息。元組中必須至少 包含一個項目,,且項目應(yīng)當由 (response, status) ,、 (response, headers) 或者 (response, status, headers) 組成。 status 的值會重載狀態(tài)代碼,, headers 是一個由額外頭部值組成的列表 或字典,。

  5. 如果以上都不是,那么 Flask 會假定返回值是一個有效的 WSGI 應(yīng)用并把它轉(zhuǎn)換為 一個響應(yīng)對象,。

除此之外,,還可以通過 make_response()函數(shù),創(chuàng)建可以響應(yīng)對象,,做更個性的事情,。

使用make_response()前,需要先引入

from flask import make_response

示例:

  1. 響應(yīng)有元組構(gòu)成

@app.errorhandler(404)def not_found(error): return render_template('error.html'), 404

@app.errorhandler 修飾符,,會將一個響應(yīng)代碼映射到一個視圖函數(shù)上,,這里是將404(找不到頁面)碼,處理成一個個性的錯誤頁面 另外,,render_template 是Flask的模板函數(shù),,簡單理解就是格式化一個動態(tài)的html字符串,關(guān)于模板的詳細用法,會在模板章節(jié)描述

  1. 使用 make_response() 包裹返回表達式,,獲得響應(yīng)對象,,并對該對象 進行修改,然后再返回:

@app.errorhandler(404)def not_found(error): resp = make_response(render_template('error.html'), 404) resp.headers['X-Something'] = 'A value' return resp

總結(jié)

本文借助Flask框架,,簡要介紹了下Python Web開發(fā)的基本知識和技術(shù),,希望能幫助您快速入門,在Python學(xué)習(xí)的道路上走的更順暢,。后續(xù)還會將就Web開發(fā)的話題,,對模板數(shù)據(jù)庫 以及擴展功能等進行講解,,敬請期待!

參考

  • 圖書: Flask Web開發(fā)[1]

  • Flask快速上手[2]

  • Flask入門到精通(二)[3]

  • Web服務(wù)器網(wǎng)關(guān)接口[4]

參考資料

[1]

圖書: Flask Web開發(fā): https://item.jd.com/12418677.html

[2]

Flask快速上手: https://dormousehole./en/latest/quickstart.html

[3]

Flask入門到精通(二): https://www.cnblogs.com/java-wgm/p/6602900.html

[4]

Web服務(wù)器網(wǎng)關(guān)接口: https://zh./wiki/Web%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BD%91%E5%85%B3%E6%8E%A5%E5%8F%A3

系列文章

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多