官網:http://python.usyiyi.cn/translate/flask_011_ch/index.html
1. FLASK 概述
Flask是使用python語言編寫的一個輕量級的web框架
內部WSGI實現採用Werkzeug,模板引擎使用Jinja2,使用BSD授權開源
在行業中,Flask也被稱爲microframework(微框架),因爲Flask使用簡單的核心操作,通過extension增加額外的功能,並且Flask沒有默認的數據庫和表單驗證等支持
2. QUICK START
2.1. Installation
Flask的安裝比較簡單,和常規的模塊安裝方式一致,通過python提供的包安裝工具pip或者easy_install都可以正常安裝
pip install flask |
2.2. Hello World
安裝完Flask之後,我們通過一個簡單的應用程序來認識什麼是Flask,Flask web項目的開發步驟以及核心組成部分
創建demo01.py,編輯如下內容
from flask import Flask app = Flask(__name__) @app.route(“/”) def hello(): return “Hello Flask!” |
if __name__ == “__main__”: app.run() |
可以看到,flask使用最簡單的操作代碼,就可以完成一個web項目需要的基本功能了
3.demo案例
3-1.簡單的demo,瞭解falsk基本結構
''' 簡單的flask應用 ''' # 引入需要的模塊 from flask import Flask # Flask爲核心處理模塊,用來創建一個app應用 app=Flask(__name__) # 定義視圖處理函數和對應的訪問路由,該函數和路由已經被封裝在app中。 @app.route('/') def index(): return '<h1>首頁</h1>' @app.route('/login') def login(): return '<h1>登錄</h1>' @app.route('/register') def register(): return '<h1>註冊</h1>' if __name__=='__main__': app.run() """
總結:Django、Tornado和Flask三種框架定義視圖處理函數(類)和路由的區別
Django中定義視圖處理函數和路由:
視圖處理函數:通過在views.py文件中,通過def關鍵字定義視圖處理函數
路由:通過在urls.py文件中,urlpatterns=[]定義不同的路由和對應的視圖處理函數
Tornado中定義視圖處理類和路由: 視圖處理類:通過class 關鍵字定義視圖處理類,繼承自tornado.web.RequestHandler 訪問路由:通過tornado.web.Application配置路由信息,以元組的形式[(),],另外在此處可以配置其他信息 Flask中定義視圖處理函數和訪問路由 視圖處理函數:通過def 關鍵字定義視圖處理類 訪問路由:直接在對應的視圖處理函數上方,通過@app.route()定義對應的訪問路由,可攜帶參數 """
3-2.flask傳參
# 引入需要的模塊 from flask import Flask # 使用Flask核心處理模塊創建app應用 app = Flask(__name__) # 定義訪問路由和對應的視圖處理函數 @app.route('/login/<username>') # 將參數直接通過路由傳遞給後端 def login(username): # 括號中用來接收參數 return '接收到參數%s' % username @app.route('/index/<int:user_id>') # 傳遞指定類型的參數 def index(user_id): return '接收到指定的int類型的參數:[%s]' % user_id if __name__ == '__main__': app.run() """
總結:
Django中定義路由傳遞參數: url('^index/(?P<u_id>\d+)/') 在Django2中path('index/<int:u_id>/) Tornado中定義路由傳遞參數: Flask中定義路由傳遞參數 @app.route('/index/<int:user_id>') """
3-3.get和post請求方式傳遞參數和接收參數,藉助於postman插件
postman:專門用於8種請求方式的測試的插件。
''' get方式和post方式接收參數的方法不同,這裏使用了postman(專門測試8中請求方式的插件),進行兩種方式的測試 ''' # 引入需要的模塊 from flask import Flask,request # 使用Flask核心處理模塊創建一個app應用 app=Flask(__name__) # 定義訪問路由和視圖處理類 @app.route('/get') def get_params(): # request的args屬性是專門用來接收get參數的 params=request.args.get('get_params') return '接收到get參數:【%s】'%params @app.route('/post',methods=['POST'])
# 默認所有的視圖處理函數只支持get請求,若需要支持其他請求方式,需使用methods屬性,以列表的形式列出def post_params(): # request的form屬性是專門用來接收post參數的 params=request.form.get('post_params') return '接收到post參數:【%s】'%paramsif __name__=='__main__': app.run()
"""
不同請求參數的接收>>>
Django中:
request.GET/POST
Tornado中:
self.get_query_argument()/get_query_arguments()
self.get_body_argument()/get_body_arguments()
self.get_arguement()/get_arguments()
Flask中:
request.args.get("key")
request.form.get("key")
不同請求方式的區分>>>
Django中:
通過request.method == "GET" / "POST"進行視圖函數中不同請求方式的處理區分
同樣可以通過裝飾器註解方式:@require_POST @require_GET方式指定視圖函數只能接收那種請求方式
Tornado中:
可以通過直接重寫父類RequestHandler中的get/post/..的請求處理方法來實現不同的請求方式的區分
Flask中:
通過路由裝飾器註解的methods屬性來指定視圖處理函數可以接收那種請求方式
@app.route("/", methods=["get", "post"..])
"""
3-4.網頁模板和靜態資源
.py文件
# 引入需要的模塊 from flask import Flask, request, render_template # 創建app應用 app = Flask(__name__) @app.route('/index') def index(): plist = [{'name': 'jerry'}, {'name': 'tom'}, {'name': 'suker'}]
# render_template會自動搜索同級目錄下的templates文件夾找到對應的html文件 return render_template('index.html', plist=plist) if __name__ == '__main__': app.run()
"""
靜態文件和網頁模板的處理:
Django中:
子模塊應用:templates/默認保存網頁模板;static/默認保存靜態資源;不需要配置
根項目:settings.py中通過TEMPLATES>DIRS配置網頁模板文件夾,通過STATICFILES_DIRS配置靜態資源文件夾
Tornado中:
通過tornado.web.Application中的配置選項
template_path配置網頁模板文件夾位置,static_path配置靜態資源文件夾位置
Flask中:
默認templates/中保存網頁模板;static/中保存靜態資源,不需要配置
模板語法操作:
Django中:
默認使用自己的模板語法:Django Template Language:DTL語法
Tornado中:
默認使用jinja模板語法:~經過一定改造的模板語法
Flask中:
默認使用第三方的jinja2模板語法,是在DTL語法的基礎上完善的一種專門給python使用的模板語法
"""
在該文件同級目錄下創建templates文件夾和static文件,用來保存網頁模板和靜態資源
index.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用戶首頁</title> <link href="/static/index.css" rel="stylesheet"> </head> <body> <h1>用戶首頁</h1> {% for p in plist %} # 注意這裏的模板語法,django中{% empty %}在這裏替換爲{% else %}} <p>{{p['name']}}</p> {% else %} <p>還沒有任何用戶</p> {% endfor %} </body> </html>
文檔總結:
1.1. API INTRODUCTION
l flask.Flask
核心模塊之一,Flask可以構建封裝完成的WSGI應用
l flask.Flask.route(path)
核心模塊之一,Flask應用中的路由配置,主要加載在視圖操作函數上,完成path路徑和視圖函數之間的路由映射關係
l flask.Flask.run()
核心模塊之一的函數,通過run()函數將web應用部署到web服務器並啓動服務
1.2. 項目訪問
通過run()函數直接操作啓動服務器,只能在本機訪問,如果要讓所有主機所在的網絡地址都可以訪問當前web項目,添加host參數配置即可
app.run(host=“0.0.0.0”) |
1.3. 調試模式
默認情況下Flask沒有啓用調試模式,可以在開發過程中,通過debug配置完成調試模式的啓用,調試模式下視圖頁面和控制檯將會展示更多的更加詳細的錯誤信息
app.debug = True app.run(host=“0.0.0.0”) |
注意:Flask項目中,調試模式的啓用,會允許客戶端執行任意python代碼,是一個非常大的安全隱患,通常情況下只是在開發過程中使用;在生產環境用嚴禁使用調試。 |
1.4. 路由操作
Flask項目中,路由通過@app.route(path)註解的方式進行添加,將訪問地址和視圖處理函數直接進行關聯
from flask import Flask app = Flask(__name__) @app.route(“/”) def index(): pass @app.route(“/login”) def login(): pass |
1.5. RESTful參數操作
路由將對應URL請求路徑和視圖處理函數進行了關聯,我們可以通過URL地址進行參數的傳遞,也就是RESTful風格的參數操作
在Flask中,在路由路徑中通過<變量名稱>的方式定義URL路徑可以接受參數,也可以在參數定義時,定義參數變量的數據類型<類型:變量名稱>
在視圖處理函數的參數列表中,通過該變量名稱可以直接使用接收到的參數
from flask import Flask app = Flask(__name__) @app.route(“/user/<username>“) def check_username(username): return “hello %s” % username @app.route(“/userinfo/<int:user_id>“) def check_userinfo(user_id): return “hello %s” % user_id |
1.6. GET/POST請求操作
在@app.route(path)常規路由定義時,參數的傳遞方式可以通過RESTful方式進行提交,如果是傳統的GET/POST提交參數數據時,可以通過Flask指定的方式進行參數數據的獲取
from flask import Flask, request app = Flask(__name__) @app.route(“/get”, methods=[“GET”]) def get_param(): print(request.args.get(“param_name”)) return “hello get method!” @app.route(“/post”, methods=[“POST”]) def post_param(): print(request.form.get(“name”)) return “hello post method!” |
1.7. 視圖模板
Flask中通過flask.render_template(..)渲染指定的網頁模板給瀏覽器查看,同時可以附帶對應的參數在網頁模板中進行展示
模板的定義不需要配置任何選項,自動在templates/目錄中查詢對應的模板頁面
並且在網頁模板中,可以正常使用Jinja2模板語法進行數據的渲染展示操作
from flask import Flask, render_template app = Flask(__name__) @app.route(“/”) def index(): users = [ {“name”:”admin”, “age”:12}, {“name”:”manager”, “age”:23}, {“name”:”administrator”, “age”:11}, ] return render_template(“index.html”, users=users) |
templates/index.html視圖網頁中通過模板語法渲染數據
<ul> {% for u in users%} <li>{{u.name}}--{{u.age}}</li> {% endfor %} </ul> |
注意:視圖處理函數中,返回渲染數據,可以直接返回渲染的網頁,同樣可以返回下一個請求的路由 render_template(..):渲染返回指定的網頁模板數據 redirect(..):渲染返回下一個繼續請求的路由 |
1.8. 靜態文件
Flask中的靜態文件,存放在項目的static/文件夾中,可以直接定義各種靜態文件並在項目網頁模板中通過/static/..的路徑進行操作
項目根目錄下創建static/文件夾,文件夾中創建對應的靜態文件index.css
/home_dir/static/index.css
*{margin:0px;padding:0px;font-size:16px;} p{color:orange;} |
在頁面模板中,可以通過路徑引入對應的靜態文件
/home_dir/templates/index.html
<!doctype html> <html> .. <link rel=“stylesheet” href=“/static/index.css”> .. </html> |