二、flask的用法

1.啟動

既然說到用法,那第一個就肯定得說說它是怎么啟動的,不然別人哪里還學的下去啊,廢話少說,開干。

from flask import Flask
app=Flask(__name__) #創建應用實例

@app.route('/') # route裝飾器創建路由
def hello(): # 訪問此路由時執行的視圖函數
return 'hello' # 視圖函數的返回值,又叫‘響應’
if __name__ == '__main__':
app.run(debug=True) #開始運行flask應用程序,以調試模式運行

#可以設置啟動的host地址和端口號,具體方法:
app.run(host='192.168.1.2',port=3243)

從上面可以看出,因為我修改了視圖函數和返回值,只需在瀏覽器刷新即可,完全不用退出重啟,sublime text 3真是神器啊,給力,墻裂建議大家使用。

2.創建Flask應用注意事項

要想創建一個Flask應用,首先我們要建立一個項目文件夾,里面至少要有兩個文件夾,一個存放媒體文件(static),一個存放網頁文件(templates),如果Python程序不多,可以不用給它單獨建立文件夾。Flask不像Django一樣可以自動創建文件夾,需要我們自己創建。如果你想查看flask創建的路由信息:

url_map存儲的是url與endpoint的映射。那么這個endpoint是什么意思了?實際上,當請求傳來一個url的時候,會先通過rule找到endpoint,然后再根據endpoint再找到對應的視圖函數。通常,endpoint的名字都和視圖函數名一樣。這里還有一點特別注意,那就是所有的控制臺輸出信息語句必須寫在app.run()之前,否則不起作用。

3.Flask的妙用

我們可以看到Flask里面有一個name,這個是為了啟動模板專門設立的,除了這個,它還有:

static_url_path:靜態網頁地址

static_folder:靜態地址,默認為static文件夾

template_folder:模板文件夾,默認為templates文件夾

4.添加配置文件

1)直接在app.run()函數里添加

比如以調試模式運行Flask應用就可以使用:app.run(debug=True)

2)直接配置
app.config=True
3)建立配置文件

在項目文件夾根目錄建立一個配置文件夾,名字為 hw.hw,后綴名你隨便取,內容為 DEBUG=True,然后在app.run()前面添加app.config.from_pyfile(‘hw.hw’) 即可。

5.視圖函數用法

1)下級頁面
@app.route('/index')
def index():
return 'index'

2)轉換器

@app.route('/index/<int:num>') #定義轉換器名字num
def num(num): #將轉換器傳入函數中
if num>10: #如果它的值大于10輸出dog,小于10輸出pig
return 'dog'
else:
return 'pig'

這里需要說到的是,轉換器主要是將頁面后的值作為某一個標準來得到另一個頁面,我們??吹降募用茏址褪怯眠@個做的,那么它有哪些類型呢?

Flask的默認轉換器:DEFAULT_CONVERTERS = {
‘default’: UnicodeConverter,
‘string’: UnicodeConverter,
‘any’: AnyConverter,
‘path’: PathConverter,
‘int’: IntegerConverter,
‘float’: FloatConverter,
‘uuid’: UUIDConverter,}

除此之外,我們也可以自定一轉換器,定義轉換器需要使用依賴包,方法如下:

class rc(BaseConverter):      
# 重寫父類的屬性,定義轉換器規則
def __init__(self,url_map):
super(rc,self).__init__(url_map)
#驗證QQ郵箱的正則表達式
self.regex ='[0-9a-zA-Z_]{0,19}@qq.com'
#定義視圖函數下的返回值
def to_python(self,value):
val=value
return val
def to_url(self,value):#返回url
return value
app.url_map.converters['em'] = rc #將自定義的轉換器添加到轉換器列表中
@app.route('/emm/<em:email>') #加入新的轉換器
def email(email):
return 'email is:%s' % email #返回email

可以通過反向解析將添加了自定義轉換器的視圖函數拿來用,這里需要用到重定向和反向解析:

@app.route('/search')
def jj():
url=url_for('email',email='2091500484@qq.com')
return redirect(url)

如果不注明轉換器類型,就是默認的字符串型:

@app.route('/hw/<boy>') 
def hw(boy):
return 'boy:%s'%boy

