Python Flask 請求數(shù)據(jù)獲取響應詳解
一,請求數(shù)據(jù)及其獲取
1.1請求相關數(shù)據(jù)
#請求參數(shù) 客戶端的請求參數(shù)一般存在于三個地方 1,請求體 2,請求頭 3,URL參數(shù) 1).國定參數(shù) 2).查詢字符串 #請求參數(shù)的攜帶參數(shù)下表:
序號 | 參數(shù)或信息 | 解釋 |
1 | 固定參數(shù) | URL的組成部分,不可缺失 |
2 | 查詢字符串:args | 根據(jù)需求,可有可無 |
3 | 表單數(shù)據(jù) | 提交form表單是傳遞的數(shù)據(jù) |
4 | 文件上傳:files | 用戶向服務器上傳的文件 |
5 | 請求頭:headers | 請求頭中攜帶的請求信息 |
6 | 請求方法:method | 請求所使用的請求方法 |
7 | URL地址:url | 請求的URL地址 |
1.2固定參數(shù)與轉換器
#內容提要 1.固定參數(shù) 2.固定參數(shù)的獲取 3.轉換器 4.自定義轉換器
#1,固定參數(shù) 固定參數(shù)是指在URL中固定的,是不可獲取的一部分,區(qū)別與查詢字符串,查詢字符串是可有可無的 固定參數(shù): /article/1:如果1作為文章的id,則是不可獲取的一部分 /art/1?title="裝飾器":title跟在?后面,是查詢字符串
#2.請求參數(shù)的獲取 #(1).語法形式: @app.route('/users/<user_id>') def user_info(user_id): return '獲取到的userid為:{}'.format(user_id) #(2).語法解釋: 在路由中使用<user_id>來接收固定參數(shù),且不要忘記傳遞視圖,即視圖必須定義形參user_id. 注意: - 路由中的user_id前可以限制類型,寫法參考:<int:user_id>,限定了類型,前端傳來的固定參數(shù)就必須符合類型要求,否則報錯;如果不限定類型,默認接收到為字符串類型 - 視圖必須定義形參,且形參的名字必須與路由中一直,即路由中寫user_id,視圖函數(shù)形參也必須是user_id
#3.轉換器 上面的固定參數(shù)是使用轉換器實現(xiàn)的,flask自帶的轉換器共有六個: - UnicodeConverter:字符串轉換器 - AnyConverter:匹配any中任意路徑,寫法:'/users/<any(xxx,yyy):user_id>' - PathConverter:路徑轉換器,與字符串轉換器相似,但參數(shù)中可以包含"/" - IntergerConverter:整形轉換器 - FloatConverter:浮點型轉換器 - UUIDConverter:UUID唯一標識碼轉換器
#4.自定義轉換器 如果flask內置轉換器無法滿足特定需求,可以自定義轉換器,自定義轉換器可以參與源碼的實現(xiàn) #(1).自定義轉換器步驟 - 自定義轉換器類:繼承自BaseConverter,內部指定正則匹配規(guī)則 - 自定義轉換器類添加至轉換器容器指定 - 使用自定義轉換器 #(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查詢參數(shù)獲取
#args:查詢參數(shù) #(1).查詢參數(shù) 查詢參數(shù)在URL中以?與主路由進行分隔,查詢參數(shù)是以鍵值對形式出現(xiàn)的,鍵與值使用"="連接,如下所示:/user/?userid=333 #(2).查詢參數(shù)的獲取 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']形式獲取查詢參數(shù)中的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表單數(shù)據(jù)獲取
# form: 表單數(shù)據(jù) #(1).表單數(shù)據(jù) form表單數(shù)據(jù),一般應用于登錄,注冊,信息提交等.配合前端form表單使用, 一般form表單都是post請求,注意路由中指定POST請求方法,將表單數(shù)據(jù)封裝在請求體中 #(2).表單數(shù)據(jù)獲取方式 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: 文件數(shù)據(jù) # (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 # 創(chuàng)建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其他請求參數(shù)
# 其他參數(shù): - headers: 記錄請求頭中的報文頭 - method: 記錄請求使用的HTTP請求方法 - url: 記錄請求的URL地址 # 示例: from flask import Flask from flask import request # 創(chuàng)建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()
二,響應數(shù)據(jù)之新書三件套
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 內置模板語法 基本一致, 我們簡單了解
我們在 視圖中 定義好 變量數(shù)據(jù)
@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": "我是新標題"})
在 模板中使用 定義好的變量數(shù)據(jù)
{{變量名}} 會展示變量的值
{% for 語句 %} 循環(huán)體 {% 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數(shù)據(jù)與元組數(shù)據(jù)
3.1json數(shù)據(jù)響應
# 返回json數(shù)據(jù) 返回json數(shù)據(jù)需要借助flask提供的jsonify來實現(xiàn) # 實例如下: from flask import Flask from flask import jsonify app = Flask(__name__) @app.route('/index', endpoint='idx') def index(): # 字典形式數(shù)據(jù) data = { 'name': 'jeremy', 'age': 18 } # 返回json數(shù)據(jù) return jsonify(data) # 看一下源碼 if __name__ == '__main__': app.run(debug=True)
3.2元組數(shù)據(jù)響應
# 元組形式 可以返回一個元組,這樣的元組必須是 (response, status, headers) 的形式,且至少包含一個元素。 status 值會覆蓋狀態(tài)代碼, headers 可以是一個列表或字典,作為額外的消息標頭值。 # 示例如下: from flask import Flask from flask import jsonify app = Flask(__name__) @app.route('/index', endpoint='idx') def index(): # return ('要返回的字符串', 6969是狀態(tài)碼, {'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)
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
Python實現(xiàn)生成多種有規(guī)律的數(shù)字序列
在?Python?編程中,生成數(shù)字序列是一項常見且重要的任務,本文將深入探討如何使用Python中的內置函數(shù)、列表推導式、生成器等方式來生成多種有規(guī)律的數(shù)字序列,需要的可以參考下2024-03-03Python+Pygame實戰(zhàn)之吃豆豆游戲的實現(xiàn)
這篇文章主要為大家介紹了如何利用Python中的Pygame模塊實現(xiàn)仿吃豆豆游戲,文中的示例代碼講解詳細,對我們學習Python游戲開發(fā)有一定幫助,需要的可以參考一下2022-06-06基于logstash實現(xiàn)日志文件同步elasticsearch
這篇文章主要介紹了基于logstash實現(xiàn)日志文件同步elasticsearch,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08Python 中l(wèi)ist ,set,dict的大規(guī)模查找效率對比詳解
這篇文章主要介紹了Python 中l(wèi)ist ,set,dict的大規(guī)模查找效率對比詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10Pycharm在指定目錄下生成文件和刪除文件的實現(xiàn)
這篇文章主要介紹了Pycharm在指定目錄下生成文件和刪除文件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12