flask框架url與重定向操作實(shí)例詳解
本文實(shí)例講述了flask框架url與重定向操作。分享給大家供大家參考,具體如下:
1. url與函數(shù)的映射
當(dāng)我們新建一個flask項目的時候,默認(rèn)就會有一個hello_world函數(shù),如下面這樣
@app.route('/')
def hello_world():
return 'hello world'
上面函數(shù)中,app.route()的參數(shù)就是我們的url,當(dāng)我們啟動項目的時候,我們在瀏覽器中輸入127.0.0.1:5000,就能夠訪問到我們這個視圖了,因?yàn)?就是代表"根url",所以我們只需要ip地址和端口就訪問到了我們的這個函數(shù)視圖。
當(dāng)我們將app.route()的參數(shù)改為'/hello/'時,那我們訪問這個視圖就需要輸入網(wǎng)址為127.0.0.1:5000/hello/才能訪問到我們的這個視圖了,
這就是flask中url與函數(shù)的映射。
2. url傳入?yún)?shù)
- url中包含參數(shù)
當(dāng)我們訪問CSDN,博客園,簡書等網(wǎng)站中的文章詳情的時候,我們會發(fā)現(xiàn)起始每篇文章的詳情頁面的url前面不封都是一樣的,只有后面一部分不一樣。那么這個不一樣的部分我們就可以當(dāng)做一個參數(shù)傳入視圖中,然后我們在視圖中拿到相應(yīng)的參數(shù)在進(jìn)行相應(yīng)的操作,返回相應(yīng)的數(shù)據(jù)。那么在flask中怎樣實(shí)現(xiàn)這個功能呢?
@app.route('/article_detail/<article_id>/')
def article_detail(article_id):
return "你查看到文章id 為 %s" % article_id
在上面的函數(shù)視圖中,app.route()中用<>這個包裹起來的就是我們定義的參數(shù),這里我們就定義了一個article_id這樣的參數(shù)。當(dāng)我們在url中定義了一個參數(shù)之后,我們必須也在函數(shù)中寫入這個參數(shù),而且參數(shù)名必須和url中的參數(shù)名一致。然后我們就可以在視圖中拿到article_id這個參數(shù)的值了。
然后啟動項目,在瀏覽器中輸入127.0.0.1:5000/article_detail/3/等相似 的url,就能夠查看到相應(yīng)的效果了。
上面的例子中雖然我們能夠?qū)?shù)通過url傳入函數(shù)視圖中,但是我們并不能對url做類型限制,比如我們想要的article_id必須是一個int數(shù)據(jù),當(dāng)用戶傳入的參數(shù)不是int型的數(shù)據(jù)的時候,那么他就訪問不到我們這個函數(shù)視圖.出現(xiàn)404頁面.那么flask中怎樣實(shí)現(xiàn)這樣這個需求呢?
在flask中,我們是可以對url指定類型的。
@app.route('/article_detail/<int:article_id>/')
def article_detail(article_id):
return "你查看到文章id 為 %s" % article_id
這樣,我們就對傳入的參數(shù)做了類型限制。只需要參數(shù)前面寫上我們的類型就可以了.
在flask中,除了支持int類型外,還支持以下類型:
- string: 默認(rèn)的數(shù)據(jù)類型,接受沒有任何斜杠/的字符串。
- int: 整形
- float: 浮點(diǎn)型。
- path: 和string類似,但是可以傳遞斜杠/。
- uuid: uuid類型的字符串。(什么是uuid?)
- any:可以指定多種路徑,這個通過一個例子來進(jìn)行說明:
@app.route('/<any(blog,article):url_path>/<int:id>/')
def detail(url_path,id):
if url_path == 'blog':
return 'blog detail is ' + str(id)
else:
return 'article detail is ' + str(id)
這樣,我們在瀏覽器中輸入127.0.0.1:5000/blog/3/或127.0.0.1:5000/article/3/都能夠訪問到這個視圖,那么我們怎么知道當(dāng)前是以哪個url訪問的呢,我們可以通過:后面我們定義的url_path參數(shù)來接受這個值,然后我們在視圖中也要寫入這個參數(shù)。然后我們就能拿到這個值了.
- url中以查詢字符竄的方式傳遞參數(shù)(get請求)
有些時候,我們并不需要向上面那樣傳遞參數(shù),通過?xxx=xxx這樣的形式傳遞參數(shù)。
那么在flask中,我們怎樣得到這種參數(shù)的值呢?
from flask import request
@app.route('/search/')
def search():
name = request.args.get('name')
return "查詢字符串傳入?yún)?shù) %s" % name
比如在上面的視圖函數(shù)中,我想傳入name=xxx,以查詢字符竄的方式(get請求),那么我們直接在瀏覽器中輸入127.0.0.1:5000/search/?name=xxx,然后我們在函數(shù)視圖中通過request.args.get()方法就能夠拿到這個值了。
如果我們url中沒有傳入name這個參數(shù),那么我們的程序也不會報錯,只會得到一個None,并不會影響我們代碼的運(yùn)行。
3. 構(gòu)造url,url_for的使用
在上面的代碼中,都是通過在瀏覽器中輸入url,從而找到我們的視圖函數(shù)。那么我們可不可以反過來呢,知道視圖函數(shù),從而得到相應(yīng)的url。
這個時候我們就需要使用url_for了,首先我們的先導(dǎo)入。
from flask import url_for
@app.route('/url_for/')
def url_for_demo():
return 'url_for_demo'
@app.route('/index/')
def index():
# 函數(shù)的名字
return url_for('url_for_demo')
url_for中參數(shù)為函數(shù)的名字,如果傳入的函數(shù)不存在就會報錯。讓我們在瀏覽器中輸入127.0.0.1:5000/index/的時候,我們就能夠看到url_for_demo這個函數(shù)對應(yīng)的url了。沒有參數(shù)的url學(xué)會了,那么如果url中攜帶參數(shù)怎么辦?
在url_for這個函數(shù)中,我們也是可以傳入關(guān)鍵字參數(shù)的,只需要和url中的參數(shù)對應(yīng)上就好了。
@app.route('/article/<int:article_id>/')
def article_detail(article_id):
return "article id is " + str(article_id)
@app.route('/index/')
def index():
# 注意 這里的關(guān)鍵字參數(shù)的key不是隨便取的,必須的和該函數(shù)對應(yīng)的url中參數(shù)名一樣
url = url_for('article_detail',article_id=2)
return url
這樣,我們也能在url_for中傳入url的參數(shù)了
那么如果我們在url_for中傳入url中不存在的關(guān)鍵字參數(shù),會怎么樣呢?
@app.route('/article/<int:article_id>/')
def article_detail(article_id):
return "article id is " + str(article_id)
@app.route('/index/')
def index():
# 注意 這里的關(guān)鍵字參數(shù)的key不是隨便取的,必須的和該函數(shù)對應(yīng)的url中參數(shù)名一樣
url = url_for('article_detail',article_id=2,name='xxx')
return url
當(dāng)我們訪問這個url的時候,就會返回這樣的一個url:/article/2/?name=xxx
也就是說,當(dāng)我們傳入url中沒有的關(guān)鍵之參數(shù),url_for就會以查詢字符竄的方式給我們添加到url上。
那么我們的到函數(shù)對應(yīng)的url有什么用呢?
url_for一般是和重定向一起使用,一般不會單獨(dú)使用,所以接下來我們來講重定向。
4. 重定向
重定向分為永久性重定向與暫時性重定向
- 永久性重定向:http的狀態(tài)碼為301,多用于舊網(wǎng)址廢棄了,需要轉(zhuǎn)到一個新的網(wǎng)址確保用戶的訪問。比如京東的網(wǎng)站。當(dāng)我們輸入jingdong.com的時候,瀏覽器會給我們重新跳轉(zhuǎn)至jd.com這個網(wǎng)頁,因?yàn)閖ingdong.com這個網(wǎng)址已經(jīng)被廢棄了,所以會給我們重新跳轉(zhuǎn)至jd.com。這就是永久性重定向。
- 暫時性重定向:http的狀態(tài)碼為302,表示頁面的暫時性跳轉(zhuǎn),比如在一個網(wǎng)站中我們直接訪問個人中心頁面,但是因?yàn)闆]有登陸,所以就會直接給我們跳轉(zhuǎn)至登陸頁面。
在flask中,使用重定向需要使用到direct這個函數(shù).
我們通過一個小例子來說明重定向的使用。
需求:當(dāng)我們訪問個人中心的時候,如果沒有登陸,就需要跳轉(zhuǎn)至登陸頁面,這里我們假設(shè)在url中傳入了name參數(shù),就認(rèn)為是登陸了。代碼如下
from flask import redirect,url_for
@app.route('/login/')
def login():
return 'login'
@app.route('/profile/')
def profile():
name = request.args.get('name')
if name:
return 'profile 頁面'
else:
return redirect( url_for('login') )
上面的代碼就實(shí)現(xiàn)了我們的需求。
這個時候可能有人會問,在redirect函數(shù)中,我們也可以不使用url_for,直接構(gòu)造手動構(gòu)造url啊,也不是特別麻煩的,例如這樣。return redirect('login'),這樣,我也能直接跳轉(zhuǎn)至login頁面啊。
這里就大概說一下使用url_for的好處吧:
- 當(dāng)我們的項目特別大的時候,如果某一天老板需要我們修改一下url,例如將/index/修改為/xxx/index/,那么我們在app.route中修改了之后,如果我們的項目中大量的使用的redirect重定向到我們的這個函數(shù)視圖中,那么我們就必須的去代碼中一個一個的找出來,然后去修改代碼,而如果我們使用了url_for,那就不會出現(xiàn)這樣的問題了,直接修改@app.route就行了,而其他地方因?yàn)槲覀兪褂玫氖莡rl_for生成的,所以完全不需要我們?nèi)バ薷摹?/li>
- 當(dāng)我們的url中擁有特殊字符的時候,如'/',如果我們直接手動構(gòu)造這個參數(shù)的話,那么就可能會出現(xiàn)歧義了,這個'/‘是當(dāng)做url中的'/‘來識別呢還是當(dāng)做一個普通的字符'/‘來識別呢,所以可能就會出現(xiàn)頁面找不到的情況,而使用url_for的話,url_for就會將'/'編碼,然后我們使用的時候優(yōu)惠解碼回來,所以就不會出翔上面那種狀況。
5. 指定HTTP請求方法
有些時候,我們的一個視圖只允許POST方法訪問,而@app.route()默認(rèn)只允許GET方法,那么我們?nèi)绾沃付ㄔ试S請求的方法呢?
在@app.route()中可以傳入一個關(guān)鍵字參數(shù)methods來指定本方法支持的HTTP方法
# 只允許POST方法
@app.route('/post_demo/',methods=['POST'])
def post_demo():
return 'post'
# 默認(rèn)的就是這種情況,所以當(dāng)方法為get請求是,我們一般都省略不寫
@app.route('/get_demo/',methods=['GET'])
def get_demo():
return 'get'
# GET,POST方法都允許
@app.route('/all_demo/',methods=['POST','GET'])
def all_demo():
return 'all'
注意:
@app.route('/index')與@app.route('/index/')起始是對應(yīng)的兩個url,一般我們在項目中,都是使用后面一種,因?yàn)樵谟行g覽器中,當(dāng)我們最后面沒有加'/'時,瀏覽器會自動給我們添加上去,而我們有沒有這樣的一個url,所以就有可能會造成頁面找不到的情況。所以在項目中,我們一般都會寫成后面那種形式。
希望本文所述對大家基于flask框架的Python程序設(shè)計有所幫助。
相關(guān)文章
Python使用pypinyin實(shí)現(xiàn)中文拼音轉(zhuǎn)換
pypinyin是一個Python庫,用于將中文漢字轉(zhuǎn)換為拼音,這篇文章主要為大家詳細(xì)介紹了pypinyin的基本用法并探討其應(yīng)用場景,需要的可以參考下2024-02-02
Python3與redis交互,保存的是字符串,取出來是bytes類型問題
這篇文章主要介紹了Python3與redis交互,保存的是字符串,取出來是bytes類型問題,具有很好的參考價值,希望對大家有所幫助,2023-09-09
python進(jìn)程池Pool中apply方法與apply_async方法的區(qū)別
這篇文章主要介紹了python進(jìn)程池Pool中apply方法與apply_async方法的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02
Python 列表中的修改、添加和刪除元素的實(shí)現(xiàn)
這篇文章主要介紹了Python 列表中的修改、添加和刪除元素的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06

