Python Web框架--框架Flask--路由(二)

一炭晒、路由

路由通過使用Flask的app.route裝飾器來設(shè)置栋豫,這類似Java的Spring Web MVC木缝。

@app.route('/',methods=["POST","GET"])
def index():
    return 'Index Page'

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

route裝飾器會將其裝飾的視圖函數(shù)注冊到app的視圖函數(shù)集中沾乘,其主要有三個參數(shù):

1. 路徑變量

路由路徑也就是請求網(wǎng)址中不是固定的網(wǎng)址,而是含有變量的網(wǎng)址妖胀。
(注意,這里指的并不是網(wǎng)址惠勒?后面的get方式發(fā)送是參數(shù)赚抡,而是向www.example.com/1/test/中的1這個參數(shù),也可能是其他的數(shù)值纠屋。)路徑變量的語法是/path/<converter:varname>涂臣。在路徑變量前還可以使用可選的轉(zhuǎn)換器,有以下幾種轉(zhuǎn)換器售担。

轉(zhuǎn)換器 作用
string 默認(rèn)選項赁遗,接受除了斜杠之外的字符串
int 接受整數(shù)
float 接受浮點數(shù)
path 和string類似,不過可以接受帶斜杠的字符串
any 匹配任何一種轉(zhuǎn)換器
uuid 接受UUID字符串

示例:

@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):   # 函數(shù)參數(shù)中接收傳遞的參數(shù)
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

2. 查看URL

在Web程序中常常需要獲取某個試圖函數(shù)對應(yīng)的URL族铆,在Flask中需要使用url_for(‘方法名’)來構(gòu)造對應(yīng)方法的URL:

@app.route('/loginto')
def login():
    print(url_for('login'))   # 會打印出網(wǎng)址中主機(jī)名后的部分
    return 'Hello world!'
結(jié)果

3. HTTP參數(shù)獲取

使用route裝飾器的methods參數(shù)可以設(shè)置接收get或者post方法:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        print(request.form['userid'])  # 獲取post穿過來的參數(shù)
        dict = request.form.to_dict()  # 將請求參數(shù)解析成字典
        print(dict['userid'])
        return 'POST'
    else:
        print(request.args['userid'])   # 獲取get傳過來的參數(shù)
        dict = request.args.to_dict()  # 將請求參數(shù)解析成字典
        print(dict['userid'])
        return 'GET'

4. 獲取上傳文件

利用Flask也可以方便的獲取表單中上傳的文件岩四,只需要利用 request 的files屬性即可,這也是一個字典骑素,包含了被上傳的文件炫乓。如果想獲取上傳的文件名,可以使用filename屬性献丑,不過需要注意這個屬性可以被客戶端更改末捣,所以并不可靠。更好的辦法是利用werkzeug提供的secure_filename方法來獲取安全的文件名创橄。

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))

5. 返回內(nèi)容

返回字符串箩做、元組等可以直接返回。

1)返回字典使用

from flask import jsonify
@app.route('/test', methods=['GET', 'POST'])
def test():
    dict={'a':'a','b':'aaa'}
    return jsonify(dict)

2) 返回模板

from flask import render_template
@app.route('/test', methods=['GET', 'POST'])
def test():
    return render_template('index.html',name='aaa')  # 可以向模板傳遞參數(shù)

二妥畏、靜態(tài)文件

Web程序中常常需要處理靜態(tài)文件邦邦,在Flask中需要使用url_for函數(shù)并指定static端點名和文件名安吁。在上面的例子中url_for可以獲取函數(shù)名對應(yīng)的網(wǎng)址。下面的例子燃辖,url_for是寫在html模板中的鬼店,實際的文件應(yīng)是static/logo.png文件。
CSS:

h1 { margin: 0 0 30px 0; background: url({{ url_for('static', filename='logo.png') }}) }

三黔龟、模板生成

Flask默認(rèn)使用Jinja2作為模板妇智,F(xiàn)lask會自動配置Jinja 模板,所以我們不需要其他配置了氏身。默認(rèn)情況下巍棱,模板文件需要放在templates文件夾下。
使用 Jinja 模板蛋欣,只需要使用render_template函數(shù)并傳入模板文件名和參數(shù)名即可航徙。

from flask import render_template

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

相應(yīng)的模板文件如下。

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

四陷虎、日志輸出

Flask 為我們預(yù)配置了一個 Logger到踏,我們可以直接在程序中使用。這個Logger是一個標(biāo)準(zhǔn)的Python Logger泻红,所以我們可以向標(biāo)準(zhǔn)Logger那樣配置它夭禽。

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