還可以定義默認的轉換器的默認值:

@app.route('/ha/<string:haid>',defaults={'haid':'hello,boy'}) #設置默認值
def ha(haid):
return 'haid:%s'%haid

3)多個路由指向同一地址

@app.route('/1')
@app.route('/2')
def fg():
return '1122'

這里訪問下級頁面1或者頁面2都會得出同樣的結果’1122‘

6.重定向

重定向即是指從一個網頁跳轉到另一個網頁,相當于刷新之后的操作,這里涉及到flask里的兩個模塊(redirect,url_for)。

1)直接跳轉

直接跳轉到路由下

from flask import redirect,url_for
@app.route('/refer')
def refer():
return redirect('/1')

這樣就可以直接跳轉到路由函數fg中并顯示返回值。

2)間接跳轉

我們可以先訪問路由函數,然后跳轉到相應內容頁面

@app.route('/ref')
def ref():
return redirect(url_for('fg')) #跳轉

這樣直接訪問ref子頁面就可以直接跳轉到相應頁面了

7.定義錯誤頁面

有兩種方式,一是使用系統的abort直接賦值,二是使用自定義errorhandler函數。

1)abort

直接使用系統自帶的錯誤內容

@app.route('/use/<id>')
def get_use(id):
if int(id)<10:
abort(404)
elif int(id)>20:
return '---Error---'
return 'hello:%s'%str(id)

2)errorhandler

自定義錯誤頁面內容

@app.errorhandler(404)
def error(err):
return 'hello,%s'%err

3)定義錯誤頁面

它可以將自定義的錯誤寫入到頁面中,平時會用的比較多。

@app.route('/error1')
def err1():
error1=('index error',666,[('key','div'),('value','zero')])
return error1

當然還有一種表述方式:

@app.route('/error2')
def err2():
error2=('login error',444,{'serise':'100','dataframe':'200'})
return error2

4)設置請求

這里需要說到一個新的模塊make_response(),當然你也可以使用Response()。

@app.route('/error3')
def err3():
resp=make_response('search error') #這里只需把make_response()換成Response()即可
resp.status='400'
resp.headers['hrr']='zjj'
resp.headers['hw']='zj'
return resp

8.json數據讀取

flask中有個非常給力的可以處理json數據的模塊,jsonify。

@app.route('/json1')
def json1():
data={'name':'HW','first':'ZJ'}
return jsonify(data)

@app.route('/json2')
def json2():
return jsonify(hour=12,second=21)

9.cookie的操作

1)設置cookie

#cookie的設置
#set_cookie(key, value='', max_age=None, expires=None,path='/', domain=None, secure=False, httponly=False,samesite=None)

#key:鍵
#value:值
#max_age:設置過期時間(秒)
#expires:設置過期時間,時間戳的形式(1970離現在的時間)
#path:當前主域名
#domain:子域名
#設置cookie和headers
@app.route('/set_cookie')
def set_cookie():
response=make_response('cookie設置成功')
#cookie有效時長30天也可以是hour second minute
time=datetime.datetime.today()+datetime.timedelta(days=30)#設置cookie的有效時長
response.set_cookie('user','admin',expires=time) #設置用戶名的cookie
response.set_cookie('pass','123456',expires=time) #設置密碼的cookie
response.headers['X-Something']='mything' #這里不允許出現中文
response.headers['Server']='Linux' #服務器名稱
return response

2)獲取cookie

這里需要用到一個模塊request,它相當于模擬一個請求,你可以把它當做requests模塊一樣。

@app.route('/get_cookie')
def get_cookie():
name="用戶名:"+request.cookies.get('user')+"密碼:"+request.cookies.get('pass')
return name

3)刪除cookie

有兩種刪除方式來刪除cookie。

1.通過設置cookie過期時間為0即可刪除

@app.route('/del_cookie1')
def del_cookie1():
response=make_response('delete cookie 1')
response.set_cookie('user','',expires=0)
response.set_cookie('pass','',expires=0)
return response

2.直接刪除cookie

@app.route('/del_cookie2')
def del_cookie2():
response=make_response('delete cookie 2')
response.delete_cookie('user')
response.delete_cookie('pass')
return response

