日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Flask 快速上手

發(fā)布時(shí)間:2024/5/7 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flask 快速上手 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一個(gè)最小的應(yīng)用

一個(gè)最小的 Flask 應(yīng)用如下:

from flask import Flask app = Flask(__name__)@app.route('/') def hello_world():return 'Hello, World!'

那么,這些代碼是什么意思呢?

  • 首先我們導(dǎo)入了 Flask 類。 該類的實(shí)例將會(huì)成為我們的 WSGI 應(yīng)用。
  • 接著我們創(chuàng)建一個(gè)該類的實(shí)例。第一個(gè)參數(shù)是應(yīng)用模塊或者包的名稱。如果你使用 一個(gè)單一模塊(就像本例),那么應(yīng)當(dāng)使用 __name__ ,因?yàn)槊Q會(huì)根據(jù)這個(gè) 模塊是按應(yīng)用方式使用還是作為一個(gè)模塊導(dǎo)入而發(fā)生變化(可能是 ‘__main__’ , 也可能是實(shí)際導(dǎo)入的名稱)。這個(gè)參數(shù)是必需的,這樣 Flask 才能知道在哪里可以 找到模板和靜態(tài)文件等東西。
  • 然后我們使用 route() 裝飾器來(lái)告訴 Flask 觸發(fā)函數(shù)的 URL 。
  • 函數(shù)名稱被用于生成相關(guān)聯(lián)的 URL 。函數(shù)最后返回需要在用戶瀏覽器中顯示的信息。
  • 把它保存為 hello.py 或其他類似名稱。請(qǐng)不要使用 flask.py 作為應(yīng)用名稱,這會(huì)與 Flask 本身發(fā)生沖突。

    這樣就啟動(dòng)了一個(gè)非常簡(jiǎn)單的內(nèi)建的服務(wù)器。這個(gè)服務(wù)器用于測(cè)試應(yīng)該是足夠了,但是 用于生產(chǎn)可能是不夠的。

    現(xiàn)在在瀏覽器中打開(kāi) http://127.0.0.1:5000/ ,應(yīng)該可以看到 Hello World! 字樣。

    路由

    現(xiàn)代 web 應(yīng)用都使用有意義的 URL ,這樣有助于用戶記憶,網(wǎng)頁(yè)會(huì)更得到用戶的青睞, 提高回頭率。

    使用 route() 裝飾器來(lái)把函數(shù)綁定到 URL:

    @app.route('/') def index():return 'Index Page'@app.route('/hello') def hello():return 'Hello, World'

    但是能做的不僅僅是這些!你可以動(dòng)態(tài)變化 URL 的某些部分, 還可以為一個(gè)函數(shù)指定多個(gè)規(guī)則。

    變量規(guī)則

    通過(guò)把 URL 的一部分標(biāo)記為 <variable_name> 就可以在 URL 中添加變量。標(biāo)記的 部分會(huì)作為關(guān)鍵字參數(shù)傳遞給函數(shù)。通過(guò)使用 <converter:variable_name> ,可以 選擇性的加上一個(gè)轉(zhuǎn)換器,為變量指定規(guī)則。請(qǐng)看下面的例子:

    @app.route('/user/<username>') def show_user_profile(username):# show the user profile for that userreturn 'User %s' % escape(username)@app.route('/post/<int:post_id>') def show_post(post_id):# show the post with the given id, the id is an integerreturn 'Post %d' % post_id@app.route('/path/<path:subpath>') def show_subpath(subpath):# show the subpath after /path/return 'Subpath %s' % escape(subpath)

    轉(zhuǎn)換器類型:

    string

    (缺省值) 接受任何不包含斜杠的文本

    int

    接受正整數(shù)

    float

    接受正浮點(diǎn)數(shù)

    path

    類似 string ,但可以包含斜杠

    uuid

    接受 UUID 字符串

    唯一的 URL / 重定向行為

    以下兩條規(guī)則的不同之處在于是否使用尾部的斜杠。:

    @app.route('/projects/') def projects():return 'The project page'@app.route('/about') def about():return 'The about page'

    projects 的 URL 是中規(guī)中矩的,尾部有一個(gè)斜杠,看起來(lái)就如同一個(gè)文件夾。 訪問(wèn)一個(gè)沒(méi)有斜杠結(jié)尾的 URL 時(shí) Flask 會(huì)自動(dòng)進(jìn)行重定向,幫你在尾部加上一個(gè)斜杠。

    about 的 URL 沒(méi)有尾部斜杠,因此其行為表現(xiàn)與一個(gè)文件類似。如果訪問(wèn)這個(gè) URL 時(shí)添加了尾部斜杠就會(huì)得到一個(gè) 404 錯(cuò)誤。這樣可以保持 URL 唯一,并幫助 搜索引擎避免重復(fù)索引同一頁(yè)面。

    URL 構(gòu)建

    url_for() 函數(shù)用于構(gòu)建指定函數(shù)的 URL。它把函數(shù)名稱作為第一個(gè) 參數(shù)。它可以接受任意個(gè)關(guān)鍵字參數(shù),每個(gè)關(guān)鍵字參數(shù)對(duì)應(yīng) URL 中的變量。未知變量 將添加到 URL 中作為查詢參數(shù)。

    為什么不在把 URL 寫(xiě)死在模板中,而要使用反轉(zhuǎn)函數(shù) url_for() 動(dòng)態(tài)構(gòu)建?

  • 反轉(zhuǎn)通常比硬編碼 URL 的描述性更好。
  • 你可以只在一個(gè)地方改變 URL ,而不用到處亂找。
  • URL 創(chuàng)建會(huì)為你處理特殊字符的轉(zhuǎn)義和 Unicode 數(shù)據(jù),比較直觀。
  • 生產(chǎn)的路徑總是絕對(duì)路徑,可以避免相對(duì)路徑產(chǎn)生副作用。
  • 如果你的應(yīng)用是放在 URL 根路徑之外的地方(如在 /myapplication 中,不在 / 中), url_for() 會(huì)為你妥善處理。
  • 例如,這里我們使用 test_request_context() 方法來(lái)嘗試使用 url_for() 。 test_request_context() 告訴 Flask 正在處理一個(gè)請(qǐng)求,而實(shí)際上也許我們正處在交互 Python shell 之中, 并沒(méi)有真正的請(qǐng)求。

    from flask import Flask, escape, url_forapp = Flask(__name__)@app.route('/') def index():return 'index'@app.route('/login') def login():return 'login'@app.route('/user/<username>') def profile(username):return '{}\'s profile'.format(escape(username))with app.test_request_context():print(url_for('index'))print(url_for('login'))print(url_for('login', next='/'))print(url_for('profile', username='John Doe')) / /login /login?next=/ /user/John%20Doe

    HTTP 方法

    Web 應(yīng)用使用不同的 HTTP 方法處理 URL 。當(dāng)你使用 Flask 時(shí),應(yīng)當(dāng)熟悉 HTTP 方法。 缺省情況下,一個(gè)路由只回應(yīng) GET 請(qǐng)求。 可以使用 route() 裝飾器的 methods 參數(shù)來(lái)處理不同的 HTTP 方法:

    from flask import request@app.route('/login', methods=['GET', 'POST']) def login():if request.method == 'POST':return do_the_login()else:return show_the_login_form()

    如果當(dāng)前使用了 GET 方法, Flask 會(huì)自動(dòng)添加 HEAD 方法支持,并且同時(shí)還會(huì) 按照 HTTP RFC 來(lái)處理 HEAD 請(qǐng)求。同樣, OPTIONS 也會(huì)自動(dòng)實(shí)現(xiàn)。

    靜態(tài)文件

    動(dòng)態(tài)的 web 應(yīng)用也需要靜態(tài)文件,一般是 CSS 和 JavaScript 文件。理想情況下你的 服務(wù)器已經(jīng)配置好了提供靜態(tài)文件的服務(wù)。但是在開(kāi)發(fā)過(guò)程中, Flask 也能做好 這項(xiàng)工作。只要在你的包或模塊旁邊創(chuàng)建一個(gè)名為 static 的文件夾就行了。 靜態(tài)文件位于應(yīng)用的 /static 中。

    使用特定的 ‘static’ 端點(diǎn)就可以生成相應(yīng)的 URL

    url_for('static', filename='style.css')

    這個(gè)靜態(tài)文件在文件系統(tǒng)中的位置應(yīng)該是 static/style.css 。

    渲染模板

    在 Python 內(nèi)部生成 HTML 不好玩,且相當(dāng)笨拙。因?yàn)槟惚仨氉约贺?fù)責(zé) HTML 轉(zhuǎn)義, 以確保應(yīng)用的安全。因此, Flask 自動(dòng)為你配置 Jinja2 模板引擎。

    使用 render_template() 方法可以渲染模板,你只要提供模板名稱和需要 作為參數(shù)傳遞給模板的變量就行了。下面是一個(gè)簡(jiǎn)單的模板渲染例子:

    from flask import render_template@app.route('/hello/') @app.route('/hello/<name>') def hello(name=None):return render_template('hello.html', name=name)

    Flask 會(huì)在 templates 文件夾內(nèi)尋找模板。因此,如果你的應(yīng)用是一個(gè)模塊, 那么模板文件夾應(yīng)該在模塊旁邊;如果是一個(gè)包,那么就應(yīng)該在包里面:
    情形 1 : 一個(gè)模塊:

    /application.py /templates/hello.html

    情形 2 : 一個(gè)包:

    /application/__init__.py/templates/hello.html

    你可以充分使用 Jinja2 模板引擎的威力。

    模板示例:

    <!doctype html> <title>Hello from Flask</title> {% if name %}<h1>Hello {{ name }}!</h1> {% else %}<h1>Hello, World!</h1> {% endif %}

    在模板內(nèi)部可以和訪問(wèn) get_flashed_messages() 函數(shù)一樣訪問(wèn) request 、 session 對(duì)象。

    模板在繼承使用的情況下尤其有用。

    簡(jiǎn)單的說(shuō),模板繼承可以使每個(gè)頁(yè)面的特定元素(如頁(yè)頭、導(dǎo)航和頁(yè)尾) 保持一致。

    自動(dòng)轉(zhuǎn)義默認(rèn)開(kāi)啟。因此,如果 name 包含 HTML ,那么會(huì)被自動(dòng)轉(zhuǎn)義。如果你可以 信任某個(gè)變量,且知道它是安全的 HTML (例如變量來(lái)自一個(gè)把 wiki 標(biāo)記轉(zhuǎn)換為 HTML 的模塊),那么可以使用 Markup 類把它標(biāo)記為安全的,或者在模板 中使用 |safe 過(guò)濾器。

    操作請(qǐng)求數(shù)據(jù)

    對(duì)于 web 應(yīng)用來(lái)說(shuō)對(duì)客戶端向服務(wù)器發(fā)送的數(shù)據(jù)作出響應(yīng)很重要。在 Flask 中由全局 對(duì)象 request 來(lái)提供請(qǐng)求信息。如果你有一些 Python 基礎(chǔ),那么 可能 會(huì)奇怪:既然這個(gè)對(duì)象是全局的,怎么還能保持線程安全?答案是本地環(huán)境:

    本地環(huán)境

    某些對(duì)象在 Flask 中是全局對(duì)象,但不是通常意義下的全局對(duì)象。這些對(duì)象實(shí)際上是 特定環(huán)境下本地對(duì)象的代理。真拗口!但還是很容易理解的。

    設(shè)想現(xiàn)在處于處理線程的環(huán)境中。一個(gè)請(qǐng)求進(jìn)來(lái)了,服務(wù)器決定生成一個(gè)新線程(或者 叫其他什么名稱的東西,這個(gè)下層的東西能夠處理包括線程在內(nèi)的并發(fā)系統(tǒng))。當(dāng) Flask 開(kāi)始其內(nèi)部請(qǐng)求處理時(shí)會(huì)把當(dāng)前線程作為活動(dòng)環(huán)境,并把當(dāng)前應(yīng)用和 WSGI 環(huán)境綁定到 這個(gè)環(huán)境(線程)。它以一種聰明的方式使得一個(gè)應(yīng)用可以在不中斷的情況下調(diào)用另一個(gè) 應(yīng)用。

    這對(duì)你有什么用?基本上你可以完全不必理會(huì)。這個(gè)只有在做單元測(cè)試時(shí)才有用。在測(cè)試 時(shí)會(huì)遇到由于沒(méi)有請(qǐng)求對(duì)象而導(dǎo)致依賴于請(qǐng)求的代碼會(huì)突然崩潰的情況。對(duì)策是自己創(chuàng)建 一個(gè)請(qǐng)求對(duì)象并綁定到環(huán)境。最簡(jiǎn)單的單元測(cè)試解決方案是使用 test_request_context() 環(huán)境管理器。通過(guò)使用 with 語(yǔ)句 可以綁定一個(gè)測(cè)試請(qǐng)求,以便于交互。例如:

    from flask import requestwith app.test_request_context('/hello', method='POST'):# now you can do something with the request until the# end of the with block, such as basic assertions:assert request.path == '/hello'assert request.method == 'POST'

    另一種方式是把整個(gè) WSGI 環(huán)境傳遞給 request_context() 方法:

    from flask import requestwith app.request_context(environ):assert request.method == 'POST'

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

    首先,你必須從 flask 模塊導(dǎo)入請(qǐng)求對(duì)象:

    from flask import request

    通過(guò)使用 method 屬性可以操作當(dāng)前請(qǐng)求方法,通過(guò)使用 form 屬性處理表單數(shù)據(jù)(在 POST 或者 PUT 請(qǐng)求 中傳輸?shù)臄?shù)據(jù))。以下是使用上述兩個(gè)屬性的例子:

    @app.route('/login', methods=['POST', 'GET']) def login():error = Noneif 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 invalidreturn render_template('login.html', error=error)

    當(dāng) form 屬性中不存在這個(gè)鍵時(shí)會(huì)發(fā)生什么?會(huì)引發(fā)一個(gè) KeyError 。 如果你不像捕捉一個(gè)標(biāo)準(zhǔn)錯(cuò)誤一樣捕捉 KeyError ,那么會(huì)顯示一個(gè) HTTP 400 Bad Request 錯(cuò)誤頁(yè)面。因此,多數(shù)情況下你不必處理這個(gè)問(wèn)題。

    要操作 URL (如 ?key=value )中提交的參數(shù)可以使用 args 屬性:

    searchword = request.args.get('key', '')

    用戶可能會(huì)改變 URL 導(dǎo)致出現(xiàn)一個(gè) 400 請(qǐng)求出錯(cuò)頁(yè)面,這樣降低了用戶友好度。因此, 我們推薦使用 get 或通過(guò)捕捉 KeyError 來(lái)訪問(wèn) URL 參數(shù)。

    文件上傳

    用 Flask 處理文件上傳很容易,只要確保不要忘記在你的 HTML 表單中設(shè)置 enctype=“multipart/form-data” 屬性就可以了。否則瀏覽器將不會(huì)傳送你的文件。

    已上傳的文件被儲(chǔ)存在內(nèi)存或文件系統(tǒng)的臨時(shí)位置。你可以通過(guò)請(qǐng)求對(duì)象 files 屬性來(lái)訪問(wèn)上傳的文件。每個(gè)上傳的文件都儲(chǔ)存在這個(gè) 字典型屬性中。這個(gè)屬性基本和標(biāo)準(zhǔn) Python file 對(duì)象一樣,另外多出一個(gè) 用于把上傳文件保存到服務(wù)器的文件系統(tǒng)中的 save() 方法。下例展示其如何運(yùn)作:

    from flask import request@app.route('/upload', methods=['GET', 'POST']) def upload_file():if request.method == 'POST':f = request.files['the_file']f.save('/var/www/uploads/uploaded_file.txt')...

    如果想要知道文件上傳之前其在客戶端系統(tǒng)中的名稱,可以使用 filename 屬性。但是請(qǐng)牢記這個(gè)值是 可以偽造的,永遠(yuǎn)不要信任這個(gè)值。如果想要把客戶端的文件名作為服務(wù)器上的文件名, 可以通過(guò) Werkzeug 提供的 secure_filename() 函數(shù):

    from flask import request from werkzeug.utils import secure_filename@app.route('/upload', methods=['GET', 'POST']) def upload_file():if request.method == 'POST':f = request.files['the_file']f.save('/var/www/uploads/' + secure_filename(f.filename))...

    Cookies

    要訪問(wèn) cookies ,可以使用 cookies 屬性。可以使用響應(yīng) 對(duì)象 的 set_cookie 方法來(lái)設(shè)置 cookies 。請(qǐng)求對(duì)象的 cookies 屬性是一個(gè)包含了客戶端傳輸?shù)乃?cookies 的字典。在 Flask 中,如果使用 會(huì)話 ,那么就不要直接使用 cookies ,因?yàn)?會(huì)話 比較安全一些。

    讀取 cookies:

    from flask import request@app.route('/') def index():username = request.cookies.get('username')# use cookies.get(key) instead of cookies[key] to not get a# KeyError if the cookie is missing.

    儲(chǔ)存 cookies:

    from flask import make_response@app.route('/') def index():resp = make_response(render_template(...))resp.set_cookie('username', 'the username')return resp

    注意, cookies 設(shè)置在響應(yīng)對(duì)象上。通常只是從視圖函數(shù)返回字符串, Flask 會(huì)把它們 轉(zhuǎn)換為響應(yīng)對(duì)象。如果你想顯式地轉(zhuǎn)換,那么可以使用 make_response() 函數(shù),然后再修改它。

    使用 延遲的請(qǐng)求回調(diào) 方案可以在沒(méi)有響應(yīng)對(duì)象的情況下設(shè)置一個(gè) cookie 。

    重定向和錯(cuò)誤

    使用 redirect() 函數(shù)可以重定向。使用 abort() 可以 更早退出請(qǐng)求,并返回錯(cuò)誤代碼:

    from flask import abort, redirect, url_for@app.route('/') def index():return redirect(url_for('login'))@app.route('/login') def login():abort(401)this_is_never_executed()

    上例實(shí)際上是沒(méi)有意義的,它讓一個(gè)用戶從索引頁(yè)重定向到一個(gè)無(wú)法訪問(wèn)的頁(yè)面(401 表示禁止訪問(wèn))。但是上例可以說(shuō)明重定向和出錯(cuò)跳出是如何工作的。

    缺省情況下每種出錯(cuò)代碼都會(huì)對(duì)應(yīng)顯示一個(gè)黑白的出錯(cuò)頁(yè)面。使用 errorhandler() 裝飾器可以定制出錯(cuò)頁(yè)面:

    from flask import render_template@app.errorhandler(404) def page_not_found(error):return render_template('page_not_found.html'), 404

    注意 render_template() 后面的 404 ,這表示頁(yè)面對(duì)就的出錯(cuò) 代碼是 404 ,即頁(yè)面不存在。缺省情況下 200 表示:一切正常。

    關(guān)于響應(yīng)

    視圖函數(shù)的返回值會(huì)自動(dòng)轉(zhuǎn)換為一個(gè)響應(yīng)對(duì)象。如果返回值是一個(gè)字符串,那么會(huì)被 轉(zhuǎn)換為一個(gè)包含作為響應(yīng)體的字符串、一個(gè) 200 OK 出錯(cuò)代碼 和一個(gè) text/html 類型的響應(yīng)對(duì)象。如果返回值是一個(gè)字典,那么會(huì)調(diào)用 jsonify() 來(lái)產(chǎn)生一個(gè)響應(yīng)。以下是轉(zhuǎn)換的規(guī)則:

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

    設(shè)想有如下視圖:

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

    可以使用 make_response() 包裹返回表達(dá)式,獲得響應(yīng)對(duì)象,并對(duì)該對(duì)象 進(jìn)行修改,然后再返回:

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

    JSON 格式的 API

    JSON 格式的響應(yīng)是常見(jiàn)的,用 Flask 寫(xiě)這樣的 API 是很容易上手的。如果從視圖 返回一個(gè) dict ,那么它會(huì)被轉(zhuǎn)換為一個(gè) JSON 響應(yīng)。

    @app.route("/me") def me_api():user = get_current_user()return {"username": user.username,"theme": user.theme,"image": url_for("user_image", filename=user.image),}

    如果 dict 還不能滿足需求,還需要?jiǎng)?chuàng)建其他類型的 JSON 格式響應(yīng),可以使用 jsonify() 函數(shù)。該函數(shù)會(huì)序列化任何支持的 JSON 數(shù)據(jù)類型。 也可以研究研究 Flask 社區(qū)擴(kuò)展,以支持更復(fù)雜的應(yīng)用。

    @app.route("/users") def users_api():users = get_all_users()return jsonify([user.to_json() for user in users])

    會(huì)話

    除了請(qǐng)求對(duì)象之外還有一種稱為 session 的對(duì)象,允許你在不同請(qǐng)求 之間儲(chǔ)存信息。這個(gè)對(duì)象相當(dāng)于用密鑰簽名加密的 cookie ,即用戶可以查看你的 cookie ,但是如果沒(méi)有密鑰就無(wú)法修改它。

    使用會(huì)話之前你必須設(shè)置一個(gè)密鑰。舉例說(shuō)明:

    from flask import Flask, session, redirect, url_for, escape, requestapp = Flask(__name__)# Set the secret key to some random bytes. Keep this really secret! app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'@app.route('/') def index():if 'username' in session:return 'Logged in as %s' % escape(session['username'])return 'You are not logged in'@app.route('/login', methods=['GET', 'POST']) def login():if request.method == 'POST':session['username'] = request.form['username']return redirect(url_for('index'))return '''<form method="post"><p><input type=text name=username><p><input type=submit value=Login></form>'''@app.route('/logout') def logout():# remove the username from the session if it's theresession.pop('username', None)return redirect(url_for('index'))

    這里用到的 escape() 是用來(lái)轉(zhuǎn)義的。如果不使用模板引擎就可以像上例 一樣使用這個(gè)函數(shù)來(lái)轉(zhuǎn)義。

    如何生成一個(gè)好的密鑰
    生成隨機(jī)數(shù)的關(guān)鍵在于一個(gè)好的隨機(jī)種子,因此一個(gè)好的密鑰應(yīng)當(dāng)有足夠的隨機(jī)性。 操作系統(tǒng)可以有多種方式基于密碼隨機(jī)生成器來(lái)生成隨機(jī)數(shù)據(jù)。使用下面的命令 可以快捷的為 Flask.secret_key ( 或者 SECRET_KEY )生成值:
    $ python -c 'import os; print(os.urandom(16))'
    b'_5#y2L"F4Q8z\n\xec]/'


    基于 cookie 的會(huì)話的說(shuō)明: Flask 會(huì)取出會(huì)話對(duì)象中的值,把值序列化后儲(chǔ)存到 cookie 中。在打開(kāi) cookie 的情況下,如果需要查找某個(gè)值,但是這個(gè)值在請(qǐng)求中 沒(méi)有持續(xù)儲(chǔ)存的話,那么不會(huì)得到一個(gè)清晰的出錯(cuò)信息。請(qǐng)檢查頁(yè)面響應(yīng)中的 cookie 的大小是否與網(wǎng)絡(luò)瀏覽器所支持的大小一致。

    除了缺省的客戶端會(huì)話之外,還有許多 Flask 擴(kuò)展支持服務(wù)端會(huì)話。

    消息閃現(xiàn)

    一個(gè)好的應(yīng)用和用戶接口都有良好的反饋,否則到后來(lái)用戶就會(huì)討厭這個(gè)應(yīng)用。 Flask 通過(guò)閃現(xiàn)系統(tǒng)來(lái)提供了一個(gè)易用的反饋方式。閃現(xiàn)系統(tǒng)的基本工作原理是在請(qǐng)求結(jié)束時(shí) 記錄一個(gè)消息,提供且只提供給下一個(gè)請(qǐng)求使用。通常通過(guò)一個(gè)布局模板來(lái)展現(xiàn)閃現(xiàn)的 消息。

    flash() 用于閃現(xiàn)一個(gè)消息。在模板中,使用 get_flashed_messages() 來(lái)操作消息。

    日志

    有時(shí)候可能會(huì)遇到數(shù)據(jù)出錯(cuò)需要糾正的情況。例如因?yàn)橛脩舸鄹牧藬?shù)據(jù)或客戶端代碼出錯(cuò) 而導(dǎo)致一個(gè)客戶端代碼向服務(wù)器發(fā)送了明顯錯(cuò)誤的 HTTP 請(qǐng)求。多數(shù)時(shí)候在類似情況下 返回 400 Bad Request 就沒(méi)事了,但也有不會(huì)返回的時(shí)候,而代碼還得繼續(xù)運(yùn)行 下去。

    這時(shí)候就需要使用日志來(lái)記錄這些不正常的東西了。自從 Flask 0.3 后就已經(jīng)為你配置好 了一個(gè)日志工具。

    以下是一些日志調(diào)用示例:

    app.logger.debug('A value for debugging') app.logger.warning('A warning occurred (%d apples)', 42) app.logger.error('An error occurred')

    logger 是一個(gè)標(biāo)準(zhǔn)的 Logger Logger 類。

    總結(jié)

    以上是生活随笔為你收集整理的Flask 快速上手的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。