盤點Python網(wǎng)頁開發(fā)輕量級框架Flask知識(上篇)
前言
今天來給大家說一個Python的輕量級web開發(fā)框架-------Flask,為什么要推薦它呢?當然是因為它夠輕量級了,開發(fā)迅速是它的特點,當然它也有缺點,不過這里不說,因為既用它又說它差感覺不好。
一、安裝flask
- pip install flask #需要注意的是,還有flake,那個是檢查錯誤的模塊,不要搞混了
pip install flask #需要注意的是,還有flake,那個是檢查錯誤的模塊,不要搞混了
可以看到成功了,總共下載了四個模塊,分別是對應的web開發(fā)中的模板渲染,網(wǎng)絡服務都是一些flask依賴包。
二、flask的用法
1.啟動
既然說到用法,那第一個就肯定得說說它是怎么啟動的,不然別人哪里還學的下去啊,廢話少說,開干。
- from flask import Flask
- app=Flask(__name__) #創(chuàng)建應用實例
- @app.route('/') # route裝飾器創(chuàng)建路由
- def hello(): # 訪問此路由時執(zhí)行的視圖函數(shù)
- return 'hello' # 視圖函數(shù)的返回值,又叫‘響應’
- if __name__ == '__main__':
- app.run(debug=True) #開始運行flask應用程序,以調試模式運行
- #可以設置啟動的host地址和端口號,具體方法:
- app.run(host='192.168.1.2',port=3243)
從上面可以看出,因為我修改了視圖函數(shù)和返回值,只需在瀏覽器刷新即可,完全不用退出重啟,sublime text 3真是神器啊,給力,墻裂建議大家使用。
2.創(chuàng)建Flask應用注意事項
要想創(chuàng)建一個Flask應用,首先我們要建立一個項目文件夾,里面至少要有兩個文件夾,一個存放媒體文件(static),一個存放網(wǎng)頁文件(templates),如果Python程序不多,可以不用給它單獨建立文件夾。Flask不像Django一樣可以自動創(chuàng)建文件夾,需要我們自己創(chuàng)建。如果你想查看flask創(chuàng)建的路由信息:
url_map存儲的是url與endpoint的映射。那么這個endpoint是什么意思了?實際上,當請求傳來一個url的時候,會先通過rule找到endpoint,然后再根據(jù)endpoint再找到對應的視圖函數(shù)。通常,endpoint的名字都和視圖函數(shù)名一樣。這里還有一點特別注意,那就是所有的控制臺輸出信息語句必須寫在app.run()之前,否則不起作用。
3.Flask的妙用
我們可以看到Flask里面有一個name,這個是為了啟動模板專門設立的,除了這個,它還有:
static_url_path:靜態(tài)網(wǎng)頁地址
static_folder:靜態(tài)地址,默認為static文件夾
template_folder:模板文件夾,默認為templates文件夾
4.添加配置文件
1)直接在app.run()函數(shù)里添加
比如以調試模式運行Flask應用就可以使用:app.run(debug=True)
2)直接配置
- app.config=True
3)建立配置文件
在項目文件夾根目錄建立一個配置文件夾,名字為 hw.hw,后綴名你隨便取,內(nèi)容為 DEBUG=True,然后在app.run()前面添加app.config.from_pyfile('hw.hw') 即可。
5.視圖函數(shù)用法
1)下級頁面
- @app.route('/index')
- def index():
- return 'index'
2)轉換器
- @app.route('/index/<int:num>') #定義轉換器名字num
- def num(num): #將轉換器傳入函數(shù)中
- if num>10: #如果它的值大于10輸出dog,小于10輸出pig
- return 'dog'
- else:
- return 'pig'
這里需要說到的是,轉換器主要是將頁面后的值作為某一個標準來得到另一個頁面,我們常看到的加密字符串就是用這個做的,那么它有哪些類型呢?
Flask的默認轉換器:DEFAULT_CONVERTERS = {
- Flask的默認轉換器:DEFAULT_CONVERTERS = {
- ‘default’: UnicodeConverter,
- ‘string’: UnicodeConverter,
- ‘any’: AnyConverter,
- ‘path’: PathConverter,
- ‘int’: IntegerConverter,
- ‘float’: FloatConverter,
- ‘uuid’: UUIDConverter,}
除此之外,我們也可以自定一轉換器,定義轉換器需要使用依賴包,方法如下:
- class rc(BaseConverter):
- # 重寫父類的屬性,定義轉換器規(guī)則
- def __init__(self,url_map):
- super(rc,self).__init__(url_map)
- #驗證QQ郵箱的正則表達式
- self.regex ='[0-9a-zA-Z_]{0,19}@qq.com'
- #定義視圖函數(shù)下的返回值
- 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
可以通過反向解析將添加了自定義轉換器的視圖函數(shù)拿來用,這里需要用到重定向和反向解析:
- @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.重定向
重定向即是指從一個網(wǎng)頁跳轉到另一個網(wǎng)頁,相當于刷新之后的操作,這里涉及到flask里的兩個模塊(redirect,url_for)。
1)直接跳轉
直接跳轉到路由下
- from flask import redirect,url_for
- @app.route('/refer')
- def refer():
- return redirect('/1')
這樣就可以直接跳轉到路由函數(shù)fg中并顯示返回值。
2)間接跳轉
我們可以先訪問路由函數(shù),然后跳轉到相應內(nèi)容頁面
- @app.route('/ref')
- def ref():
- return redirect(url_for('fg')) #跳轉
這樣直接訪問ref子頁面就可以直接跳轉到相應頁面了
7.定義錯誤頁面
有兩種方式,一是使用系統(tǒng)的abort直接賦值,二是使用自定義errorhandler函數(shù)。
1)abort
直接使用系統(tǒng)自帶的錯誤內(nèi)容
- @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
自定義錯誤頁面內(nèi)容
- @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數(shù)據(jù)讀取
flask中有個非常給力的可以處理json數(shù)據(jù)的模塊,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離現(xiàn)在的時間)
- #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' #這里不允許出現(xiàn)中文
- 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里面保留的就是會話內(nèi)容,它存在于cookie當中,通過它我們可以直接登陸某些已經(jīng)登陸過的系統(tǒng)。要想操作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)
二、索引獲取
這種方式如果獲取不到值容易產(chǎn)生異常,建議用上一種方法,除非你知道一定能獲取到值。
- @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的最基礎的用法,F(xiàn)lask是一個十分優(yōu)秀的web開發(fā)框架,它可以十分迅速的開發(fā)出web應用,但是它需要依賴眾多的包才能完善更多的功能。這里只是講述了Flask一半的知識,下一篇文章,繼續(xù)給大家盤點,一起學習,共同進步!