Flask 基礎(chǔ)筆記

路由

  • 要給 URL 添加變量部分,你可以把這些特殊的字段標(biāo)記為 <variable_name> , 這個(gè)部分將會(huì)作為命名參數(shù)傳遞到你的函數(shù)蓄愁。規(guī)則可以用 <converter:variable_name> 指定一個(gè)可選的轉(zhuǎn)換器
關(guān)鍵字 解釋
int 接受整數(shù)
float 同 int 双炕,但是接受浮點(diǎn)數(shù)
path 和默認(rè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
  • 唯一 URL / 重定向行為

待補(bǔ)充 / Werkzeug 文檔

Flask 的 URL 規(guī)則基于 Werkzeug 的路由模塊

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

@app.route('/about')
def about():
    return 'The about page'
  • 構(gòu)造 URL

以下例子就不用語(yǔ)言敘述了

>>> from flask import Flask, url_for
>>> app = Flask(__name__)
>>> @app.route('/')
... def index(): pass
...
>>> @app.route('/login')
... def login(): pass
...
>>> @app.route('/user/<username>')
... def profile(username): pass
...

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 方法
關(guān)鍵字 作用 常用
GET 瀏覽器告知服務(wù)器:只 獲取 頁(yè)面上的信息并發(fā)給我撮抓。這是最常用的方法
HEAD 瀏覽器告訴服務(wù)器:欲獲取信息妇斤,但是只關(guān)心 消息頭 。應(yīng)用應(yīng)像處理 GET 請(qǐng)求一樣來(lái)處理它胀滚,但是不分發(fā)實(shí)際內(nèi)容趟济。在 Flask 中你完全無(wú)需 人工 干預(yù),底層的 Werkzeug 庫(kù)已經(jīng)替你打點(diǎn)好了咽笼。
POST 瀏覽器告訴服務(wù)器:想在 URL 上 發(fā)布 新信息顷编。并且,服務(wù)器必須確保 數(shù)據(jù)已存儲(chǔ)且僅存儲(chǔ)一次剑刑。這是 HTML 表單通常發(fā)送數(shù)據(jù)到服務(wù)器的方法媳纬。
PUT 類似 POST 但是服務(wù)器可能觸發(fā)了存儲(chǔ)過(guò)程多次,多次覆蓋掉舊值施掏。你可 能會(huì)問(wèn)這有什么用钮惠,當(dāng)然這是有原因的∑甙牛考慮到傳輸中連接可能會(huì)丟失素挽,在 這種 情況下瀏覽器和服務(wù)器之間的系統(tǒng)可能安全地第二次接收請(qǐng)求,而 不破壞其它東西狸驳。因?yàn)?POST 它只觸發(fā)一次预明,所以用 POST 是不可能的。
DELETE 刪除給定位置的信息耙箍。
OPTIONS 給客戶端提供一個(gè)敏捷的途徑來(lái)弄清這個(gè) URL 支持哪些 HTTP 方法撰糠。 從 Flask 0.6 開(kāi)始,實(shí)現(xiàn)了自動(dòng)處理辩昆。
# 默認(rèn) method 為 get
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

靜態(tài)文件(static)

也就是 web 里常用的 CSS/ JavaScript 文件, Flask默認(rèn)配置路徑為/static 可以通過(guò) url_for('static', filename='style.css') 來(lái)獲取靜態(tài)文件的路徑

模版渲染

Flask 使用 Jinja2 模板引擎, 默認(rèn)模板路徑為/templates Jinja2文檔

from flask import render_template

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

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

  • request
# 想使用該對(duì)象,需要從 flask 模塊中導(dǎo)入
from flask import request

@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    if request.method == 'POST':
    # 訪問(wèn) form 屬性中的不存在的鍵會(huì)發(fā)生什么阅酪?會(huì)拋出一個(gè)特殊的 `KeyError` 異常
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_the_user_in(request.form['username'])
        else:
            error = 'Invalid username/password'
    return render_template('login.html', error=error)

# 獲取 url 上的參數(shù)( GET )   類似于 `?key=value`
# 如果訪問(wèn)不存在的 key 也會(huì)拋出`KeyError`, 建議 catch
searchword = request.args.get('q', '')
  • upload file
from flask import request

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        f.save('存在文件的路徑')
    ...

