1、flask入門與路由
2、flask路由
3、flask請求響應異常
Flask是一個基於Python實現的web開發的'微'框架html
中文文檔地址前端
Flask和Django同樣,也是一個基於MVC設計模式的Web框架python
flask流行的主要緣由:web
a)有很是齊全的官方文檔,上手很是方便 b) 有很是好的拓展機制和第三方的拓展環境,工做中常見的軟件都有對應的拓展,本身動手實現拓展也很容易 c) 微型框架的形式給了開發者更大的選擇空間
virtualenv --no-site-packages falskenv 激活windows下虛擬環境 cd Scripts activate
pip install flask
建立hello.py文件flask
from flask import Flask app = Flask(__name__) @app.route('/') def gello_world(): return 'Hello World' if __name__ == '__main__': app.run()
運行:python hello.pywindows
from flask import Flask app = Flask(__name__)
Flask類構造函數惟一須要的參數就是應用程序的主模塊或包。對於大多數應用程序,Python的__name__變量就是那個正確的、你須要傳遞的值。Flask使用這個參數來肯定應用程序的根目錄,這樣之後能夠相對這個路徑來找到資源文件。後端
@app.route('/')
客戶端例如web瀏覽器發送 請求 給web服務,進而將它們發送給Flask應用程序實例。應用程序實例須要知道對於各個URL請求須要運行哪些代碼,因此它給Python函數創建了一個URLs映射。這些在URL和函數之間創建聯繫的操做被稱之爲 路由 。設計模式
在Flask應程序中定義路由的最便捷的方式是經過顯示定義在應用程序實例之上的app.route裝飾器,註冊被裝飾的函數來做爲一個 路由。瀏覽器
在上一個示例給應用程序的根URL註冊gello_world()函數做爲事件的處理程序。若是這個應用程序被部署在服務器上並綁定了 www.example.com 域名,而後在你的瀏覽器地址欄中輸入 http://www.example.com 將觸發gello_world()來運行服務。客戶端接收到的這個函數的返回值被稱爲 響應 。若是客戶端是web瀏覽器,響應則是顯示給用戶的文檔。服務器
相似於gello_world()的函數被稱做 視圖函數 。
你的Facebook我的信息頁的URL是 http://www.facebook.com/
@app.route('/hello/<name>') def gello_world(name): return 'Hello World %s' % name
用尖括號括起來的部分是動態的部分,因此任何URLs匹配到靜態部分都將映射到這個路由。當視圖函數被調用,Flask發送動態組件做爲一個參數。在前面的示例的視圖函數中,這個參數是用於生成一個個性的問候做爲響應。
在路由中動態組件默認爲字符串,可是能夠定義爲其餘類型。例如,路由/user/
以下:
@app.route('/hello/<int:id>') def gello_stu_id(id): return 'Hello World id: %s' % id
if __name__ == '__main__': app.run()
注意: __name__ == '__main__'在此處使用是用於確保web服務已經啓動當腳本被當即執行。當腳本被另外一個腳本導入,它被看作父腳本將啓動不一樣的服務,因此app.run()調用會被跳過。
一旦服務啓動,它將進入循環等待請求併爲之服務。這個循環持續到應用程序中止,例如經過按下Ctrl-C。
有幾個選項參數能夠給app.run()配置web服務的操做模式。在開發期間,能夠很方便的開啓debug模式,將激活 debugger 和 reloader 。這樣作是經過傳遞debug爲True來實現的。
run()中參數有以下:
debug 是否開啓調試模式,開啓後修改python的代碼會自動重啓 port 啓動指定服務器的端口號 host主機,默認是127.0.0.1
pip install flask-script
調整代碼
manager = Manager(app=‘自定義的flask對象’)
啓動的地方
manager.run()
python hellow.py runserver -h 地址 -p 端口 -d -r
其中:-h表示地址。-p表示端口。-d表示debug模式。-r表示自動重啓
寫法:
converter類型:
string 字符串 int 整形 float 浮點型 path 接受路徑,接收的時候是str,/也當作字符串的一個字符 uuid 只接受uuid字符串 any 能夠同時指定多種路徑,進行限定
例子:
@app.route('/helloint/<int:id>/') @app.route('/getfloat/<float:price>/') @app.route('/getstr/<string:name>/',methods=['GET', 'POST']) @app.route('/getpath/<path:url_path>/') @app.route('/getbyuuid/<uuid:uu>/',methods=['GET', 'POST'])
實現對應的視圖函數:
@blue.route('/hello/<name>/') def hello_man(name): print(type(name)) return 'hello name:%s type:%s' % (name, type(name)) @blue.route('/helloint/<int:id>/') def hello_int(id): print(id) print(type(id)) return 'hello int: %s' % (id) @blue.route('/index/') def index(): return render_template('hello.html') @blue.route('/getfloat/<float:price>/') def hello_float(price): return 'float: %s' % price @blue.route('/getstr/<string:name>/') def hello_name(name): return 'hello name: %s' % name @blue.route('/getpath/<path:url_path>/') def hello_path(url_path): return 'path: %s' % url_path @blue.route('/getuuid/') def gello_get_uuid(): a = uuid.uuid4() return str(a) @blue.route('/getbyuuid/<uuid:uu>/') def hello_uuid(uu): return 'uu:%s' % uu
經常使用的請求類型有以下幾種
GET : 獲取 POST : 建立 PUT : 修改(所有屬性都修改) DELETE : 刪除 PATCH : 修改(修改部分屬性)
定義url的請求類型:
@blue.route('/getrequest/', methods=['GET', 'POST'])
在Flask項目中能夠用Blueprint(藍圖)實現模塊化的應用,使用藍圖可讓應用層次更清晰,開發者更容易去維護和開發項目。藍圖將做用於相同的URL前綴的請求地址,將具備相同前綴的請求都放在一個模塊中,這樣查找問題,一看路由就很快的能夠找到對應的視圖,並解決問題了。
pip install flask_blueprint
blue = Blueprint(‘first’,\_\_name\_\_)
注意:Blueprint中傳入了兩個參數,第一個是藍圖的名稱,第二個是藍圖所在的包或模塊,__name__表明當前模塊名或者包名
app = Flask(\_\_name\_\_) app.register_blueprint(blue, url_prefix='/user')
注意:第一個參數即咱們定義初始化定義的藍圖對象,第二個參數url_prefix表示該藍圖下,全部的url請求必須以/user開始。這樣對一個模塊的url能夠很好的進行統一管理
修改視圖上的裝飾器,修改成@blue.router(‘/’)
@blue.route('/', methods=['GET', 'POST']) def hello(): # 視圖函數 return 'Hello World'
注意:該方法對應的url爲127.0.0.1:5000/user/
語法:
無參狀況: url_for('藍圖中定義的第一個參數.函數名') 有參狀況: url_for('藍圖中定義的第一個參數.函數名', 參數名=value)
定義跳轉:
from flask import url_for, redirect # 第一步: 生成藍圖對象 blueprint = Blueprint('first', __name__) @blueprint.route('/') def hello(): return 'hello' @blueprint.route('/stu/<id>/') def stu(id): return 'hello stu: %s' % id # 1. 定義路由跳轉到hello方法 @blueprint.route('/redirect/') def my_redirect(): # 第一種方法 # redirect: 跳轉 # url_for: 反向解析 # 'first.hello': 藍圖第一個參數.跳轉到的函數名 return redirect(url_for('first.hello')) # 第二種方法 return redirect('/hello/index/') # 2. 定義路由跳轉到stu方法 @blueprint.route('/redirect_id/') def stu_redirect(): return redirect(url_for('first.stu', id=3))
注意: 反向解析可使用url_for方法,也能夠直接定義跳轉的路由地址。
語法:
無參形式: {{ url_for('藍圖中定義的第一個參數.函數名') }} 有參形式: {{ url_for('藍圖中定義的第一個參數.函數名',參數名=value) }}
服務端在接收到客戶端的請求後,會自動建立Request對象
由Flask框架建立,Requesy對象不可修改
屬性:
url:完整的請求地址 base_url:去掉GET參數的url host_url:只有主機和端口號的url path:路由中的路徑 method:請求方法 remote_addr:請求的客戶端的地址 args:GET請求參數 form:POST請求參數 files:文件上傳 headers:請求頭 cookies:請求中的cookie
a)args是get請求參數的包裝,args是一個ImmutableMultiDict對象,類字典結構對象
b)數據存儲也是key-value
c) 獲取GET請求中傳遞的參數,request.args
a)form是post請求參數的包裝,args是一個ImmutableMultiDict對象,類字典結構對象
b)數據存儲也是key-value
c) 獲取POST請求中傳遞的參數,request.form
重點:ImmutableMultiDict是相似字典的數據結構,可是與字典的區別是,能夠存在相同的鍵。
在ImmutableMultiDict中獲取數據的方式,dict['key']或者dict.get('key')或者dict.getlist('key')
Response是由開發者本身建立的
建立方法:
from flask import make_response make_response建立一個響應,是一個真正的Response對象
狀態碼:
格式:make_reponse(data,code),其中data是返回的數據內容,code是狀態碼
a)直接將內容當作make_response的第一個參數,第二個參數直接寫返回的狀態碼 b)直接在render後加返回的狀態碼
例子1:
定義一個獲取GET請求的request的方法,並將返回成功的請求的狀態碼修改成200
@blue.route('/getrequest/', methods=['GET']) def get_request(): print(request) return '獲取request', 200
例子2:
返回response響應,並添加返回結果的狀態碼200
@blue.route('/getresponse/') def get_response(): response = make_response('<h2>我是響應</h2>', 500) return response
或者:
@blue.route('/getresponse/', methods=['GET']) def get_user_response(): login_html = render_template('login.html') res = make_response(login_html, 200) return res
自動拋出異常:abort(狀態碼)
捕獲異常處理:errorhandler(狀態碼),定義的函數中要包含一個參數,用於接收異常信息
@blue.route('/make_abort/') def get_abort(): abort(400) return '終止'
@blue.errorhandler(400) def handler(exception): return '捕獲到異常信息:%s' % exception