Flask 重定向到上乙個頁面

2021-10-06 17:01:23 字數 2341 閱讀 8885

def func_a():

return "do_something".format(url_for('do_something'))

def func_b():

return "do_something".format(url_for('do_something'))

def do_something():

print('do things.....')

return redirect(url_for('test'))

這裡我們訪問完這個檢視後直接調到固定的test頁面中,但是我們希望重定向到原來的頁面:

1.獲取上個頁面的url

(1)http.referrer

return redirect(request.referrer)
但是referrer欄位在很多情況下是空值,所以為了保險返回固定頁面:

return redirect(request.referrer or url_for('test'))
(2)查詢引數

在url中手動加入包含當前頁面url的查詢引數,這個引數一般命名為next。

def func_a():

return "do_something".format(url_for('do_something', next=request.full_path))

def func_b():

return "do_something".format(url_for('do_something', next=request.full_path))

這裡的request.full_path獲取的是當前頁面的完整路徑,在do_something檢視中獲取next值,重定向到指定路徑:

return redirect(request.args.get('next'))
為避免next為空,可以如下:

return redirect(request.args.get('next'),url_for('test'))
為了更全面的考慮,可以將兩者結合,將兩者封裝到函式中,如下:

def redirect_back(default='test', **kwargs):

for target in request.args.get('next'), request.referrer:

if target:

return redirect(target)

return redirect(url_for(default, **kwargs))

此方法同時兼顧了多種情況。

相應的do_something檢視中的返回改為:

def do_something():

print('do things.....')

return redirect_back()

2.對url進行安全驗證

def is_safe_url(url):

ref_url = urlparse(request.host_url)

test_url = urlparse(urljoin(request.host_url, url))

return test_url.scheme in ('http', 'https') and ref_url.netloc == test_url.netloc

此方法將next的url作為引數,並通過request.host_url獲取程式內的主機url,然後使用urljoin()函式將url轉成絕對url。接著用urlparse()函式解析兩個url,最後對目標url的url模式和主機位址進行驗證,確保只有程式內的url才能被返回。

通過此方法驗證redirect_back()中的next值和referrer:

def redirect_back(default='test', **kwargs):

for target in request.args.get('next'), request.referrer:

if not target:

continue

print(is_safe_url(target))

if is_safe_url(target):

return redirect(target)

return redirect(url_for(default, **kwargs))

完成跳轉的上個頁面。

Flask 頁面跳轉和重定向

頁面跳轉和重定向 使用者訪問一些需要登陸的頁面的時候,如果使用者沒有登入,那麼可以重定向到登入頁面 encoding utf 8 from flask import flask,redirect,url for def index login url url for login return red...

git 回到上乙個版本

本人常用下面的命令 git reset hard head 1 git reset head filename 把這個 file 移除暫緩區,其實就是相當於沒用 add這個 file git commit am 提交 提交暫緩區 git reset head 撤銷最近一次 commit git re...

svn 回滾到上乙個版本shell 指令碼

bin sh 2015 07 15 author jackluo email net.webjoy gmail.com version list svn log limit 2 sed 1d sed d awk f awk v rs 找出最近的版本,並進行格式化 echo verions findi...