亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

flask框架url與重定向操作實(shí)例詳解

 更新時(shí)間:2020年01月25日 11:08:19   作者:stu_xujin  
這篇文章主要介紹了flask框架url與重定向操作,結(jié)合實(shí)例形式詳細(xì)分析了flask框架URL映射、傳參、重定向等相關(guān)概念、原理與操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了flask框架url與重定向操作。分享給大家供大家參考,具體如下:

1. url與函數(shù)的映射

當(dāng)我們新建一個(gè)flask項(xiàng)目的時(shí)候,默認(rèn)就會(huì)有一個(gè)hello_world函數(shù),如下面這樣

@app.route('/')
def hello_world():
  return 'hello world'

上面函數(shù)中,app.route()的參數(shù)就是我們的url,當(dāng)我們啟動(dòng)項(xiàng)目的時(shí)候,我們?cè)跒g覽器中輸入127.0.0.1:5000,就能夠訪問(wèn)到我們這個(gè)視圖了,因?yàn)?就是代表"根url",所以我們只需要ip地址和端口就訪問(wèn)到了我們的這個(gè)函數(shù)視圖。

當(dāng)我們將app.route()的參數(shù)改為'/hello/'時(shí),那我們?cè)L問(wèn)這個(gè)視圖就需要輸入網(wǎng)址為127.0.0.1:5000/hello/才能訪問(wèn)到我們的這個(gè)視圖了,

這就是flask中url與函數(shù)的映射。

2. url傳入?yún)?shù)

  1. url中包含參數(shù)

當(dāng)我們?cè)L問(wèn)CSDN,博客園,簡(jiǎn)書(shū)等網(wǎng)站中的文章詳情的時(shí)候,我們會(huì)發(fā)現(xiàn)起始每篇文章的詳情頁(yè)面的url前面不封都是一樣的,只有后面一部分不一樣。那么這個(gè)不一樣的部分我們就可以當(dāng)做一個(gè)參數(shù)傳入視圖中,然后我們?cè)谝晥D中拿到相應(yīng)的參數(shù)在進(jìn)行相應(yīng)的操作,返回相應(yīng)的數(shù)據(jù)。那么在flask中怎樣實(shí)現(xiàn)這個(gè)功能呢?

@app.route('/article_detail/<article_id>/')
def article_detail(article_id):
  return "你查看到文章id 為 %s" % article_id

在上面的函數(shù)視圖中,app.route()中用<>這個(gè)包裹起來(lái)的就是我們定義的參數(shù),這里我們就定義了一個(gè)article_id這樣的參數(shù)。當(dāng)我們?cè)趗rl中定義了一個(gè)參數(shù)之后,我們必須也在函數(shù)中寫(xiě)入這個(gè)參數(shù),而且參數(shù)名必須和url中的參數(shù)名一致。然后我們就可以在視圖中拿到article_id這個(gè)參數(shù)的值了。

然后啟動(dòng)項(xiàng)目,在瀏覽器中輸入127.0.0.1:5000/article_detail/3/等相似 的url,就能夠查看到相應(yīng)的效果了。

上面的例子中雖然我們能夠?qū)?shù)通過(guò)url傳入函數(shù)視圖中,但是我們并不能對(duì)url做類型限制,比如我們想要的article_id必須是一個(gè)int數(shù)據(jù),當(dāng)用戶傳入的參數(shù)不是int型的數(shù)據(jù)的時(shí)候,那么他就訪問(wèn)不到我們這個(gè)函數(shù)視圖.出現(xiàn)404頁(yè)面.那么flask中怎樣實(shí)現(xiàn)這樣這個(gè)需求呢?

在flask中,我們是可以對(duì)url指定類型的。

@app.route('/article_detail/<int:article_id>/')
def article_detail(article_id):
  return "你查看到文章id 為 %s" % article_id

這樣,我們就對(duì)傳入的參數(shù)做了類型限制。只需要參數(shù)前面寫(xiě)上我們的類型就可以了.

