flask url與重定向詳解

2021-09-25 05:12:17 字數 4857 閱讀 9348

當我們新建乙個flask專案的時候,預設就會有乙個hello_world函式,如下面這樣

'/')

defhello_world()

:return

'hello world'

這就是flask中url與函式的對映。

'/article_detail//'

)def

article_detail

(article_id)

:return

"你檢視到文章id 為 %s"

% article_id

然後啟動專案,在瀏覽器中輸入127.0.0.1:5000/article_detail/3/等相似 的url,就能夠檢視到相應的效果了。

上面的例子中雖然我們能夠將引數通過url傳入函式檢視中,但是我們並不能對url做型別限制,比如我們想要的article_id必須是乙個int資料,當使用者傳入的引數不是int型的資料的時候,那麼他就訪問不到我們這個函式檢視.出現404頁面.那麼flask中怎樣實現這樣這個需求呢?

在flask中,我們是可以對url指定型別的。

'/article_detail//'

)def

article_detail

(article_id)

:return

"你檢視到文章id 為 %s"

% article_id

這樣,我們就對傳入的引數做了型別限制。只需要引數前面寫上我們的型別就可以了.

在flask中,除了支援int型別外,還支援以下型別:

'///'

)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/都能夠訪問到這個檢視,那麼我們怎麼知道當前是以哪個url訪問的呢,我們可以通過後面我們定義的url_path引數來接受這個值,然後我們在檢視中也要寫入這個引數。然後我們就能拿到這個值了.

url中以查詢字元竄的方式傳遞引數(get請求)

有些時候,我們並不需要向上面那樣傳遞引數,通過?***=***這樣的形式傳遞引數。

那麼在flask中,我們怎樣得到這種引數的值呢?

from flask import request

'/search/'

)def

search()

: name = request.args.get(

'name'

)return

"查詢字串傳入引數 %s"

% name

比如在上面的檢視函式中,我想傳入name=***,以查詢字元竄的方式(get請求),那麼我們直接在瀏覽器中輸入127.0.0.1:5000/search/?name=***,然後我們在函式檢視中通過request.args.get()方法就能夠拿到這個值了。

如果我們url中沒有傳入name這個引數,那麼我們的程式也不會報錯,只會得到乙個none,並不會影響我們**的執行。

在上面的**中,都是通過在瀏覽器中輸入url,從而找到我們的檢視函式。那麼我們可不可以反過來呢,知道檢視函式,從而得到相應的url。

這個時候我們就需要使用url_for了,首先我們的先導入。

from flask import url_for

'/url_for/'

)def

url_for_demo()

:return

'url_for_demo'

'/index/'

)def

index()

:# 函式的名字

return url_for(

'url_for_demo'

)

url_for中引數為函式的名字,如果傳入的函式不存在就會報錯。讓我們在瀏覽器中輸入127.0.0.1:5000/index/的時候,我們就能夠看到url_for_demo這個函式對應的url了。沒有引數的url學會了,那麼如果url中攜帶引數怎麼辦?

url_for這個函式中,我們也是可以傳入關鍵字引數的,只需要和url中的引數對應上就好了。

'/article//'

)def

article_detail

(article_id)

:return

"article id is "

+str

(article_id)

'/index/'

)def

index()

:# 注意 這裡的關鍵字引數的key不是隨便取的,必須的和該函式對應的url中引數名一樣

url = url_for(

'article_detail'

,article_id=2)

return url

這樣,我們也能在url_for中傳入url的引數了

那麼如果我們在url_for中傳入url中不存在的關鍵字引數,會怎麼樣呢?

'/article//'

)def

article_detail

(article_id)

:return

"article id is "

+str

(article_id)

'/index/'

)def

index()

:# 注意 這裡的關鍵字引數的key不是隨便取的,必須的和該函式對應的url中引數名一樣

url = url_for(

'article_detail'

,article_id=

2,name=

'***'

)return url

當我們訪問這個url的時候,就會返回這樣的乙個url:/article/2/?name=***

也就是說,當我們傳入url中沒有的關鍵之引數,url_for就會以查詢字元竄的方式給我們新增到url上。

那麼我們的到函式對應的url有什麼用呢?

url_for一般是和重定向一起使用,一般不會單獨使用,所以接下來我們來講重定向。

重定向分為永久性重定向與暫時性重定向

在flask中,使用重定向需要使用到direct這個函式.

我們通過乙個小例子來說明重定向的使用。

需求:當我們訪問個人中心的時候,如果沒有登陸,就需要跳轉至登陸頁面,這裡我們假設在url中傳入了name引數,就認為是登陸了。**如下

from flask import redirect,url_for

'/login/'

)def

login()

:return

'login'

'/profile/'

)def

profile()

: name = request.args.get(

'name'

)if name:

return

'profile 頁面'

else

:return redirect( url_for(

'login'

))

上面的**就實現了我們的需求。

這個時候可能有人會問,在redirect函式中,我們也可以不使用url_for,直接構造手動構造url啊,也不是特別麻煩的,例如這樣。return redirect('login'),這樣,我也能直接跳轉至login頁面啊。

這裡就大概說一下使用url_for的好處吧:

當我們的url中擁有特殊字元的時候,如』/』,如果我們直接手動構造這個引數的話,那麼就可能會出現歧義了,這個』/『是當做url中的』/『來識別呢還是當做乙個普通的字元』/『來識別呢,所以可能就會出現頁面找不到的情況,而使用url_for的話,url_for就會將』/'編碼,然後我們使用的時候優惠解碼回來,所以就不會出翔上面那種狀況。

# 只允許post方法

'/post_demo/'

,methods=

['post'])

defpost_demo()

:return

'post'

# 預設的就是這種情況,所以當方法為get請求是,我們一般都省略不寫

'/get_demo/'

,methods=

['get'])

defget_demo()

:return

'get'

# get,post方法都允許

'/all_demo/'

,methods=

['post'

,'get'])

defall_demo()

:return

'all'

注意:

重定向 Linux重定向用法詳解

相信大家平時都會有需要複製貼上資料的時候,如果是開啟檔案進行複製貼上,就不可避免的需要較多的滑鼠與鍵盤的操作,就會比較繁瑣。那麼有沒有可以省掉這些繁瑣操作的複製貼上的方法呢?答案是肯定的,那就是重定向。重定向是一種高效的方法,無需大量的滑鼠與鍵盤操作就可以完成資料的轉移。重定向可以分為輸入重定向以及...

linux重定向詳解

理論 0 一般代表的就是stdin fileno 標準輸入 1 一般代表的就是stdout fileno 標準輸出 2 一般代表的就是stderr fileno 標準錯誤 0 表示鍵盤輸入 1表示螢幕輸出 2表示螢幕錯誤輸出 例項 command out.file 2 1 例項解釋 command ...

Linux中重定向 追加重定向與輸入重定向

簡單介紹一下重定向 追加重定向與輸入重定向,輸入追加重定向的用法 重定向 我們可以將想要輸出的內容通過重定向新增到某個檔案中 ps 將hello寫入到當前資料夾下的a.txt檔案中,然後檢視a.txt檔案內容 追加重定向 追加重定向和重定向大致相同,不同點是追加重定向在檔案的基礎上繼續新增內容 ps...