# 你可以訪問(wèn) filename 屬性知道上傳前文件在客戶端的文件名
# 但請(qǐng)記住, 永遠(yuǎn)不要信任這個(gè)值汁针,這個(gè)值是可以偽造的术辐。如果你要把文件按客戶端提供的 文件名存儲(chǔ)在服務(wù)器上,那么請(qǐng)把它傳遞給 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))
    ...
  • cookie

cookie 結(jié)構(gòu)為 dict, 取不存在的 key 會(huì)產(chǎn)生 keyError 異常

from flask import request
from flask import make_response

@app.route('/')
def index():
    resp = make_response(render_template(...))
    # 存
    resp.set_cookie('username', 'the username')
    # 取
    username = request.cookies.get('username')
    return resp

重定向&錯(cuò)誤

from flask import abort, redirect, url_for, render_template

@app.route('/')
def index():
    # 重定向到 login 函數(shù)
    return redirect(url_for('login'))

@app.route('/login')
def login():
    pass
    
@app.route('error')
def error():
    # 404
    abort(404)
    # this_is_never_executed
    
@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404

response

from flask import make_response

@app.errorhandler(404)
def not_found(error):
    resp = make_response(render_template('error.html'), 404)
    resp.headers['X-Something'] = 'A value'
    # 包裝的響應(yīng)對(duì)象
    return resp

session

暫無(wú)

logging

相關(guān)文檔-> logging 文檔

app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末施无,一起剝皮案震驚了整個(gè)濱河市术吗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帆精,老刑警劉巖较屿,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隧魄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡隘蝎,警方通過(guò)查閱死者的電腦和手機(jī)购啄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嘱么,“玉大人狮含,你說(shuō)我怎么就攤上這事÷瘢” “怎么了几迄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)冰评。 經(jīng)常有香客問(wèn)我映胁,道長(zhǎng),這世上最難降的妖魔是什么甲雅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任解孙,我火速辦了婚禮,結(jié)果婚禮上抛人,老公的妹妹穿的比我還像新娘弛姜。我一直安慰自己,他們只是感情好妖枚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布廷臼。 她就那樣靜靜地躺著,像睡著了一般绝页。 火紅的嫁衣襯著肌膚如雪中剩。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天抒寂,我揣著相機(jī)與錄音,去河邊找鬼掠剑。 笑死屈芜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朴译。 我是一名探鬼主播井佑,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼眠寿!你這毒婦竟也來(lái)了躬翁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盯拱,失蹤者是張志新(化名)和其女友劉穎盒发,沒(méi)想到半個(gè)月后例嘱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宁舰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年拼卵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛮艰。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腋腮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壤蚜,到底是詐尸還是另有隱情即寡,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布袜刷,位于F島的核電站聪富,受9級(jí)特大地震影響鲤孵,放射性物質(zhì)發(fā)生泄漏演怎。R本人自食惡果不足惜秧均,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一路鹰、第九天 我趴在偏房一處隱蔽的房頂上張望葡缰。 院中可真熱鬧屁桑,春花似錦拯爽、人聲如沸最蕾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至份殿,卻和暖如春膜钓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卿嘲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工颂斜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拾枣。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓沃疮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親梅肤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子司蔬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 1、安裝virtualenv 當(dāng)你擁有的項(xiàng)目越多姨蝴,同時(shí)使用不同版本的 Python 工作的可能性也就越大俊啼,...
    那夜你很美閱讀 323評(píng)論 0 0
  • 快速啟動(dòng) 是不是很渴望馬上開(kāi)始啊左医?這篇文檔將會(huì)很好的向你介紹Flask授帕。假設(shè)你已經(jīng)安裝好了Flask同木。如果還沒(méi)有安...
    催眠_(dá)a363閱讀 681評(píng)論 0 1
  • 快速開(kāi)始 在安裝Sanic之前,讓我們一起來(lái)看看Python在支持異步的過(guò)程中豪墅,都經(jīng)歷了哪些比較重大的更新泉手。 首先...
    hugoren閱讀 19,558評(píng)論 0 23
  • HelloWord程序 創(chuàng)建Python項(xiàng)目 打開(kāi)Pycharm,創(chuàng)建 pure Python類型的項(xiàng)目,創(chuàng)建項(xiàng)目...
    懵懂_傻孩紙閱讀 1,338評(píng)論 0 1
  • 第三章 模板 序 為什么要分離 易于維護(hù)的代碼偶器,關(guān)鍵在于保持簡(jiǎn)單的結(jié)構(gòu)斩萌。而我們之前編寫(xiě)的hello.py雖然簡(jiǎn)單,...
    科幻經(jīng)典閱讀 1,533評(píng)論 0 6