10.session操作

session里面保留的就是會話內容,它存在于cookie當中,通過它我們可以直接登陸某些已經登陸過的系統。要想操作session我們需要引入為它專門準備的session模塊,還有需要配置安全秘鑰才可以使用session。

1)設置session

一、配置安全秘鑰:
app.config['SECRET_KEY']=os.urandom(30)
二、設置session字典
session['user']='hw'
session['pass']='zj'
三、設置session過期方式
session.parmanent=True #默認31天后過期
#session兩個小時過期
app.config['PERMANENT_SESSION_LIFETIME']= timedelta(hour=2)

四、綜合代碼

@app.route('/session1')
def session1():
session['user']='hw'
session['pass']='zj'
session.parmanent=True #默認31天后過期
return 'login success'

可以看到session成功設置在cookie里面了,并且瀏覽器也記錄了。當然你也可以只設置cookie,不過為了安全建議你設置session。

2)獲取session

跟cookie獲取有點不同。

一、get()獲取
@app.route('/session2')
def session2():
us=session.get("user")
pa=session.get("pass")
return 'hello %s %s'%(us,pa)
二、索引獲取

這種方式如果獲取不到值容易產生異常,建議用上一種方法,除非你知道一定能獲取到值。

@app.route('/session2')
def session2():
us=session["user"]
pa=session["pass"]
return 'hello %s %s'%(us,pa)

3)刪除session

也有兩種方法,不過一種是一個一個刪除,另一種則是全部刪除。

一、逐一刪除
@app.route('/session3')
def session3():
session.pop('user',None)
session.pop('pass',None)
return 'delete successful!!!!'

二、全部刪除

@app.route('/session4')
def session4():
session.clear()
return 'delete successful!!!!'

11.總結

本文著重講解了Flask的最基礎的用法,Flask是一個十分優秀的web開發框架,它可以十分迅速的開發出web應用,但是它需要依賴眾多的包才能完善更多的功能。這里只是講述了Flask一半的知識,下一篇文章,繼續給大家盤點,一起學習,共同進步!

下篇

前言

今天來給大家說一個Python的輕量級web開發框架——-Flask,為什么要推薦它呢?當然是因為它夠輕量級了,開發迅速是它的特點,當然它也有缺點,不過這里不說,因為既用它又說它差感覺不好。上篇文章我們說了一半的內容,盤點Python網頁開發輕量級框架Flask知識(上篇),這篇文章繼續補全剩下的一半內容,一起來學習下吧~

11.request操作

這是一個專門用來操作網頁請求的模塊,今天我們圍繞這個來具體講解。

1)request.method

它是request中的請求方法,一般我們用的比較多的便是get和post,由于get 和post需要配合表單一起使用,在這里我們暫時不講前端的內容,只做簡單的演示。

一、get請求

可通過設置它的methods參數來指定請求方式。

@app.route('/get', methods = ['GET','POST'])
def get():
if request.method == 'GET':
return '這是一個GET請求'
else:
return '這是一個其它請求'

二、post請求

@app.route('/post', methods = ['POST','GET'])
def post():
if request.method == 'POST':
return '這是一個POST請求'
else:
return '這是一個其它請求'

2)request.args

記錄get請求中的查詢參數,一般用于查詢,搜索網址

https://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=不謂俠

它會返回get請求中的參數,比如請求上面的url,它的請求參數便是:

searchType=song&searchKeyWord=不謂俠

使用方法:

request.args['keyword']
request.args.get('keyword')

3)request.form

記錄請求中的表單數據,一般用于表單提交。比如我們注冊網站時經常需要進行表單提交。

我們可以使用獲取表單中的內容:

request.form['keyword']
request.form.get('keyword')

4)reuqest.values

返回請求中的參數和表單,這個用的比較少,暫不細說。

5)request.cookies

獲取網頁中的cookies的所有信息,也可以只獲取cookies中的一個參數的值。

request.cookies['keyword']
request.cookies.get('keyword')

6)request.headers

返回請求網頁頭部信息,返回一個列表。

request.headers['keyword']
request.headers.get('keyword')

7)request.url、path、script_root、base_url、url_root