在flask中,除了支持int類型外,還支持以下類型:

  • string: 默認(rèn)的數(shù)據(jù)類型,接受沒(méi)有任何斜杠/的字符串。
  • int: 整形
  • float: 浮點(diǎn)型。
  • path: 和string類似,但是可以傳遞斜杠/。
  • uuid: uuid類型的字符串。(什么是uuid?)
  • any:可以指定多種路徑,這個(gè)通過(guò)一個(gè)例子來(lái)進(jìn)行說(shuō)明:
@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)

這樣,我們?cè)跒g覽器中輸入127.0.0.1:5000/blog/3/127.0.0.1:5000/article/3/都能夠訪問(wèn)到這個(gè)視圖,那么我們?cè)趺粗喇?dāng)前是以哪個(gè)url訪問(wèn)的呢,我們可以通過(guò):后面我們定義的url_path參數(shù)來(lái)接受這個(gè)值,然后我們?cè)谝晥D中也要寫(xiě)入這個(gè)參數(shù)。然后我們就能拿到這個(gè)值了.

  1. url中以查詢字符竄的方式傳遞參數(shù)(get請(qǐng)求)

有些時(shí)候,我們并不需要向上面那樣傳遞參數(shù),通過(guò)?xxx=xxx這樣的形式傳遞參數(shù)。

那么在flask中,我們?cè)鯓拥玫竭@種參數(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請(qǐng)求),那么我們直接在瀏覽器中輸入127.0.0.1:5000/search/?name=xxx,然后我們?cè)诤瘮?shù)視圖中通過(guò)request.args.get()方法就能夠拿到這個(gè)值了。

如果我們url中沒(méi)有傳入name這個(gè)參數(shù),那么我們的程序也不會(huì)報(bào)錯(cuò),只會(huì)得到一個(gè)None,并不會(huì)影響我們代碼的運(yùn)行。

3. 構(gòu)造url,url_for的使用

在上面的代碼中,都是通過(guò)在瀏覽器中輸入url,從而找到我們的視圖函數(shù)。那么我們可不可以反過(guò)來(lái)呢,知道視圖函數(shù),從而得到相應(yīng)的url。

這個(gè)時(shí)候我們就需要使用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ù)不存在就會(huì)報(bào)錯(cuò)。讓我們?cè)跒g覽器中輸入127.0.0.1:5000/index/的時(shí)候,我們就能夠看到url_for_demo這個(gè)函數(shù)對(duì)應(yīng)的url了。沒(méi)有參數(shù)的url學(xué)會(huì)了,那么如果url中攜帶參數(shù)怎么辦?

在url_for這個(gè)函數(shù)中,我們也是可以傳入關(guān)鍵字參數(shù)的,只需要和url中的參數(shù)對(duì)應(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ù)對(duì)應(yīng)的url中參數(shù)名一樣
  url = url_for('article_detail',article_id=2)
  return url

這樣,我們也能在url_for中傳入url的參數(shù)了

那么如果我們?cè)趗rl_for中傳入url中不存在的關(guān)鍵字參數(shù),會(huì)怎么樣呢?

@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ù)對(duì)應(yīng)的url中參數(shù)名一樣
  url = url_for('article_detail',article_id=2,name='xxx')
  return url

當(dāng)我們?cè)L問(wèn)這個(gè)url的時(shí)候,就會(huì)返回這樣的一個(gè)url:/article/2/?name=xxx

也就是說(shuō),當(dāng)我們傳入url中沒(méi)有的關(guān)鍵之參數(shù),url_for就會(huì)以查詢字符竄的方式給我們添加到url上。

那么我們的到函數(shù)對(duì)應(yīng)的url有什么用呢?

url_for一般是和重定向一起使用,一般不會(huì)單獨(dú)使用,所以接下來(lái)我們來(lái)講重定向。

4. 重定向

