九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
超實用的Flask入門基礎(chǔ)教程,新手必備!
Flask入門基礎(chǔ)教程
Flask簡介
Flask是一個輕量級的可定制框架,使用Python語言編寫,較其他同類型框架更為靈活、輕便、安全且容易上手。它可以很好地結(jié)合MVC模式進行開發(fā),開發(fā)人員分工合作,小型團隊在短時間內(nèi)就可以完成功能豐富的中小型網(wǎng)站或Web服務(wù)的實現(xiàn)。另外,F(xiàn)lask還有很強的定制性,用戶可以根據(jù)自己的需求來添加相應(yīng)的功能,在保持核心功能簡單的同時實現(xiàn)功能的豐富與擴展,其強大的插件庫可以讓用戶實現(xiàn)個性化的網(wǎng)站定制,開發(fā)出功能強大的網(wǎng)站。
安裝Flask
依賴
當安裝 Flask 時,以下配套軟件會被自動安裝:
> - Werkzeug 用于實現(xiàn) WSGI 是一個 WSGI(在 Web 應(yīng)用和多種服務(wù)器之間的標準 Python 接口) 工具集。
> - jinja2是Python的一個流行的模板引擎。Web模板系統(tǒng)將模板與特定數(shù)據(jù)源組合以呈現(xiàn)動態(tài)網(wǎng)頁。
> - MarkupSafe 與 Jinja 共用,在渲染頁面時用于避免不可信的輸入,防止注入攻擊。
> - ItsDangerous 保證數(shù)據(jù)完整性的安全標志數(shù)據(jù),用于保護 Flask 的 session cookie.
> - Click 是一個命令行應(yīng)用的框架。用于提供 flask 命令,并允許添加自定義 管理命令。
創(chuàng)建虛擬環(huán)境
創(chuàng)建文件夾,在文件夾下面 輸入命令
?
1
python -m venv venv_name
激活虛擬環(huán)境
激活這個虛擬環(huán)境(注意,使用的是虛擬環(huán)境的話前面會有(venv_name)這個顯示的,不然就是沒有激活虛擬環(huán)境。)
?
1
venv_name\Scripts\activate
安裝Flask
在已激活的虛擬環(huán)境中使用pip安裝Flask
?
1
pip install Flask
基礎(chǔ)介紹
在Flask中,最基礎(chǔ)的一個功能是這樣子的
from flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True, host='0.0.0.0', port=5000)
首先,我們導(dǎo)入了Flask類。
其次我們創(chuàng)建了Flask的實例,第一個參數(shù)是應(yīng)用模塊或者包的名稱。 如果你使用單一的模塊(如本例),你應(yīng)該使用 __name__ ,因為模塊的名稱將會因其作為單獨應(yīng)用啟動還是作為模塊導(dǎo)入而有不同( 也即是 '__main__' 或?qū)嶋H的導(dǎo)入名)。這是必須的,這樣 Flask 才知道到哪去找模板、靜態(tài)文件等等。
route()是一個路由,其實是一個裝飾器,在其中輸入URL,會幫我們在這個URL下執(zhí)行對應(yīng)的方法。
接著是函數(shù)主體,可以寫方法也可以調(diào)用其他方法的返回值,最后返回到瀏覽器上顯示的信息
最后我們用 run() 函數(shù)來讓應(yīng)用運行在本地服務(wù)器上。 其中 if __name__ =='__main__': 確保服務(wù)器只會在該腳本被 Python 解釋器直接執(zhí)行的時候才會運行,而不是作為模塊導(dǎo)入的時候。debug=True開啟了調(diào)試模式,相當于在發(fā)生錯誤時提供一個相當有用的調(diào)試器。host=’0.0.0.0'可以允許同一個局域網(wǎng)內(nèi)別的用戶訪問,這個方法讓操作系統(tǒng)監(jiān)聽所有公網(wǎng) IP。port自定義端口。
路由
現(xiàn)代Web框架使用路由技術(shù)來幫助用戶記住應(yīng)用程序URL。可以直接訪問所需的頁面,而無需從主頁導(dǎo)航。Flask中的route()裝飾器用于將URL綁定到函數(shù)。例如:
@app.route('/index')def index():return 'This is a index page...'
在這里,URL '/ index' 規(guī)則綁定到index()函數(shù)。 因此,如果用戶訪問127.0.0.1:5000/index,index()函數(shù)的輸出將在瀏覽器中呈現(xiàn)。
變量規(guī)則
通過把 URL 的一部分標記為 <variable_name> 就可以在 URL 中添加變量。標記的 部分會作為關(guān)鍵字參數(shù)傳遞給函數(shù)。通過使用 <converter:variable_name> ,可以 選擇性的加上一個轉(zhuǎn)換器,為變量指定規(guī)則。請看下面的例子:
@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 接受正浮點數(shù)
path類似string,但可以包含斜杠
uuid 接受UUID字符串
唯一 URL / 重定向行為
Flask的URL規(guī)則是基于Werkzeug的路由模塊。模塊背后的思想是基于 Apache 以及更早的 HTTP 服務(wù)器主張的先例,保證優(yōu)雅且唯一的 URL。
@app.route('/projects/')def projects():return 'The project page'@app.route('/about')def about():return 'The about page'
訪問第一個路由不帶/時,F(xiàn)lask會自動重定向到正確地址。
訪問第二個路由時末尾帶上/后Flask會直接報404 NOT FOUND錯誤。
永久性重定向和暫時性重定向
flask是通過flask.redirect(location,code=302)這個函數(shù)來實現(xiàn)重定向的,location是需要重定向到的url,應(yīng)該配合之前講的在url_for()函數(shù)來使用,code表示哪種重定向,默認302,也即暫時性重定向,301是永久性重定向.
構(gòu)建URL
如果 Flask 能匹配 URL,那么 Flask 可以生成它們嗎?當然可以。你可以用 url_for()來給指定的函數(shù)構(gòu)造 URL。它接受函數(shù)名作為第一個參數(shù),也接受對應(yīng) URL 規(guī)則的變量部分的命名參數(shù)。未知變量部分會添加到 URL 末尾作為查詢參數(shù)。
例如,這里我們使用 test_request_context() 方法來嘗試使用 url_for() 。 test_request_context() 告訴 Flask 正在處理一個請求,而實際上也許我們正處在交互 Python shell 之中, 并沒有真正的請求。
from flask import Flask, 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')) #輸出 /loginprint(url_for('login', next='/')) #輸出 /login?next=/print(url_for('profile', username='John Doe')) #輸出 /user/John%20Doe
那么為什么不在把 URL 寫死在模板中,而要使用反轉(zhuǎn)函數(shù) url_for() 動態(tài)構(gòu)建?
反轉(zhuǎn)通常比硬編碼 URL 的描述性更好。
你可以只在一個地方改變 URL ,而不用到處亂找。
URL 創(chuàng)建會為你處理特殊字符的轉(zhuǎn)義和 Unicode 數(shù)據(jù),比較直觀。
生產(chǎn)的路徑總是絕對路徑,可以避免相對路徑產(chǎn)生副作用。
如果你的應(yīng)用是放在 URL 根路徑之外的地方(如在 /myapplication 中,不在 / 中), url_for() 會為你妥善處理。
HTTP方法
Web 應(yīng)用使用不同的 HTTP 方法處理 URL 。當你使用 Flask 時,應(yīng)當熟悉 HTTP 方法。 缺省情況下,一個路由只回應(yīng) GET 請求。 可以使用 route() 裝飾器的 methods 參數(shù)來處理不同的 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()如果當前使用了 GET 方法, Flask 會自動添加 HEAD 方法支持,并且同時還會 按照 HTTP RFC 來處理 HEAD 請求。同樣, OPTIONS 也會自動實現(xiàn)。
HTTP 方法(也經(jīng)常被叫做“謂詞”)告知服務(wù)器,客戶端想對請求的頁面 做 些什么。下面的都是非常常見的方法:
GET:瀏覽器告知服務(wù)器:只 獲取 頁面上的信息并發(fā)給我。這是最常用的方法。
HEAD:瀏覽器告訴服務(wù)器:欲獲取信息,但是只關(guān)心 消息頭。應(yīng)用應(yīng)像處理 GET 請求一樣來處理它,但是不分發(fā)實際內(nèi)容。在 Flask 中你完全無需 人工 干預(yù),底層的 Werkzeug 庫已經(jīng)替你打點好了。
POST:瀏覽器告訴服務(wù)器:想在 URL 上 發(fā)布 新信息。并且,服務(wù)器必須確保 數(shù)據(jù)已存儲且僅存儲一次。這是HTML 表單通常發(fā)送數(shù)據(jù)到服務(wù)器的方法。
PUT:類似 POST 但是服務(wù)器可能觸發(fā)了存儲過程多次,多次覆蓋掉舊值。你可能會問這有什么用,當然這是有原因的。考慮到傳輸中連接可能會丟失,在 這種
情況下瀏覽器和服務(wù)器之間的系統(tǒng)可能安全地第二次接收請求,而不破壞其它東西。因為 POST它只觸發(fā)一次,所以用 POST是不可能的。
DELETE:刪除給定位置的信息。
OPTIONS:給客戶端提供一個敏捷的途徑來弄清這個 URL 支持哪些 HTTP 方法。從 Flask 0.6 開始,實現(xiàn)了自動處理。
Request對象
from flask import Flask,jsonifyfrom flask import request@app.route('/api/add', methods=['POST'])def add_elasticsearch():city_name = request.form.get('city_name')diagnose_people = request.form.get('diagnose_people')suspect_people = request.form.get('suspect_people')death_people = request.form.get('death_people')cure_people = request.form.get('cure_people')result = main.FuncUtil.add_es(city_name, diagnose_people, suspect_people, death_people, cure_people)return jsonify(result)
request中”method”變量可以獲取當前請求的方法,即”GET”, “POST”, “DELETE”, “PUT”等?!眆orm”變量是一個字典,可以獲取Post請求表單中的內(nèi)容,如果提交的表單中不存在,則會返回一個”KeyError”,你可以不捕獲,頁面會返回400錯誤(想避免拋出這”KeyError”,你可以用request.form.get(“user”)來替代)。而”request.args.get()”方法則可以獲取Get請求URL中的參數(shù),該函數(shù)的第二個參數(shù)是默認值,當URL參數(shù)不存在時,則返回默認值。在后文的請求對象會講到。
靜態(tài)文件
動態(tài) web 應(yīng)用也會需要靜態(tài)文件,通常是 CSS 和 JavaScript 文件。理想狀況下, 你已經(jīng)配置好 Web 服務(wù)器來提供靜態(tài)文件,但是在開發(fā)中,F(xiàn)lask 也可以做到。 只要在你的包中或是模塊的所在目錄中創(chuàng)建一個名為 static 的文件夾,在應(yīng)用中使用 /static 即可訪問。
給靜態(tài)文件生成 URL ,使用特殊的 'static' 端點名:
url_for('static', filename='style.css')
這個文件應(yīng)該存儲在文件系統(tǒng)上的 static/style.css 。
模板渲染
Flask的模板功能是基于Jinja2模板引擎實現(xiàn)的。讓我們來實現(xiàn)一個例子。修改之前的Flask運行文件,代碼如下:
from flask import Flask,render_templateapp = Flask(__name__)@app.route('/hello/<name>')def hello_world(name=None):return render_template('hello.html', name=name)if __name__ == '__main__':app.run(debug=True, host='0.0.0.0', port=5000)
這段代碼”hello()”函數(shù)并不是直接返回字符串,而是調(diào)用了”render_template()”方法來渲染模板。方法的第一個參數(shù)”hello.html”指向你想渲染的模板名稱,第二個參數(shù)”name”是你要傳到模板去的變量,變量可以傳多個。接下來我們創(chuàng)建模板文件。在當前目錄下,創(chuàng)建一個子目錄”templates”(注意,一定要使用這個名字)。然后在”templates”目錄下創(chuàng)建文件”hello.html”,內(nèi)容如下:
<!doctype html><title>Hello Reader</title>{% if name %}<h1>Hello {{ name }}!</h1>{% else %}<h1>Hello World!</h1>{% endif %}
這是一個HTML模板,根據(jù)”name”變量的值,顯示不同的內(nèi)容。變量或表達式由”{{ }}”修飾,而控制語句由”{% %}”修飾,其他的代碼,就是我們常見的HTML。打開瀏覽器,輸入”http://127.0.0.1:5000/hello/Reader”,頁面上即顯示大標題”Hello Reader !”。
模板繼承
一般我們的網(wǎng)站雖然頁面多,但是很多部分是重用的,比如頁首,頁腳,導(dǎo)航欄之類的。對于每個頁面,都要寫這些代碼,很麻煩。Flask的Jinja2模板支持模板繼承功能,省去了這些重復(fù)代碼。讓我們基于上面的例子,在”templates”目錄下,創(chuàng)建一個名為”layout.html”的模板:
<!doctype html><title>Hello xxx</title><link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}"><div class="page">{% block body %}{% endblock %}</div>
再修改之前的”hello.html”,把原來的代碼定義在”block body”中,并在代碼一開始”繼承”上面的”layout.html”:
{% extends "layout.html" %}{% block body %}{% if name %}<h1>Hello {{ name }}!</h1>{% else %}<h1>Hello World!</h1>{% endif %}{% endblock %}
打開瀏覽器,再看下”http://127.0.0.1:5000/hello/Reader”頁面的源碼。
<!doctype html><title>Hello xxx</title><link rel="stylesheet" type="text/css" href="/static/style.css"><div class="page"><h1>Hello Reader!</h1></div>
你會發(fā)現(xiàn),雖然”render_template()”加載了”hello.html”模板,但是”layout.html”的內(nèi)容也一起被加載了。而且”hello.html”中的內(nèi)容被放置在”layout.html”中”{% block body %}”的位置上。形象的說,就是”hello.html”繼承了”layout.html”。
訪問請求數(shù)據(jù)
對于 Web 應(yīng)用,與客戶端發(fā)送給服務(wù)器的數(shù)據(jù)交互至關(guān)重要。在 Flask 中由全局的 request 對象來提供這些信息。如果你有一定的 Python 經(jīng)驗,你會好奇,為什么這個對象是全局的,為什么 Flask 還能保證線程安全。答案是本地環(huán)境。
本地環(huán)境
Flask 中的某些對象是全局對象,但卻不是通常的那種。這些對象實際上是特定環(huán)境的局部對象的代理。雖然很拗口,但實際上很容易理解。
想象一下處理線程的環(huán)境。一個請求傳入,Web 服務(wù)器決定生成一個新線程( 或者別的什么東西,只要這個底層的對象可以勝任并發(fā)系統(tǒng),而不僅僅是線程)。 當 Flask 開始它內(nèi)部的請求處理時,它認定當前線程是活動的環(huán)境,并綁定當前的應(yīng)用和 WSGI 環(huán)境到那個環(huán)境上(線程)。它的實現(xiàn)很巧妙,能保證一個應(yīng)用調(diào)用另一個應(yīng)用時不會出現(xiàn)問題。
所以,這對你來說意味著什么?除非你要做類似單元測試的東西,否則你基本上可以完全無視它。你會發(fā)現(xiàn)依賴于一段請求對象的代碼,因沒有請求對象無法正常運行。解決方案是,自行創(chuàng)建一個請求對象并且把它綁定到環(huán)境中。單元測試的最簡單的解決方案是:用 test_request_context() 環(huán)境管理器。結(jié)合 with 聲明,綁定一個測試請求,這樣你才能與之交互。下面是一個例子:
from flask import requestwith app.test_request_context('/hello', method='POST'):# 現(xiàn)在,你可以對請求執(zhí)行某些操作,直到with塊結(jié)束為止,例如基本斷言:assert request.path == '/hello'assert request.method == 'POST'
另一種可能是:傳遞整個 WSGI 環(huán)境給 request_context() 方法:
from flask import requestwith app.request_context(environ):assert request.method == 'POST'
請求對象
通過使用 method 屬性可以操作當前請求方法,通過使用 form 屬性處理表單數(shù)據(jù)(在 POST 或者 PUT 請求 中傳輸?shù)臄?shù)據(jù))。以下是使用上述兩個屬性的例子:
from flask import render_template@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'#如果請求方法為GET或憑據(jù)無效,則執(zhí)行以下代碼return render_template('login.html', error=error)
當 form 屬性中不存在這個鍵時會發(fā)生什么?會引發(fā)一個 KeyError 。 如果你不像捕捉一個標準錯誤一樣捕捉 KeyError ,那么會顯示一個 HTTP 400 Bad Request 錯誤頁面。因此,多數(shù)情況下你不必處理這個問題。
要操作 URL (如 ?key=value )中提交的參數(shù)可以使用 args 屬性:
searchword = request.args.get('key', '')
用戶可能會改變 URL 導(dǎo)致出現(xiàn)一個 400 請求出錯頁面,這樣降低了用戶友好度。因此, 我們推薦使用 get 或通過捕捉 KeyError 來訪問 URL 參數(shù)。
文件上傳
用 Flask 處理文件上傳很容易,只要確保不要忘記在你的 HTML 表單中設(shè)置 enctype="multipart/form-data" 屬性就可以了。否則瀏覽器將不會傳送你的文件。
已上傳的文件被儲存在內(nèi)存或文件系統(tǒng)的臨時位置。你可以通過請求對象 files 屬性來訪問上傳的文件。每個上傳的文件都儲存在這個 字典型屬性中。這個屬性基本和標準 Python file 對象一樣,另外多出一個 用于把上傳文件保存到服務(wù)器的文件系統(tǒng)中的 save() 方法。下例展示其如何運作:
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 屬性。但是請牢記這個值是 可以偽造的,永遠不要信任這個值。如果想要把客戶端的文件名作為服務(wù)器上的文件名, 可以通過 Werkzeug 提供的 secure_filename() 函數(shù):
from flask import requestfrom 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
要訪問 cookies ,可以使用 cookies 屬性??梢允褂庙憫?yīng) 對象 的 set_cookie 方法來設(shè)置 cookies 。請求對象的 cookies 屬性是一個包含了客戶端傳輸?shù)乃?cookies 的字典。在 Flask 中,如果使用 會話 ,那么就不要直接使用 cookies ,因為 會話 比較安全一些。
讀取 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.
儲存 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)對象上。通常只是從視圖函數(shù)返回字符串, Flask 會把它們 轉(zhuǎn)換為響應(yīng)對象。如果你想顯式地轉(zhuǎn)換,那么可以使用 make_response() 函數(shù),然后再修改它。
使用 延遲的請求回調(diào) 方案可以在沒有響應(yīng)對象的情況下設(shè)置一個 cookie 。
重定向和錯誤
你可以用 redirect() 函數(shù)把用戶重定向到其它地方。放棄請求并返回錯誤代碼,用 abort() 函數(shù)。這里是一個它們?nèi)绾问褂玫睦?
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()
這是一個相當無意義的例子因為用戶會從主頁重定向到一個不能訪問的頁面 (401 意味著禁止訪問),但是它展示了重定向是如何工作的。
默認情況下,錯誤代碼會顯示一個黑白的錯誤頁面。如果你要定制錯誤頁面, 可以使用 errorhandler() 裝飾器:
from flask import render_template@app.errorhandler(404)def page_not_found(error):return render_template('page_not_found.html'), 404
注意 render_template() 調(diào)用之后的 404 。這告訴 Flask,該頁的錯誤代碼是 404 ,即沒有找到。默認為 200,也就是一切正常。
響應(yīng)
視圖函數(shù)的返回值會被自動轉(zhuǎn)換為一個響應(yīng)對象。如果返回值是一個字符串, 它被轉(zhuǎn)換為該字符串為主體的、狀態(tài)碼為 200 OK的 、 MIME 類型是text/html 的響應(yīng)對象。Flask 把返回值轉(zhuǎn)換為響應(yīng)對象的邏輯是這樣:
> 1. 如果返回的是一個合法的響應(yīng)對象,它會從視圖直接返回。
> 2. 如果返回的是一個字符串,響應(yīng)對象會用字符串數(shù)據(jù)和默認參數(shù)創(chuàng)建。
> 3. 如果返回的是一個字典,那么調(diào)用 jsonify 創(chuàng)建一個響應(yīng)對象。
> 4. 如果返回的是一個元組,且元組中的元素可以提供額外的信息。這樣的元組必須是(response, status, headers) 的形式,且至少包含一個元素。 status 值會覆蓋狀態(tài)代碼, headers可以是一個列表或字典,作為額外的消息標頭值。
> 5. 如果上述條件均不滿足, Flask 會假設(shè)返回值是一個合法的 WSGI應(yīng)用程序,并轉(zhuǎn)換為一個請求對象。 如果你想在視圖里操縱上述步驟結(jié)果的響應(yīng)對象,可以使用 make_response() 函數(shù)。
譬如你有這樣一個視圖:
@app.errorhandler(404)def not_found(error):return render_template('error.html'), 404
你只需要把返回值表達式傳遞給 make_response() ,獲取結(jié)果對象并修改,然后再返回它:
@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)是常見的,用 Flask 寫這樣的 API 是很容易上手的。如果從視圖 返回一個 dict ,那么它會被轉(zhuǎn)換為一個 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 還不能滿足需求,還需要創(chuàng)建其他類型的 JSON 格式響應(yīng),可以使用 jsonify() 函數(shù)。該函數(shù)會序列化任何支持的 JSON 數(shù)據(jù)類型。 也可以研究研究 Flask 社區(qū)擴展,以支持更復(fù)雜的應(yīng)用。
@app.route("/users")def users_api():users = get_all_users()return jsonify([user.to_json() for user in users])
會話
除了請求對象之外還有一種稱為 session 的對象,允許你在不同請求 之間儲存信息。這個對象相當于用密鑰簽名加密的 cookie ,即用戶可以查看你的 cookie ,但是如果沒有密鑰就無法修改它。
使用會話之前你必須設(shè)置一個密鑰。舉例說明:
from flask import Flask, session, redirect, url_for, escape, requestapp = Flask(__name__)#設(shè)置一個隨機密鑰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() 是用來轉(zhuǎn)義的。如果不使用模板引擎就可以像上例 一樣使用這個函數(shù)來轉(zhuǎn)義。
如何生成一個好的密鑰
生成隨機數(shù)的關(guān)鍵在于一個好的隨機種子,因此一個好的密鑰應(yīng)當有足夠的隨機性。 操作系統(tǒng)可以有多種方式基于密碼隨機生成器來生成隨機數(shù)據(jù)。使用下面的命令 可以快捷的為 Flask.secret_key ( 或者 SECRET_KEY )生成值:
import os print(os.urandom(16)) #b'_5#y2L"F4Q8z\n\xec]/'
基于 cookie 的會話的說明: Flask 會取出會話對象中的值,把值序列化后儲存到 cookie 中。在打開 cookie 的情況下,如果需要查找某個值,但是這個值在請求中 沒有持續(xù)儲存的話,那么不會得到一個清晰的出錯信息。請檢查頁面響應(yīng)中的 cookie 的大小是否與網(wǎng)絡(luò)瀏覽器所支持的大小一致。
除了缺省的客戶端會話之外,還有許多 Flask 擴展支持服務(wù)端會話。
消息閃現(xiàn)
一個好的應(yīng)用和用戶接口都有良好的反饋,否則到后來用戶就會討厭這個應(yīng)用。 Flask 通過閃現(xiàn)系統(tǒng)來提供了一個易用的反饋方式。閃現(xiàn)系統(tǒng)的基本工作原理是在請求結(jié)束時 記錄一個消息,提供且只提供給下一個請求使用。通常通過一個布局模板來展現(xiàn)閃現(xiàn)的 消息。
flash() 用于閃現(xiàn)一個消息。在模板中,使用 get_flashed_messages() 來操作消息
日志
有時候可能會遇到數(shù)據(jù)出錯需要糾正的情況。例如因為用戶篡改了數(shù)據(jù)或客戶端代碼出錯 而導(dǎo)致一個客戶端代碼向服務(wù)器發(fā)送了明顯錯誤的 HTTP 請求。多數(shù)時候在類似情況下 返回 400 Bad Request 就沒事了,但也有不會返回的時候,而代碼還得繼續(xù)運行下去。
這時候就需要使用日志來記錄這些不正常的東西了。自從 Flask 0.3 后就已經(jīng)為你配置好 了一個日志工具。
以下是一些日志調(diào)用示例:
app.logger.debug('A value for debugging')app.logger.warning('A warning occurred (%d apples)', 42)app.logger.error('An error occurred')
部署到 Web 服務(wù)器
準備好部署你的 Flask 應(yīng)用了嗎?你可以立即部署到付費的或者免費的服務(wù)器來完成快速入門。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
盤點Python網(wǎng)頁開發(fā)輕量級框架Flask知識(下篇)
python:接口開發(fā)
Flask搭建簡單服務(wù)器
Flask的Blueprints和Views
python后臺Flask 快速入門
初識Flask
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服