六、Cookies

Flask也可以方便的處理Cookie谊路。使用方法很簡單讹躯,直接看官方的例子就行了。下面的例子是如何獲取cookie缠劝。

from flask import request

@app.route('/')
def index():
    username = request.cookies.get('username')
    # 使用 cookies.get(key) 代替 cookies[key] 避免
    # 得到 KeyError 如果cookie不存在

如果需要發(fā)送cookie給客戶端:

from flask import make_response

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

七潮梯、重定向和錯誤

redirect和abort函數(shù)用于重定向和返回錯誤頁面。

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()

默認(rèn)的錯誤頁面是一個空頁面惨恭,如果需要自定義錯誤頁面秉馏,可以使用errorhandler裝飾器。

from flask import render_template

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

八脱羡、自定義響應(yīng)http頭

默認(rèn)情況下萝究,F(xiàn)lask會根據(jù)函數(shù)的返回值自動決定如何處理響應(yīng):如果返回值是響應(yīng)對象,則直接傳遞給客戶端锉罐;如果返回值是字符串帆竹,那么就會將字符串轉(zhuǎn)換為合適的響應(yīng)對象。我們也可以自己決定如何設(shè)置響應(yīng)對象脓规,方法也很簡單栽连,使用make_response函數(shù)即可。

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

九、Sessions

我們可以使用全局對象session來管理用戶會話秒紧。Sesison 是建立在 Cookie 技術(shù)上的绢陌,不過在 Flask 中,我們還可以為 Session 指定密鑰熔恢,這樣存儲在 Cookie 中的信息就會被加密脐湾,從而更加安全。

from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)

@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 there
    session.pop('username', None)
    return redirect(url_for('index'))

# set the secret key.  keep this really secret:
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绩聘,一起剝皮案震驚了整個濱河市沥割,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凿菩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帜讲,死亡現(xiàn)場離奇詭異衅谷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)似将,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門获黔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人在验,你說我怎么就攤上這事玷氏。” “怎么了腋舌?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵盏触,是天一觀的道長。 經(jīng)常有香客問我块饺,道長赞辩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任授艰,我火速辦了婚禮辨嗽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淮腾。我一直安慰自己糟需,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布谷朝。 她就那樣靜靜地躺著洲押,像睡著了一般。 火紅的嫁衣襯著肌膚如雪徘禁。 梳的紋絲不亂的頭發(fā)上诅诱,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音送朱,去河邊找鬼娘荡。 笑死干旁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炮沐。 我是一名探鬼主播争群,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼大年!你這毒婦竟也來了换薄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤翔试,失蹤者是張志新(化名)和其女友劉穎轻要,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垦缅,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡冲泥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了壁涎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凡恍。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖怔球,靈堂內(nèi)的尸體忽然破棺而出嚼酝,到底是詐尸還是另有隱情,我是刑警寧澤竟坛,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布闽巩,位于F島的核電站,受9級特大地震影響流码,放射性物質(zhì)發(fā)生泄漏又官。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一漫试、第九天 我趴在偏房一處隱蔽的房頂上張望六敬。 院中可真熱鬧,春花似錦驾荣、人聲如沸外构。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至歧匈,卻和暖如春垒酬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工勘究, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留矮湘,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓口糕,卻偏偏與公主長得像缅阳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子景描,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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

  • 快速啟動 是不是很渴望馬上開始笆臁?這篇文檔將會很好的向你介紹Flask超棺。假設(shè)你已經(jīng)安裝好了Flask向族。如果還沒有安...
    催眠_(dá)a363閱讀 675評論 0 1
  • HelloWord程序 創(chuàng)建Python項目 打開Pycharm,創(chuàng)建 pure Python類型的項目,創(chuàng)建項目...
    懵懂_傻孩紙閱讀 1,329評論 0 1
  • flask文檔flask最佳實踐 已經(jīng)解釋的非常詳細(xì)了说搅,我這里只把我關(guān)注的點以我的理解記錄一下炸枣。 一:程序的基本結(jié)...
    m風(fēng)滿樓閱讀 2,377評論 0 4
  • 安裝 需要pip install flask這是一個十分輕便的框架,開發(fā)迅速弄唧,成本上相比Django框架要少很多,...
    dawsonenjoy閱讀 1,569評論 0 2
  • 我一如往常一樣早上是被熱醒的霍衫,我關(guān)了還在一直搖頭的電風(fēng)扇便準(zhǔn)備上班 夏蟬早一便開始賣弄自己的歌聲了候引,似乎是想告訴人...
    滄海一木閱讀 617評論 0 0