重定向分為永久性重定向與暫時(shí)性重定向

  • 永久性重定向:http的狀態(tài)碼為301,多用于舊網(wǎng)址廢棄了,需要轉(zhuǎn)到一個(gè)新的網(wǎng)址確保用戶的訪問(wèn)。比如京東的網(wǎng)站。當(dāng)我們輸入jingdong.com的時(shí)候,瀏覽器會(huì)給我們重新跳轉(zhuǎn)至jd.com這個(gè)網(wǎng)頁(yè),因?yàn)閖ingdong.com這個(gè)網(wǎng)址已經(jīng)被廢棄了,所以會(huì)給我們重新跳轉(zhuǎn)至jd.com。這就是永久性重定向。
  • 暫時(shí)性重定向:http的狀態(tài)碼為302,表示頁(yè)面的暫時(shí)性跳轉(zhuǎn),比如在一個(gè)網(wǎng)站中我們直接訪問(wèn)個(gè)人中心頁(yè)面,但是因?yàn)闆](méi)有登陸,所以就會(huì)直接給我們跳轉(zhuǎn)至登陸頁(yè)面。

在flask中,使用重定向需要使用到direct這個(gè)函數(shù).

我們通過(guò)一個(gè)小例子來(lái)說(shuō)明重定向的使用。

需求:當(dāng)我們?cè)L問(wèn)個(gè)人中心的時(shí)候,如果沒(méi)有登陸,就需要跳轉(zhuǎn)至登陸頁(yè)面,這里我們假設(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 頁(yè)面'
  else:
    return redirect( url_for('login') )

上面的代碼就實(shí)現(xiàn)了我們的需求。

這個(gè)時(shí)候可能有人會(huì)問(wèn),在redirect函數(shù)中,我們也可以不使用url_for,直接構(gòu)造手動(dòng)構(gòu)造url啊,也不是特別麻煩的,例如這樣。return redirect('login'),這樣,我也能直接跳轉(zhuǎn)至login頁(yè)面啊。

這里就大概說(shuō)一下使用url_for的好處吧:

  • 當(dāng)我們的項(xiàng)目特別大的時(shí)候,如果某一天老板需要我們修改一下url,例如將/index/修改為/xxx/index/,那么我們?cè)赼pp.route中修改了之后,如果我們的項(xiàng)目中大量的使用的redirect重定向到我們的這個(gè)函數(shù)視圖中,那么我們就必須的去代碼中一個(gè)一個(gè)的找出來(lái),然后去修改代碼,而如果我們使用了url_for,那就不會(huì)出現(xiàn)這樣的問(wèn)題了,直接修改@app.route就行了,而其他地方因?yàn)槲覀兪褂玫氖莡rl_for生成的,所以完全不需要我們?nèi)バ薷摹?/li>
  • 當(dāng)我們的url中擁有特殊字符的時(shí)候,如'/',如果我們直接手動(dòng)構(gòu)造這個(gè)參數(shù)的話,那么就可能會(huì)出現(xiàn)歧義了,這個(gè)'/‘是當(dāng)做url中的'/‘來(lái)識(shí)別呢還是當(dāng)做一個(gè)普通的字符'/‘來(lái)識(shí)別呢,所以可能就會(huì)出現(xiàn)頁(yè)面找不到的情況,而使用url_for的話,url_for就會(huì)將'/'編碼,然后我們使用的時(shí)候優(yōu)惠解碼回來(lái),所以就不會(huì)出翔上面那種狀況。

5. 指定HTTP請(qǐng)求方法

有些時(shí)候,我們的一個(gè)視圖只允許POST方法訪問(wèn),而@app.route()默認(rèn)只允許GET方法,那么我們?nèi)绾沃付ㄔ试S請(qǐng)求的方法呢?

@app.route()中可以傳入一個(gè)關(guān)鍵字參數(shù)methods來(lái)指定本方法支持的HTTP方法

# 只允許POST方法
@app.route('/post_demo/',methods=['POST'])
def post_demo():
  return 'post'
# 默認(rèn)的就是這種情況,所以當(dāng)方法為get請(qǐng)求是,我們一般都省略不寫(xiě)
@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/')起始是對(duì)應(yīng)的兩個(gè)url,一般我們?cè)陧?xiàng)目中,都是使用后面一種,因?yàn)樵谟行g覽器中,當(dāng)我們最后面沒(méi)有加'/'時(shí),瀏覽器會(huì)自動(dòng)給我們添加上去,而我們有沒(méi)有這樣的一個(gè)url,所以就有可能會(huì)造成頁(yè)面找不到的情況。所以在項(xiàng)目中,我們一般都會(huì)寫(xiě)成后面那種形式。

