使用Django和Flask獲取訪問來(lái)源referrer
Flask
request.referrer # 來(lái)路 request.headers.get('User-Agent') # 請(qǐng)求頭
Django
request.META['HTTP_REFERER'] # 來(lái)路 request.META.get("HTTP_USER_AGENT") # 請(qǐng)求頭
補(bǔ)充:flask 重定向到上一個(gè)頁(yè)面,referrer、next參數(shù) --
>重定向會(huì)上一個(gè)頁(yè)面
在某些場(chǎng)景下,我們需要在用戶訪問某個(gè)url后重定向會(huì)上一個(gè)頁(yè)面,比如用戶點(diǎn)擊某個(gè)需要登錄才能訪問的連接,這時(shí)程序會(huì)重定向到登錄頁(yè)面,當(dāng)用戶登錄后比較合理的行為是重定向到用戶登錄前瀏覽的頁(yè)面。
下面的例中,在foo和bar視圖中生成連接,鏈接過去后,沒有重定向會(huì)上一個(gè)頁(yè)面
@app.route('/foo') def foo(): return '<h1>Foo page </h1><a href="%s" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Do something</a>' %url_for('do_something') @app.route('/bar') def bar(): return '<h1>Bar page</h1><a href="%s" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Do something </a>' % url_for('do_something') @app.route('/do_something') def do_something(): return redirect(url_for('hello')) @app.route('/hello') def hello(): name = request.args.get('name') if name is None: name = request.cookies.get('name','xiaxiaoxu')#從cookie中獲取name值 response = '<h1>Hello, %s</h1>' % name return response if __name__ == '__main__': app.run(debug = True)
結(jié)果:
訪問127.0.0.1:5000/foo或者127.0.0.1:5000/bar后,頁(yè)面出現(xiàn)連接,點(diǎn)擊鏈接后,進(jìn)入hello頁(yè)面,之后停留在了hello頁(yè)面
點(diǎn)擊鏈接后重定向到了hello頁(yè)面
我們的目的是在鏈接后,返回原來(lái)的頁(yè)面
重定向會(huì)上一個(gè)頁(yè)面,關(guān)鍵是獲取上一個(gè)頁(yè)面的URL。
獲取上一個(gè)頁(yè)面的URL有兩種方法:
HTTP referrer
HTTP referrer是一個(gè)用來(lái)記錄請(qǐng)求發(fā)源地址的HTTP首部字段(HTTP_REFERER),即訪問來(lái)源。當(dāng)用戶在某個(gè)站點(diǎn)點(diǎn)擊鏈接,瀏覽器想新鏈接所在的服務(wù)器發(fā)起請(qǐng)求,請(qǐng)求的數(shù)據(jù)中包含的HTTP_REFERER字段記錄了用戶所在的原站點(diǎn)URL。
在flask中,referer的值可以通過請(qǐng)求對(duì)象的referrer屬性獲取,即request.referrer
修改do_something視圖函數(shù):
@app.route('/do_something') def do_something(): return redirect(request.referrer)
在bar頁(yè)面上再次點(diǎn)擊鏈接
有的時(shí)候,referrer字段可能是空值,比如用戶直接在瀏覽器地址欄輸入U(xiǎn)RL或者因?yàn)榉阑饓蛘邽g覽器設(shè)置自動(dòng)清除或修改referer字段,我們需要添加一個(gè)備選項(xiàng):
return redirect(request.referrer or url_for('hello'))
查詢參數(shù)next
除了自動(dòng)從referrer獲取,另一種更常見的方式是在URL中手動(dòng)加入包含當(dāng)前頁(yè)面URL的查詢參數(shù),這個(gè)查詢參數(shù)一般命名為next
在bar視圖中的鏈接do_something對(duì)應(yīng)的視圖添加next參數(shù)(在/do_someghing后加參數(shù))
def bar(): #print dir(request) print "request.full_path:",request.full_path #print "request.url:",request.url return '<h1>Bar page</h1><a href="%s" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Do something and redirect </a>' % url_for('do_something', next = request.full_path) @app.route('/do_something') def do_something(): return redirect(request.args.get('next'))
為了避免next參數(shù)為空的情況,也可以加備選項(xiàng),如果為空就重定向到hello視圖
return redirect(request.args.get('next', url_for('hello')))
為了覆蓋更全面,可以將查詢參數(shù)next和referrer兩種方式結(jié)合起來(lái)使用:
先獲取next參數(shù),如果為空就嘗試獲取referer,如果仍然為空,就重定向到默認(rèn)的hello視圖
因?yàn)樵诓煌晥D執(zhí)行這部分操作的代碼相同,我們可以創(chuàng)建一個(gè)通用的函數(shù)redirect_back()函數(shù)
在do_something視圖中調(diào)用這個(gè)函數(shù)
@app.route('/bar') def bar(): print "request.full_path:",request.full_path return '<h1>Bar page</h1><a href="%s" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Do something and redirect </a>' % url_for('do_something', next = request.full_path) def redirect_back(default = 'hello',**kwargs): for target in request.args.get('next'),request.referrer: if target: return redirect(target) return redirect(url_for(default,**kwargs)) @app.route('/do_something_and_redirect') def do_something(): return redirect_back() if __name__ == '__main__': app.run(debug = True)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Python環(huán)境搭建以及Python與PyCharm安裝詳細(xì)圖文教程
PyCharm是一種PythonIDE,帶有一整套可以幫助用戶在使用Python語(yǔ)言開發(fā)時(shí)提高其效率的工具,這篇文章主要給大家介紹了關(guān)于Python環(huán)境搭建以及Python與PyCharm安裝的詳細(xì)圖文教程,需要的朋友可以參考下2024-03-03Python 在區(qū)塊鏈智能合約開發(fā)中的應(yīng)用與實(shí)踐小結(jié)
Python作為一種廣泛應(yīng)用的編程語(yǔ)言,在區(qū)塊鏈智能合約開發(fā)中扮演著重要角色,通過使用Python框架如Brownie和Web3.py,開發(fā)者可以輕松編寫和部署智能合約,感興趣的朋友一起看看吧2024-09-09python中l(wèi)ogging包的使用總結(jié)
本篇文章給大家詳細(xì)講述了python中l(wèi)ogging包的使用的相關(guān)知識(shí)點(diǎn)以及原理分析,有興趣的朋友可以參考學(xué)習(xí)下。2018-02-02python中urllib.request和requests的使用及區(qū)別詳解
這篇文章主要介紹了python中urllib.request和requests的使用及區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-05-05python圖片指定區(qū)域替換img.paste函數(shù)的使用
這篇文章主要介紹了python圖片指定區(qū)域替換img.paste函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Python實(shí)現(xiàn)的尋找前5個(gè)默尼森數(shù)算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)的尋找前5個(gè)默尼森數(shù)算法,簡(jiǎn)單講述了默尼森數(shù)的概念,并結(jié)合實(shí)例形式分析了Python求解默尼森數(shù)算法的相關(guān)操作技巧,需要的朋友可以參考下2018-03-03Python?數(shù)據(jù)可視化神器Pyecharts繪制圖像練習(xí)
這篇文章主要介紹了Python?數(shù)據(jù)可視化神器Pyecharts繪制圖像練習(xí),繪制的圖形有柱狀圖、餅狀圖、箱型圖、折線圖、雷達(dá)圖等多種圖像,需要的小伙伴可以參考一下2022-02-02