Python Flask 請求數據獲取響應詳解
一,請求數據及其獲取
1.1請求相關數據
#請求參數 客戶端的請求參數一般存在於三個地方 1,請求體 2,請求頭 3,URL參數 1).國定參數 2).查詢字符串 #請求參數的攜帶參數下表:
序號 | 參數或信息 | 解釋 |
1 | 固定參數 | URL的組成部分,不可缺失 |
2 | 查詢字符串:args | 根據需求,可有可無 |
3 | 表單數據 | 提交form表單是傳遞的數據 |
4 | 文件上傳:files | 用戶向服務器上傳的文件 |
5 | 請求頭:headers | 請求頭中攜帶的請求信息 |
6 | 請求方法:method | 請求所使用的請求方法 |
7 | URL地址:url | 請求的URL地址 |
1.2固定參數與轉換器
#內容提要 1.固定參數 2.固定參數的獲取 3.轉換器 4.自定義轉換器
#1,固定參數 固定參數是指在URL中固定的,是不可獲取的一部分,區別與查詢字符串,查詢字符串是可有可無的 固定參數: /article/1:如果1作為文章的id,則是不可獲取的一部分 /art/1?title="裝飾器":title跟在?後面,是查詢字符串
#2.請求參數的獲取 #(1).語法形式: @app.route('/users/<user_id>') def user_info(user_id): return '獲取到的userid為:{}'.format(user_id) #(2).語法解釋: 在路由中使用<user_id>來接收固定參數,且不要忘記傳遞視圖,即視圖必須定義形參user_id. 註意: - 路由中的user_id前可以限制類型,寫法參考:<int:user_id>,限定瞭類型,前端傳來的固定參數就必須符合類型要求,否則報錯;如果不限定類型,默認接收到為字符串類型 - 視圖必須定義形參,且形參的名字必須與路由中一直,即路由中寫user_id,視圖函數形參也必須是user_id
#3.轉換器 上面的固定參數是使用轉換器實現的,flask自帶的轉換器共有六個: - UnicodeConverter:字符串轉換器 - AnyConverter:匹配any中任意路徑,寫法:'/users/<any(xxx,yyy):user_id>' - PathConverter:路徑轉換器,與字符串轉換器相似,但參數中可以包含"/" - IntergerConverter:整形轉換器 - FloatConverter:浮點型轉換器 - UUIDConverter:UUID唯一標識碼轉換器
#4.自定義轉換器 如果flask內置轉換器無法滿足特定需求,可以自定義轉換器,自定義轉換器可以參與源碼的實現 #(1).自定義轉換器步驟 - 自定義轉換器類:繼承自BaseConverter,內部指定正則匹配規則 - 自定義轉換器類添加至轉換器容器指定 - 使用自定義轉換器 #(2).自定義轉換器實例 #導入BaseConverter from werkzaug.routing import BaseConverter #自定義Converter類 calss phoneConverter(BaseConverter): regex = r'1[3-9]\d{9}' #添加至Converter容器 app.url_map.converters['phone'] = phoneConverter #(3).使用自定義轉換器 @app.route('/user/<phone:user_id>') def user_info(user_id): return user_id
1.3查詢參數獲取
#args:查詢參數 #(1).查詢參數 查詢參數在URL中以?與主路由進行分隔,查詢參數是以鍵值對形式出現的,鍵與值使用"="連接,如下所示:/user/?userid=333 #(2).查詢參數的獲取 request.args.get('key') request.args['key'] #(3).示例: from flask import Flask from flask import request app = Flask(__name__) @app.route('/') def user_info(): #通過['key']形式獲取查詢參數中的user_id user_id_1 = request.args['userid'] #通過get方法獲取查詢中的user_id user_id_2 = request.args.get('userid') return 'user_id_1:{},user_id_2:{}'.format(user_id_1,user_id_2) #訪問路由: http://127.0.0.1:5000/?userid=333, 即可在頁面上看到結果
1.4表單數據獲取
# form: 表單數據 #(1).表單數據 form表單數據,一般應用於登錄,註冊,信息提交等.配合前端form表單使用, 一般form表單都是post請求,註意路由中指定POST請求方法,將表單數據封裝在請求體中 #(2).表單數據獲取方式 request.form.get('key') #(3).示例 from flask import Flask from flask import request app = Flask(__name__) @app.route('/',methods=['post]) def login(): #獲取form表單中的用戶名 username = request.form.get('uname') #獲取form表單中的密碼 password = request.form.get('pwd') # 用戶名與密碼的判斷 if username == 'admin' and password == 'admin123': return '登錄成功' else: return '登錄失敗' if __name__ == '__main__': app.run() # postman訪問http://127.0.0.1:5000/, 並指定form-data為{'uname': 'admin', 'pwd': 'admin123'}
1.5文件上傳
# files: 文件數據 # (1).文件對象的獲取 file_obj = request.files.get('key') # (2).文件對象的屬性 file_obj.filename: 上傳文件的文件名 file_obj.name: 上傳文件指定的key file_obj.save('path'): 文件對象保存方法 # 示例: from flask import Flask from flask import request # 創建Flask實例對象 app = Flask(__name__) @app.route('/upload', methods=['POST']) def upload_file(): # 獲取前端傳遞過來的文件對象 img = request.files.get('pic') # 獲取文件對象的文件名 file_name = img.filename # 保存文件對象 img.save(file_name) return '上傳成功!' if __name__ == '__main__': app.run()
1.6其他請求參數
# 其他參數: - headers: 記錄請求頭中的報文頭 - method: 記錄請求使用的HTTP請求方法 - url: 記錄請求的URL地址 # 示例: from flask import Flask from flask import request # 創建Flask實例對象 app = Flask(__name__) @app.route('/') def index(): # 打印請求頭信息 print(request.headers) print('-'*50) # 打印請求方法 print(request.method) print('-'*50) # 打印請求的URL print(request.url) return 'other args' if __name__ == '__main__': app.run()
二,響應數據之新書三件套
2.1字符串響應形式
# 字符串 直接使用return關鍵字返回一個字符串: return 'hello flask'
2.2模板響應格式
# 模板的返回 - 建立templates文件夾(在pycharm中Mark Directory as Template Folder, pycharm中還需要設置模板引擎為jinjia2) - 在template中建立要返回的HTML頁面 - 視圖中使用render_template('HTML文件名')返回模板 # 示例: from flask import Flask from flask import render_template app = Flask(__name__) @app.route('/') def index(): # render_template()返回模板 return render_template('index.html') if __name__ == '__main__': app.run()
拓展一些jinjia2模板引擎:
Jinjia2模板 和我們django 內置模板語法 基本一致, 我們簡單瞭解
我們在 視圖中 定義好 變量數據
@app.route("/", methods=["GET", "POST"]) def hello_world(): new_list = ["新聞1", "新聞2", "新聞3", "新聞4"] return render_template("home.html", news={"news_list": new_list, "title": "我是新標題"})
在 模板中使用 定義好的變量數據
{{變量名}} 會展示變量的值
{% for 語句 %} 循環體 {% endfor %}
<body> <h1>{{ news.title }}</h1> <h1>《功勛-李延年》</h1> {% for item in news.news_list %} <p>{{ item }}</p> {% endfor %} </body>
2.3重定向響應形式
# 重定向: 重定向是跳轉至一個新的路由, 使用redirect # 重定向形式: - 直接重定向一個外鏈 - 重定向一個內部鏈接 # 重定向外鏈示例: from flask import Flask from flask import redirect app = Flask(__name__) @app.route('/') def index(): # 訪問/根路由, 直接跳轉至百度首頁 return redirect('http://www.baidu.com/') if __name__ == '__main__': app.run() # 重定向至內部連接 from flask import Flask from flask import redirect from flask import url_for app = Flask(__name__) @app.route('/') def start(): # 使用url_for跳轉至內部鏈接, url_for()中指定某個路由的endpoint值 return redirect(url_for('idx')) # redirect直接跳轉, 內部傳入指定的路由 # return redirect('/index') @app.route('/index', endpoint='idx') def index(): return 'index頁面' if __name__ == '__main__': app.run(debug=True)
三,響應json數據與元組數據
3.1json數據響應
# 返回json數據 返回json數據需要借助flask提供的jsonify來實現 # 實例如下: from flask import Flask from flask import jsonify app = Flask(__name__) @app.route('/index', endpoint='idx') def index(): # 字典形式數據 data = { 'name': 'jeremy', 'age': 18 } # 返回json數據 return jsonify(data) # 看一下源碼 if __name__ == '__main__': app.run(debug=True)
3.2元組數據響應
# 元組形式 可以返回一個元組,這樣的元組必須是 (response, status, headers) 的形式,且至少包含一個元素。 status 值會覆蓋狀態代碼, headers 可以是一個列表或字典,作為額外的消息標頭值。 # 示例如下: from flask import Flask from flask import jsonify app = Flask(__name__) @app.route('/index', endpoint='idx') def index(): # return ('要返回的字符串', 6969是狀態碼, {'author': 'jeremy'}字典是設置在響應頭中的鍵值對信息) return ('要返回的字符串', 6969, {'author': 'jeremy'}) if __name__ == '__main__': app.run(debug=True)
四,make_response()自定義響應
# 重定向: 重定向是跳轉至一個新的路由, 使用redirect # 重定向形式: - 直接重定向一個外鏈 - 重定向一個內部鏈接 # 重定向外鏈示例: from flask import Flask from flask import redirect app = Flask(__name__) @app.route('/') def index(): # 訪問/根路由, 直接跳轉至百度首頁 return redirect('http://www.baidu.com/') if __name__ == '__main__': app.run() # 重定向至內部連接 from flask import Flask from flask import redirect from flask import url_for app = Flask(__name__) @app.route('/') def start(): # 使用url_for跳轉至內部鏈接, url_for()中指定某個路由的endpoint值 return redirect(url_for('idx')) # redirect直接跳轉, 內部傳入指定的路由 # return redirect('/index') @app.route('/index', endpoint='idx') def index(): return 'index頁面' if __name__ == '__main__': app.run(debug=True)
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- Python的flask常用函數route()
- Flask request 對象詳情
- Flask response響應的具體使用
- Flask處理Web表單的實現方法
- Python3+Flask安裝使用教程詳解