Flask學(xué)習(xí)之三----一些基礎(chǔ)概念1

一,調(diào)試模式
如果你啟用了調(diào)試支持,服務(wù)器會在代碼修改后自動重新載入受葛,并在發(fā)生錯誤時提供一個相當(dāng)有用的調(diào)試器。
有兩種途徑來啟用調(diào)試模式偎谁。一種是直接在應(yīng)用對象上設(shè)置:
app.debug = True
app.run()
另一種是作為 run 方法的一個參數(shù)傳入:
app.run(debug=True)
兩種方法的效果完全相同总滩。
默認(rèn)是開啟的。
二巡雨,route
route()裝飾器把一個函數(shù)綁定到對應(yīng)的 URL 上
如:
@app.route('/')
def index():
return 'Index Page'

@app.route('/hello')
def hello():
return 'Hello World'
三闰渔,變量規(guī)則
要給 URL 添加變量部分,你可以把這些特殊的字段標(biāo)記為 <variable_name> 铐望, 這個部分將會作為命名參數(shù)傳遞到你的函數(shù)冈涧。規(guī)則可以用 <converter:variable_name> 指定一個可選的轉(zhuǎn)換器。
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % username

@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
轉(zhuǎn)換器有下面幾種:
int 接受整數(shù)
float 同 int 正蛙,但是接受浮點數(shù)
path 和默認(rèn)的相似督弓,但也接受斜線
四,唯一 URL / 重定向行為
@app.route('/projects/')
def projects():
return 'The project page'

@app.route('/about')
def about():
return 'The about page'
第一種情況中乒验,指向 projects 的規(guī)范 URL 尾端有一個斜線愚隧。這種感覺很像在文件系統(tǒng)中的文件夾。訪問一個結(jié)尾不帶斜線的 URL 會被 Flask 重定向到帶斜線的規(guī)范 URL 去锻全。

