文 / 秦未
OK,今天學習Flask的請求上下文與響應,我們先看一看Flask請求和響應的過程示意圖:
首先我們從瀏覽器發送一個請求到服務端,Flask得到了這個請求以后,這個請求將會由路由系統接收,接著Flask會對這個請求的信息做一些預處理工作,將客戶的信息封裝成request對象,它包含此次訪問的所有信息,從request中我們可以獲取一些變量和參數,然后我們在視圖函數中處理這些數據并生成合適的html文件傳回給我們的客戶端,通常情況下我們并不需要直接的去產生一個response(響應)對象,但其實我們也可以對它做更細致化的處理,利用這個response(響應)對象,我們能完成更高級的數據輸出。
1.表單提交以及文件上傳的處理
上一篇文章我們已經簡單了解了一下request對象,我們知道在客戶端請求的時候,通過GET或者POST方式到達后端時,我們就需要獲取request.method的值,來對數據做進一步處理。
我們先來看看之前的login.html,我們將里面的內容擴展一下:
<!--/app/templates/blog/login.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄頁</title>
</head>
<body>
<h1>HTPP方法:{{ method }}</h1>
<form action="{{ url_for('.login') }}" method="post" enctype="multipart/form-data">
<input type="text" name="username" placeholder="username">
<input type="password" name="password" placeholder="password">
<input type="file" name="file">
<input type="submit">
</form>
</body>
</html>
接下來我們怎么獲取提交的參數呢?很簡單看代碼:
# /app/app.py
@app.route('/login/', methods=['GET', 'POST'])
def login():
# 判斷請求方式
if request.method == 'POST':
# POST方式時數據是在form里面
username = request.form.get('username')
password = request.form.get('password')
else:
# GET方式時數據是在args里面
username = request.args.get('username')
password = request.args.get('password')
return render_template('blog/login.html', method='GET')
我想有點Python基礎的人都應該看得明白,我們的值是在一個字典里面,獲取值的方法可以用['變量名'],不過我建議用get方法,因為這樣不會報錯。
這樣我們就完成了取值的操作,不過你會發現我還增加了一個提交文件的選項,那么后端是如何獲取文件并保存的呢?
這也不難,繼續看修改后的代碼:
注意:前面帶 + 號的為新增加內容,復制時請自行刪除 + 。
# - from flask import Flask, render_template, request, redirect, url_for
+ from flask import Flask, render_template, request, redirect, url_for
+ from os import path
from werkzeug.routing import BaseConverter
+ from werkzeug.utils import secure_filename
@app.route('/login/', methods=['GET', 'POST'])
def login():
# 判斷請求方式
if request.method == 'POST':
# POST方式時數據是在form里面
username = request.form.get('username')
password = request.form.get('password')
# 獲取文件
my_file = request.files.get('file')
# 獲取當前路徑
basepath = path.abspath(path.dirname(__file__))
# 將路徑連接
upload_path = path.join(basepath, 'static/uploads/')
# 保存文件并將文件名獲取封裝
my_file.save(upload_path + secure_filename(my_file.filename))
# 跳轉upload函數
return redirect(url_for('upload'))
else:
# GET方式時數據是在args里面
username = request.args.get('username')
password = request.args.get('password')
return render_template('blog/login.html', method='GET')
# 新增加的路由和函數
@app.route('/upload')
def upload():
return '<h1>上傳成功!</h1>'
然后我們還要在static目錄下新建立一個uploads文件夾,運行,上傳一個文件試試。
注意一點:上傳文件時form中一定要加上enctype="multipart/form-data"哦!否則它會什么都不做。
2.cookies的獲取以及設置
首先我們導入make_response這個包:from flask import ... make_response
再將index函數修改一下:
@app.route('/')
def index():
# 獲取cookies
# username = request.cookies.get('username')
# 封裝render_template
response = make_response(render_template('blog/index.html', **{
'text': 'Hello, World',
}))
# 設置cookies--參數1:名稱,參數2:值,expires指定過期時間;(記得導入datetime模塊!)
outdate = datetime.datetime.today() + datetime.timedelta(days=30)
response.set_cookie('username', 'admin', expires=outdate)
return response
運行:
---end---