希望本文所述對(duì)大家基于flask框架的Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • selenium+python自動(dòng)化測(cè)試之環(huán)境搭建

    selenium+python自動(dòng)化測(cè)試之環(huán)境搭建

    這篇文章主要介紹了selenium+python自動(dòng)化測(cè)試之環(huán)境搭建,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • python flask框架實(shí)現(xiàn)重定向功能示例

    python flask框架實(shí)現(xiàn)重定向功能示例

    這篇文章主要介紹了python flask框架實(shí)現(xiàn)重定向功能,結(jié)合實(shí)例形式分析了flask框架重定向功能的實(shí)現(xiàn)與使用方法,需要的朋友可以參考下
    2019-07-07
  • 簡(jiǎn)單理解Python中的事件循環(huán)EventLoop

    簡(jiǎn)單理解Python中的事件循環(huán)EventLoop

    在 python 3中,加入了 asyncio 模塊,來(lái)實(shí)現(xiàn)協(xié)程,其中一個(gè)很重要的概念是事件循環(huán),本文我們就來(lái)自己實(shí)現(xiàn)一個(gè)相對(duì)簡(jiǎn)單的EventLoop,從而了解一下事件循環(huán)是如何進(jìn)行運(yùn)轉(zhuǎn)的吧
    2023-10-10
  • Django實(shí)現(xiàn)自定義路由轉(zhuǎn)換器

    Django實(shí)現(xiàn)自定義路由轉(zhuǎn)換器

    有時(shí)候上面的內(nèi)置的url轉(zhuǎn)換器并不能滿足我們的需求,因此django給我們提供了一個(gè)接口可以讓我們自己定義自己的url轉(zhuǎn)換器,那么如何實(shí)現(xiàn),本文就來(lái)介紹一下
    2021-05-05
  • Python實(shí)現(xiàn)獲取操作系統(tǒng)版本信息方法

    Python實(shí)現(xiàn)獲取操作系統(tǒng)版本信息方法

    這篇文章主要介紹了Python實(shí)現(xiàn)獲取操作系統(tǒng)版本信息方法,本文在命令行中獲取操作系統(tǒng)信息,介紹了platform模塊的使用,需要的朋友可以參考下
    2015-04-04
  • pyqt5之將textBrowser的內(nèi)容寫(xiě)入txt文檔的方法

    pyqt5之將textBrowser的內(nèi)容寫(xiě)入txt文檔的方法

    今天小編就為大家分享一篇pyqt5之將textBrowser的內(nèi)容寫(xiě)入txt文檔的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Pandas之MultiIndex對(duì)象的示例詳解

    Pandas之MultiIndex對(duì)象的示例詳解

    這篇文章主要介紹了Pandas之MultiIndex對(duì)象的示例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 使用Py2Exe for Python3創(chuàng)建自己的exe程序示例

    使用Py2Exe for Python3創(chuàng)建自己的exe程序示例

    今天小編就為大家分享一篇使用Py2Exe for Python3創(chuàng)建自己的exe程序示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • PyCharm導(dǎo)入python項(xiàng)目并配置虛擬環(huán)境的教程詳解

    PyCharm導(dǎo)入python項(xiàng)目并配置虛擬環(huán)境的教程詳解

    這篇文章主要介紹了Pycharm導(dǎo)入python項(xiàng)目并配置虛擬環(huán)境的教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Python Numpy實(shí)現(xiàn)計(jì)算矩陣的均值和標(biāo)準(zhǔn)差詳解

    Python Numpy實(shí)現(xiàn)計(jì)算矩陣的均值和標(biāo)準(zhǔn)差詳解

    NumPy(Numerical Python)是Python的一種開(kāi)源的數(shù)值計(jì)算擴(kuò)展。這種工具可用來(lái)存儲(chǔ)和處理大型矩陣,比Python自身的嵌套列表結(jié)構(gòu)要高效的多。本文主要介紹用NumPy實(shí)現(xiàn)計(jì)算矩陣的均值和標(biāo)準(zhǔn)差,感興趣的小伙伴可以了解一下
    2021-11-11

最新評(píng)論