然而狂塘,第二種情況的 URL 結(jié)尾不帶斜線,類似 UNIX-like 系統(tǒng)下的文件的路徑名鳄厌。訪問結(jié)尾帶斜線的 URL 會產(chǎn)生一個 404 “Not Found” 錯誤荞胡。
八,構(gòu)造 URL
可以用 url_for()來給指定的函數(shù)構(gòu)造 URL了嚎。它接受函數(shù)名作為第一個參數(shù)泪漂,也接受對應(yīng) URL 規(guī)則的變量部分的命名參數(shù)。未知變量部分會添加到 URL 末尾作為查詢參數(shù)。
九窖梁,HTTP 方法
HTTP (與 Web 應(yīng)用會話的協(xié)議)有許多不同的訪問 URL 方法赘风。默認(rèn)情況下夹囚,路由只回應(yīng) GET請求纵刘,但是通過route()裝飾器傳遞 methods參數(shù)可以改變這個行為。
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
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ā)了存儲過程多次,多次覆蓋掉舊值掠兄。你可 能會問這有什么用像云,當(dāng)然這是有原因的÷煜Γ考慮到傳輸中連接可能會丟失迅诬,在 這種 情況下瀏覽器和服務(wù)器之間的系統(tǒng)可能安全地第二次接收請求,而 不破壞其它東西婿牍。因為 POST 它只觸發(fā)一次百框,所以用 POST 是不可能的。
DELETE
刪除給定位置的信息牍汹。
OPTIONS
給客戶端提供一個敏捷的途徑來弄清這個 URL 支持哪些 HTTP 方法铐维。 從 Flask 0.6 開始,實現(xiàn)了自動處理慎菲。
在 HTML4 和 XHTML1 中嫁蛇,表單只能以 GET 和 POST 方法提交到服務(wù)器。但是 JavaScript 和未來的 HTML 標(biāo)準(zhǔn)允許你使用其它所有的方法露该。
五睬棚,靜態(tài)文件
動態(tài) web 應(yīng)用也會需要靜態(tài)文件,通常是 CSS 和 JavaScript 文件。
只要在你的包中或是模塊的所在目錄中創(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模板引擎。
你可以使用 render_template()方法來渲染模板暑中。你需要做的一切就是將模板名和你想作為關(guān)鍵字的參數(shù)傳入模板的變量壹瘟。這里有一個展示如何渲染模板的簡例:
from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
Flask 會在 templates 文件夾里尋找模板。所以鳄逾,如果你的應(yīng)用是個模塊稻轨,這個文件夾應(yīng)該與模塊同級;如果它是一個包雕凹,那么這個文件夾作為包的子目錄:
情況 1: 模塊:
/application.py
/templates
/hello.html
情況 2: 包:
/application
/init.py
/templates
/hello.html
Jinja2模板實例:
更多訪問http://docs.jinkan.org/docs/jinja2
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello World!</h1>
{% endif %}
在模板里殴俱,你也可以訪問 request、session和 g對象枚抵, 以及 get_flashed_messages函數(shù)线欲。
最起碼,模板繼承能使特定元素 (比如頁眉俄精、導(dǎo)航欄和頁腳)可以出現(xiàn)在所有的頁面询筏。
七,訪問請求數(shù)據(jù)
對于 Web 應(yīng)用竖慧,與客戶端發(fā)送給服務(wù)器的數(shù)據(jù)交互至關(guān)重要嫌套。在 Flask 中由全局的 request
對象來提供這些信息。如果你有一定的 Python 經(jīng)驗圾旨,你會好奇踱讨,為什么這個對象是全局的,為什么 Flask 還能保證線程安全砍的。答案是環(huán)境作用域
八痹筛,環(huán)境局部變量
單元測試的最簡單的解決方案是:用 test_request_context環(huán)境管理器。結(jié)合 with聲明廓鞠,綁定一個測試請求帚稠,這樣你才能與之交互。下面是一個例子:
from flask import request
with 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'
另一種可能是:傳遞整個 WSGI 環(huán)境給request_context方法:
from flask import request
with app.request_context(environ):
assert request.method == 'POST'
九床佳,請求對象
首先從 flask 模塊里導(dǎo)入它:
from flask import request
當(dāng)前請求的 HTTP 方法可通過 method 屬性來訪問滋早。通過:attr:~flask.request.form 屬性來訪問表單數(shù)據(jù)( POST 或 PUT 請求提交的數(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)
當(dāng)訪問 form屬性中的不存在的鍵會發(fā)生什么砌们?會拋出一個特殊的 KeyError異常杆麸。你可以像捕獲標(biāo)準(zhǔn)的 KeyError 一樣來捕獲它搁进。 如果你不這么做,它會顯示一個 HTTP 400 Bad Request 錯誤頁面昔头。所以饼问,多數(shù)情況下你并不需要干預(yù)這個行為。
你可以通過 args屬性來訪問 URL 中提交的參數(shù) ( ?key=value):
searchword = request.args.get('q', '')
推薦用 get 來訪問 URL 參數(shù)或捕獲 KeyError 揭斧,因為用戶可能會修改 URL莱革,向他們展現(xiàn)一個 400 bad request 頁面會影響用戶體驗。
十一未蝌,文件上傳
用 Flask 處理文件上傳很簡單驮吱。只要確保你沒忘記在 HTML 表單中設(shè)置 enctype="multipart/form-data" 屬性茧妒,不然你的瀏覽器根本不會發(fā)送文件萧吠。
已上傳的文件存儲在內(nèi)存或是文件系統(tǒng)中一個臨時的位置。你可以通過請求對象的 files
屬性訪問它們桐筏。每個上傳的文件都會存儲在這個字典里纸型。它表現(xiàn)近乎為一個標(biāo)準(zhǔn)的 Python file
對象,但它還有一個save()方法梅忌,這個方法允許你把文件保存到服務(wù)器的文件系統(tǒng)上狰腌。這里是一個用它保存文件的例子:
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')
...
如果你要把文件按客戶端提供的文件名存儲在服務(wù)器上,那么請把它傳遞給 Werkzeug 提供的secure_filename函數(shù):
from flask import request
from werkzeug 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 屬性是一個內(nèi)容為客戶端提交的所有 Cookies 的字典踱葛。如果你想使用會話丹莲,請不要直接使用 Cookies。在 Flask 中尸诽,已經(jīng)注意處理了一些 Cookies 安全細(xì)節(jié)甥材。
讀取 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ù)然后再進行修改商蕴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叠萍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绪商,更是在濱河造成了極大的恐慌苛谷,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件部宿,死亡現(xiàn)場離奇詭異抄腔,居然都是意外死亡瓢湃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門赫蛇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绵患,“玉大人,你說我怎么就攤上這事悟耘÷潋” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵暂幼,是天一觀的道長筏勒。 經(jīng)常有香客問我,道長旺嬉,這世上最難降的妖魔是什么管行? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮邪媳,結(jié)果婚禮上捐顷,老公的妹妹穿的比我還像新娘。我一直安慰自己雨效,他們只是感情好迅涮,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徽龟,像睡著了一般叮姑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上据悔,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天传透,我揣著相機與錄音,去河邊找鬼屠尊。 笑死旷祸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的讼昆。 我是一名探鬼主播托享,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浸赫!你這毒婦竟也來了闰围?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤既峡,失蹤者是張志新(化名)和其女友劉穎羡榴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體运敢,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡校仑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年忠售,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迄沫。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡稻扬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出羊瘩,到底是詐尸還是另有隱情泰佳,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布尘吗,位于F島的核電站逝她,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏睬捶。R本人自食惡果不足惜黔宛,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侧戴。 院中可真熱鬧宁昭,春花似錦跌宛、人聲如沸酗宋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜕猫。三九已至,卻和暖如春哎迄,著一層夾襖步出監(jiān)牢的瞬間回右,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工漱挚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留翔烁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓旨涝,卻偏偏與公主長得像蹬屹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子白华,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 22年12月更新:個人網(wǎng)站關(guān)停慨默,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,188評論 22 257
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)弧腥,斷路器厦取,智...
    卡卡羅2017閱讀 134,701評論 18 139
  • 快速啟動 是不是很渴望馬上開始啊管搪?這篇文檔將會很好的向你介紹Flask虾攻。假設(shè)你已經(jīng)安裝好了Flask铡买。如果還沒有安...
    催眠_a363閱讀 685評論 0 1
  • Quickstart http://flask.pocoo.org/docs/0.12/quickstart/ Q...
    icewinde閱讀 1,851評論 0 2
  • 前幾天,花了大力氣終于看完了著名的《三體》霎箍,看完全書寻狂,不禁對劉慈欣肅然起敬,因為朋沮,這部科幻小說不僅情節(jié)非常精彩蛇券,更...
    惠影風(fēng)華閱讀 1,753評論 1 3