request.url:返回請求中的網頁地址

request.path:返回網頁存放地址

request.script_root:返回腳本根目錄

request.base_url:返回請求相對地址

request.url_root:返回請求網頁根目錄

8)request.data

返回請求的數據

request.data #返回一個字節類型的值

9)request.files

文件上傳必備,屬于提交表單的類型,所以這是個post類型的請求方式,我們可以使用files的file字段來設置:

@app.route('/upload',methods=['GET','POST'])
def upload():
if request.method == 'POST':
f = request.files['file']
filename = secure_filename(f.filename) #需要設置安全文件類型
#f.save(os.path.join('app/static',filename))兩種保存方式
f.save('app/static/'+str(filename))
return 'ok'
else:
return 'fail'

10)request.json

返回json格式的數據

11)request.environ

返回環境變量的鍵值

12)request.remote_addr

返回客戶端的訪問ip地址

13)request.host

返回host信息

12.上下文與請求鉤子

1)上下文

可能大部分人對這個概念比較難以琢磨,先來說說上下文,什么是上下文?一說起上下文,我猜大家第一時間一定會想起with,想到with大家肯定會想起上下文的模塊contexlib以及魔法方法enterexit,可以說,它是將復雜的事情簡單化的一個神器的裝飾器,我是這樣理解的。那么再來看看flask的上下文。

一、應用程序上下文

它作用于flask應用中,可以用作程序實例和存儲臨時變量,它可分為兩種:

g:處理請求時用作臨時存儲的對象,每次請求都會重設這個變量

current_app: 當前程序實例
二、請求上下文

顧名思義,它用于網絡請求中,它也有兩種。

request:請求對象
Session:存儲會話

2)鉤子

再來看看鉤子,什么是鉤子?這一點是我們先要搞清楚的,鉤子其實就是在我們進行請求時,它規范了我們的請求內容和請求方式以及請求時該做什么,什么時候做,具體做哪些事,起到了一個承上啟下的作用,所以,它很有用處。

一、在處理第一個請求前運行,可以用來連接數據庫進行查詢操作

before_first_request

二、在處理每個請求前運行,可以進行權限校驗

before_request

三、在每個請求結束后自動處理返回的響應數據

after_request

四、在每個請求結束后自動異常并將異常對象作為參數傳到函數中

teardown_request

五、在視圖函數中注冊一個函數,會在請求結束后運行

after_this_request

說完了這么多那么它們該怎么用了,接下來請看我表演:

@app.before_first_request
def first():
print('我是第一運行的')

@app.before_request
def every():
print('我又來了')

@app.after_request
def recv(res):
res.headers['Content-Type']='application/json' #更改響應頭部數據
return res

@app.route('/start/<string:id>')
def start(id):
g.use=request.cookies.get('user')
if id==g.use:
return request.url
else:
return request.cookies

ac= app.app_context() #應用上下文管理器
ac.push() #進
print(ac)
a = current_app
print(a)
ac.pop() #出
print(ac)

with app.app_context() as f:
b= current_app
print(b)
print(f)

13.藍圖

從上面的事例我們可以看出,隨著我們開發的東西越來越多,把所有東西放在一個文件里,很顯然不切實際。

我們嘗試著使用模塊調用,于是我編寫了兩個Python程序,用來調用:

demo1.py

from flask import Flask
app=Flask(__name__)
@app.route('/kj')
def df():
return 'hello world'
@app.route('/index')
def lk():
return 'efhsfj'

demo2.py

from flask import Flask,request
from demo1 import *
@app.route('/')
def login():
return request.url
if __name__ == '__main__':
app.run(debug=True)

這里demo2是可以成功調用demo1的,但是了,它無法操作demo1的變量以及一些實例,換言之就是只能調用,無法控制改變,于是這個時候藍圖就派上用場了,那么讓我們來看看吧。

demo3.py

from flask import Flask
from demo4 import root
from demo5 import admin
app=Flask(__name__) #應用實例
@app.route('/')
def lo():
return '1111'
app.register_blueprint(root,url_prefix='/') #藍圖對象和藍圖掛載點
app.register_blueprint(root,url_prefix='/root')
app.register_blueprint(root,url_prefix='/admin')
app.register_blueprint(admin,url_prefix='/')
app.register_blueprint(admin,url_prefix='/admin')
app.register_blueprint(admin,url_prefix='/root')
if __name__ == '__main__':
app.run(debug=True)

