1. Flask概述
Flask是使用python語言編寫的一個輕量級的web框架
內部WSGI實現采用Werkzeug,模板引擎使用Jinja2,使用BSD授權開源
在行業中,Flask也被稱為microframework(微框架),因為Flask使用簡單的核心操作,通過extension增加額外的功能,并且Flask沒有默認的數據庫和表單驗證等支持
2. Flask簡單操作
2.1 flask的安裝
pip install flask
會默認安裝幾個基礎的第三方模塊。
翻譯中文官方文檔(http://python.usyiyi.cn/translate/flask_011_ch/index.html)
2.2 簡單入門程序
# 引入需要的模塊 flask核心處理模塊
from flask import Flask
# 通過當前文件構建一個app應用~~當前文件就是 web app程序的入口
app = Flask(__name__)
# 定義視圖處理函數~路由+視圖函數(綁定在一起)->加載到 app 中
@app.route(“/”)
def hello():
return “Hello Flask!”
#啟動程序
if __name__ == “__main__”:
app.run()
flask.Flask
核心模塊之一,Flask可以構建封裝完成的WSGI應用
flask.Flask.route(path)
核心模塊之一,Flask應用中的路由配置,主要加載在視圖操作函數上,完成path路徑和視圖函數之間的路由映射關系
flask.Flask.run()
核心模塊之一的函數,通過run()函數將web應用部署到web服務器并啟動服務
2.3 項目訪問
通過run()函數直接操作啟動服務器,只能在本機訪問,如果要讓所有主機所在的網絡地址都可以訪問當前web項目,添加host參數配置即可
app.run(host=“0.0.0.0”)
2.4 項目調試
默認情況下Flask沒有啟用調試模式,可以在開發過程中,通過debug配置完成調試模式的啟用,調試模式下視圖頁面和控制臺將會展示更多的更加詳細的錯誤信息
app.debug = True
app.run(host=“0.0.0.0”)
注意:Flask項目中,調試模式的啟用,會允許客戶端執行任意python代碼,是一個非常大的安全隱患,通常情況下只是在開發過程中使用;在生產環境用嚴禁使用調試。
2.5 flask路由操作
Flask項目中,路由通過@app.route(path)注解的方式進行添加,將訪問地址和視圖處理函數直接進行關聯
from flask import Flask
app = Flask(__name__)
@app.route(“/”)
def index():
pass
@app.route(“/login”)
def login():
pass
2.6 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
2.7 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!”
2.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>
2.9 文件上傳
import os
from flask import Flask, request, redirect, url_for, flash
from werkzeug.utils import secure_filename
# 文件上傳路徑
UPLOAD_FOLDER = '/path/to/the/uploads'
# 允許上傳文件的文件名稱:任何時候,不要讓用戶選擇上傳的文件[用戶是千變萬化的!]
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
app = Flask(__name__)
# 將上傳路徑配置給web應用程序
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
#上傳文件限制為最大 16 MB 。 如果傳輸較大的文件將產生[`RequestEntityTooLarge`]異常。
#app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
# 定義一個函數,用于判斷文件的后綴名稱
def allowed_file(filename):
# "." in filename 判斷是不是有 ' . ' >> True / False
# "filename".rsplit('.', 1)[1].lower in ALLOWED_EXTENSIONS >> True/Flase
#判斷文件后綴是不是符合允許上傳的文件后綴
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
# 上傳文件的核心操作代碼,允許通過get/post兩種方式訪問這個視圖函數
@app.route('/', methods=['GET', 'POST'])
def upload_file():
#如果用戶通過post請求,應該是要上傳文件了
if request.method == 'POST':
#判斷用戶提交的表單數據庫中是否包含了 文件
if 'file' not in request.files:
#在響應中給用戶返回一個消息
flash('用戶沒有提交文件')
#如果沒有包含文件,直接重定向跳轉到用戶訪問的路徑中
return redirect(request.url)
#獲取用戶表單中提交的文件,根據name屬性直接獲取
file = request.files['file']
#判斷文件名稱是否存在,如果不存在提示用戶沒有選擇文件
if file.filename == '':
flash('用戶沒有選擇任何文件')
return redirect(request.url)
# 判斷用戶已經上傳了文件,判斷~文件的后綴名稱是否滿足需要
if file and allowed_file(file.filename):
# 判斷并獲取文件的名稱,避免出現文件注入覆蓋問題
filename = secure_filename(file.filename)
# 保存文件
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
# 請求重定向跳轉到指定的視圖函數
return redirect(url_for('uploaded_file',
filename=filename))
if __name__ == "__main__":
s = "headeimg.mp4"
print(allowed_file(s))
文件上傳:web項目中非常重要的常見的一個功能
在文件上傳操作過程中,會存在一定的安全問題,業務功能涉及到用戶
將文件提交到服務器進行保存,所以要注意用戶有可能提交非法文件到
服務器中的某個路徑,覆蓋服務器上的文件,達到遠程代碼通過上傳的
文件注入到服務器進行提權的漏洞!某些非法訪問人員就有可能獲取到
服務器的最高權限!
2.10 Cookie
文檔(http://dormousehole.readthedocs.io/en/latest/quickstart.html?highlight=cookie)
-
向cookie中存儲數據
from flask import make_response @app.route('/') def index(): resp = make_response(render_template(...)) resp.set_cookie('username', 'the username') return resp
-
從cookie中獲取數據
from flask import request username = request.cookies.get('username') # 使用 cookies.get(key) 來代替 cookies[key] , # 以避免當 cookie 不存在時引發 KeyError 。
-
刪除cookie
(1) 可以通過在瀏覽器中設置來清除cookie. (2) 使用Response的set_cookie進行清除,直接設置為空 response.set_cookie('Name','',expires=0) return response (3)使用Response的 delete_cookie方法. @app.route('/del_cookie2') def del_cookie2(): response=make_response('delete cookie2') response.delete_cookie('Name') return response
2.11 Session
使用session時,首先添加一個安全混淆秘鑰app.secret_key = “Iw1SapGPQSibYrOQrHtLUQ==“
向session中存儲數據
from flask import session
app = Flask(__name__)
@app.route(“/session/<name>“)
def session_set(name):
session[“name”] = name
return “session operations ok!”
從session中獲取數據
@app.route(“/session_get”)
def session_get():
value = session.get(“name”)
return “session operations: %s” % value
3. 項目部署
參考官方文檔(http://docs.jinkan.org/docs/flask/deploying/index.html#deployment)