之前吧一直學習flask的時候,一直不明白response是怎么產生,今天是明白了。retrun 哎呀,這個地方看着挺小心的東西, 蘊含的能量可不小啊。今天我詳細總結總結。
先來寫jinjia2語法,jinjia2還是比較簡單的,這是flask中的一個模板,配合着前端來用(巨爽~~)。跟那個jsp里面的語法差不多,python跟java還是挺像的。4
00x1: return返回
用flask創建路由的時候,里面有個return 。先來看下return的效果
@app.route('/test/') def test(): return "hello,world"
可以看到有個response,這里用的是burpsuite,有興趣的小伙伴,可以百度去搜下。
return是有參數的,不可以返回字典,列表啦。但是吧,在rerun里面可以看到的是有個狀態碼是200,這個200,我們是可以修改的,是加在return 后面的。下面來具體演示下
代碼:
@app.route('/test/') def test(): return "hello ,world" , 400
效果:
return 還有第三個參數,其返回一個字典,這個東西是比較好玩的,我經常在ctf里面見到這種題,這是一個json格式。嘻嘻,更新下。
代碼:
@app.route('/test/') def test(): return "hello ,world" , 400 , {'hint' : 'xxx.txt'}
總結 return的三個參數 字符串、元組| 狀態碼 | 響應頭信息
過濾器:
小知識.....過濾器之前,需要說一下,后端和前端交互數據的時候,不是一直都是前端把數據傳給后端,后端經過處理就可以了。其實不是這樣,后端也是要向前端傳數據的。過濾器就是這樣,數據從后端傳輸到經過過濾器才會傳輸到前端。
flask中過濾器用到的還是比較多的,在flask開發web中用到的還是蠻多的。先看到幾個用法吧,有一個閱讀全文,這是一個省略的地方,這有個閱讀全文的地方,這也是一個過濾的地方。比如要顯示多少個閱讀量,這些都是過濾器完成的地方。
過濾器:
過濾器的本質就是函數,用法和Linux中的管道符差不多。都是用 | 。
基本的過濾器語法:
@app.route('/') def index(): user = { 'username' : 'xxx', 'password' : 'avc' , 'email' : 'balala', 'test' : 'fuck aaa difoashfid,fuck,fuck,fuck.fdsadfafuck', 'now' : 1221441 } return render_template('index.html' , content = user)
通過rend_templete中的content傳入到前端的index,html中,然后前端的index.html中會有一個。隨便添加因為是jinjia2語法。
{{ content.now | abs }}
這樣的就是一個簡單的過濾器,這個過濾器是絕對值,后端的那個字典,通過content傳給前端,想要過濾的地方加上 | 過濾器函數,就可以實現過濾器的效果了。這是一個基本的過濾器函數,還有其他類似的。
字符串操作
-
safe:禁用轉義
<p>{{ '<em>hello</em>' | safe }}</p>
-
capitalize:把變量值的首字母轉成大寫,其余字母轉小寫
<p>{{ 'hello' | capitalize }}</p>
-
lower:把值轉成小寫
<p>{{ 'HELLO' | lower }}</p>
-
upper:把值轉成大寫
<p>{{ 'hello' | upper }}</p>
-
title:把值中的每個單詞的首字母都轉成大寫
<p>{{ 'hello' | title }}</p>
-
reverse:字符串反轉
<p>{{ 'olleh' | reverse }}</p>
-
format:格式化輸出
<p>{{ '%s is %d' | format('name',17) }}</p>
-
striptags:渲染之前把值中所有的HTML標簽都刪掉
<p>{{ '<em>hello</em>' | striptags }}</p>
-
truncate: 字符串截斷
<p>{{ 'hello every one' | truncate(9)}}</p>
列表操作
-
first:取第一個元素
<p>{{ [1,2,3,4,5,6] | first }}</p>
-
last:取最后一個元素
<p>{{ [1,2,3,4,5,6] | last }}</p>
-
length:獲取列表長度
<p>{{ [1,2,3,4,5,6] | length }}</p>
-
sum:列表求和
<p>{{ [1,2,3,4,5,6] | sum }}</p>
-
sort:列表排序
<p>{{ [6,2,3,1,5,4] | sort }}</p>
那么多過濾器還是不一定能夠滿足我們的需求的,如果我們需要把一個敏感詞給替換掉,那么我們就需要自己寫一個過濾器,雖然說可以用replace進行替換,但是在前端頁面中怎么用replace替換呢?還是要寫一個過濾器。
下面寫一個替換'fuck'的字符串的過濾器。
@app.template_filter('cut') def cut(value): new_value = value.replace('fuck' , '') return new_value
@app.route('/')
def index(): user = { 'username' : 'xxx', 'password' : 'avc' , 'email' : 'balala', 'test' : 'fuck aaa difoashfid,fuck,fuck,fuck.fdsadfafuck', 'now' : 1221441 } return render_template('index.html' , content = user)
其中app.templete_filter()是一個裝飾器,裝飾器在前面就已經說過了。()里面是定義的一個過濾器函數的函數名稱。比如現在這個是cut,這樣利用了一個replace就可以替換掉了。
{{ content.test | cut }}
效果:
嗯~~哈哈哈,把那個敏感詞匯給替換掉了。
過濾時間函數,這個函數其實也容易寫,就是需要注意的地方多一點。比如要導入datatime,還有一些小細節的問題:
@app.templete_filter(cal_time)
def cal_time():
-------------------------更新-------------------------------------------------------------------------
TMD,谷歌的hackbar依舊不能使,還要用火狐的,說實話,谷歌做的頁面好看,訪問googel也方便,火狐做的頁面是真心的丑。吐槽坑一波,不要嘗試谷歌里面安裝代理軟件,還有Hackbar了,一按一個坑,還弄不好。氣死我了,在用代理插件的時候,會有那個https的證書的問題。這個坑,即使你導入受訪問的根目錄權限之后,也是會找不到的,棄坑。hackbar,網上帖子都是巴啦啦,烏拉拉變身一樣,就能用了。到我這邊又是不能用了,我按照網上大部分人的帖子上面的改disable_xxx 什么注釋改為init(),又或者true改成false。我的都不行,跟小魔仙一樣,巴啦啦變身--->hackbar的文件遭到損壞..........半年前就沒安裝好,半年后又是這樣。我的天啊.......心碎。。。。
--------------------------------------不要捉急,我先去歇歇,等你下次來的時候,我就已經更新了----------------------------------------------