demo4.py

from flask import Flask,Blueprint
root=Blueprint('root',__name__) #藍圖名稱和藍圖所在的模塊
@root.route('/login')
def b1():
return 'hello'
@root.route('/index')
def b2():
return 'world'

demo5.py

from flask import Flask,Blueprint
admin=Blueprint('admin',__name__) #藍圖名稱和藍圖所在的模塊
@admin.route('/ff')
def bw():
return 'ergdsfg'
@admin.route('/gg')
def be():
return 'gtergsdf'

藍圖的精髓無非就是將多個模塊引入到一個主模塊中使用,相當于我們自己在寫模塊并把它當到藍圖中供調用。多個藍圖中如果有相同方法可用藍圖視圖函數來區分各自的方法。

14.視圖

一提到視圖,相信大家能想到它的意思,比如mysql數據庫中的視圖,道理其實都是互通的,并不會有太大的差別,只是功能不一樣罷了。創建視圖的方式也很簡單,都繼承自flask的views類。

1)類視圖
from flask.views import View
def ff():
return 'ok'
class st(View):
def dispatch_request(self): #必須實現這個方法
return "任性的90后boy"
# 類視圖通過add_url_rule方法和url做映射
app.add_url_rule(rule='/ff',view_func=st.as_view('tt'))

2)方法視圖

from flask.views import MethodView
def gg():
return 'ok'
class login(MethodView):
#當客戶端通過get方法進行訪問的時候執行的函數
def get(self):
return 'get'
# 當客戶端通過post方法進行訪問的時候執行的函數
def post(self):
email = request.form.get("user")
password = request.form.get("pass")
if user== 'gffsadff' and pass== '4fsaferwf':
return "登錄成功"
else:
return "登陸失敗"

# 通過add_url_rule添加類視圖和url的映射,并且在as_view方法中指定該url的名稱,方便url_for函數調用
app.add_url_rule('/gg',view_func=login.as_view('lg'))

15.補充

1)全局對象

with app.test_request_context():
print('我是第一個運行的')

看到這你應該知道它是干嘛的了吧,沒錯。

它是整個應用中最先啟動的,可以用來做一個提醒界面啥的。

2)路由別名

@app.route('/<path:url>',endpoint='name1') #路由別名為name1
def first_flask(url):
print(url_for('name1',url=url)) #如果設置了url參數,url_for(別名,加參數)
return redirect(url_for('get'))#重定向

3)添加路由規則

def fl():
return 'ok3'
#app.add_url_rule(rule=訪問的url,endpoint=路由別名,view_func=視圖名稱,methods=請求方法)
app.add_url_rule(rule='/kj',endpoint='name2',view_func=fl,methods=['GET'])

4)創建路由的其它方式

無需使用裝飾器的中央url映射方法,十分方便,要想實現它需創建三個文件:

myapp.py

from flask import Flask
import views
app = Flask(__name__)
@app.route('/')
def ll():
return 'index'

@app.route('/use/<usename>')
def use(usename):
return usename

views.py

def ll():
return 'index'
def use(usename):
return usename

main.py

from myapp import views
from flask import Flask
app=Flask(__name__)
app.add_url_rule('/', view_func=views.ll)
app.add_url_rule('/use/<usename>', view_func=views.use)
if __name__ == '__main__':
app.run(debug=True)

5)常用狀態碼

200:請求正確
404: 路徑錯誤
405: 請求方式錯誤
500: 服務器錯誤
302: 重定向
301 :永久重定向

16.總結

本文著重講解了Flask的最基礎的用法,Flask是一個十分優秀的web開發框架,它可以十分迅速的開發出web應用,但是它需要依賴眾多的包才能完善更多的功能。

文章轉自微信公眾號@Python爬蟲與數據挖掘

上一篇:

網易云音樂PC客戶端加密API逆向解析

下一篇:

表格插件wpDataTables-將 WordPress 表與 Google Sheets API 連接
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費