Python flask框架請(qǐng)求體數(shù)據(jù)、文件上傳、請(qǐng)求頭信息獲取方式詳解
獲取請(qǐng)求體數(shù)據(jù)
與Django不同的是,flask是不需要將request對(duì)象作為第一個(gè)參數(shù)傳入視圖函數(shù),他的request對(duì)象是來自于flask,是一個(gè)請(qǐng)求上下文對(duì)象(全局變量 --> 線程局部變量,使用起來就像線程全局變量一樣,具有較高的隔離性),我們只需導(dǎo)入即可使用,request對(duì)象中保存了一次HTTP請(qǐng)求的一切信息。
1.獲取表單數(shù)據(jù)(不包含上傳文件)
視圖函數(shù)
@app.route("/form", methods=["get","post"]) def form(): """ 獲取客戶端請(qǐng)求的請(qǐng)求體[表單] # :return: """ """ 獲取表單數(shù)據(jù) 請(qǐng)求url: """ """獲取表單數(shù)據(jù)[不包含上傳文件]""" print(request.form) # # ImmutableMultiDict([('username', 'root'), ('password', '123456'), ('fav', 'swimming'), ('fav', 'watch TV')]) # # 獲取表單項(xiàng)數(shù)據(jù)[單個(gè)值] print(request.form.get("username")) # root print(request.form.get('pwd')) # # 獲取表單項(xiàng)數(shù)據(jù)[多個(gè)值] print(request.form.getlist("fav")) # ['swimming', 'watch TV'] return "hello, jingtian flask"
postman請(qǐng)求
非文件上傳類post請(qǐng)求,使用x-www-form-urlencoded類型表單數(shù)據(jù)
看下終端打印
2.獲取表單數(shù)據(jù)(包含文件上傳)
視圖函數(shù)
@app.route("/form", methods=["get","post"]) def form(): """ 獲取客戶端請(qǐng)求的請(qǐng)求體[表單] # :return: """ """ 獲取表單數(shù)據(jù) 請(qǐng)求url: """ """獲取表單數(shù)據(jù)的上傳文件""" print(request.form.get("username")) # # 獲取所有上傳文件 # print(request.files) # ImmutableMultiDict([('avatar', <FileStorage: 's.png' ('image/png')>)]) # # 根據(jù)name值獲取單個(gè)上傳文件 print(request.files.get("avatar")) # <FileStorage: 's.png' ('image/png')> # # 根據(jù)name值獲取多個(gè)上傳文件 print(request.files.getlist("avatar")) # [<FileStorage: 'a.png' ('image/png')>, <FileStorage: 's.png' ('image/png')>] return "hello, jingtian flask"
postman請(qǐng)求
非文件上傳類post請(qǐng)求,使用form-data類型表單數(shù)據(jù)
postman上傳文件,數(shù)據(jù)類型選File
選擇上傳文件
發(fā)送請(qǐng)求
看下終端打印
上傳多個(gè)文件,postman同時(shí)選中多個(gè)文件
終端打印,使用getlist可以獲取到多個(gè)文件對(duì)象
3.獲取客戶端ajax請(qǐng)求數(shù)據(jù)
ajax請(qǐng)求數(shù)據(jù),在請(qǐng)求頭處的Content-type是 application/json
body里面上柴男raw json數(shù)據(jù)
Headers里面的Content-type
視圖函數(shù)
@app.route("/data", methods=["post"]) def data(): """ 獲取客戶端請(qǐng)求的請(qǐng)求體[ajax] :return: """ """判斷本次客戶端是否是ajax請(qǐng)求獲取本次客戶端提交的數(shù)據(jù)格式是否是json""" print(request.is_json) """獲取客戶端請(qǐng)求體中的json數(shù)據(jù),要確保發(fā)送的是json數(shù)據(jù)才能獲取到""" print(request.json) # {'username': 'jingtian', 'password': '123456'} """獲取客戶端請(qǐng)求體的原始數(shù)據(jù),得到的是byte類型數(shù)據(jù)""" print(request.data) # b'{\r\n "username": "root",\r\n "password": "123456"\r\n}' # 原始數(shù)據(jù)轉(zhuǎn)json格式,通過json.loads() print(json.loads(request.data)) # {'username': 'root', 'password': '123456'} """接收其他格式類型的數(shù)據(jù)""" print(request.data) return "hello, flask"
發(fā)送json類型數(shù)據(jù)post請(qǐng)求
終端打印
獲取其他類型數(shù)據(jù),直接使用request.data
上傳xml格式數(shù)據(jù),就不能在用request.json()獲取了,否則報(bào)錯(cuò)
"""接收其他格式類型的數(shù)據(jù),使用request.data""" print(request.data)
終端打印
4.上傳的文件保存到本地
視圖函數(shù)
#上傳文件的保存 @app.route("/file", methods=["post", "put", "patch"]) def file(): """ 接收上傳文件并保存文件 :return: """ #得到的是FileStorage對(duì)象 avatar = request.files.get("avatar") print(avatar) # 調(diào)用FileStorage提供的save方法就可以保存文件了,dst指定保存文件路徑 avatar.save(dst="./jingtian.png") return "hello, flask"
使用postman文件上傳
發(fā)送請(qǐng)求
本地查看,已保存到本地
多文件保存類似,無外乎加個(gè)循環(huán)而已,感興趣的小伙伴可以試試,有疑問可以私信我哦
獲取請(qǐng)求頭數(shù)據(jù)
1.獲取請(qǐng)求頭所有信息
request.headers
請(qǐng)求:
終端打印請(qǐng)求頭
2.獲取單個(gè)請(qǐng)求頭信息
#基于get使用請(qǐng)求頭原始屬性名獲取, User-Agent 客戶端的網(wǎng)絡(luò)代理工具名稱
request.headers.get("User-Agent")
3.把原始屬性名轉(zhuǎn)換成小寫下劃線格式來獲取
request.user_agent
#獲取Accept
request.accept_mimetypes
#獲取本次客戶端請(qǐng)求的服務(wù)端地址
request.host
#獲取本次客戶端請(qǐng)求提交的數(shù)據(jù)格式
request.content_type
請(qǐng)求
終端打印
#獲取本次客戶端請(qǐng)求的uri路徑
request.path
#獲取本次客戶端請(qǐng)求完整url地址
request.url
#獲取本次客戶端請(qǐng)求的服務(wù)端域名
request.root_url
#獲取本次客戶端的Http請(qǐng)求方法或請(qǐng)求動(dòng)作
request.method
#獲取本次客戶端的IP地址
request.remote_addr
#獲取本次客戶端獲取到的服務(wù)端信息
request.server
得到的是包含兩個(gè)元素的元祖,第一個(gè)元素是服務(wù)端允許訪問的ip地址,第二個(gè)是服務(wù)端口號(hào)
#獲取本次客戶端請(qǐng)求時(shí),服務(wù)端的系統(tǒng)系統(tǒng)環(huán)境變量信息
request.environ
獲取的全部數(shù)據(jù)如下:
{'wsgi.version': (1, 0), 'wsgi.url_scheme': 'http', 'wsgi.input': <_io.BufferedReader name=416>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf-8'>, 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.run_once': False, 'werkzeug.socket': <socket.socket fd=416, family=2, type=1, proto=0, laddr=('127.0.0.1', 5000), raddr=('127.0.0.1', 12712)>, 'SERVER_SOFTWARE': 'Werkzeug/3.0.1', 'REQUEST_METHOD': 'POST', 'SCRIPT_NAME': '', 'PATH_INFO': '/header', 'QUERY_STRING': '', 'REQUEST_URI': '/header', 'RAW_URI': '/header', 'REMOTE_ADDR': '127.0.0.1', 'REMOTE_PORT': 12712, 'SERVER_NAME': '0.0.0.0', 'SERVER_PORT': '5000', 'SERVER_PROTOCOL': 'HTTP/1.1', 'HTTP_USER_AGENT': 'PostmanRuntime/7.37.0', 'HTTP_ACCEPT': '*/*', 'HTTP_POSTMAN_TOKEN': '3571e769-9ecf-44c1-bad0-5487c684f9eb', 'HTTP_HOST': '127.0.0.1:5000', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_CONNECTION': 'keep-alive', 'CONTENT_TYPE': 'multipart/form-data; boundary=--------------------------480267896765648122071509', 'CONTENT_LENGTH': '10720', 'werkzeug.request': <Request 'http://127.0.0.1:5000/header' [POST]>, 'werkzeug.debug.preserve_context': <built-in method append of list object at 0x00000202732AD900>}
自定義請(qǐng)求頭信息獲取
#根據(jù)自定義的請(qǐng)求頭的鍵來獲取
request.headers.get("company")
發(fā)送請(qǐng)求
獲取自定義請(qǐng)求頭
完整代碼解析
import json from flask import Flask, request app = Flask(__name__) @app.route("/header", methods=["get", "post", "put", "patch","delete"]) def header(): """ 獲取請(qǐng)求頭等其他請(qǐng)求信息 :return: """ # # 獲取請(qǐng)求頭所有信息 # print(request.headers, type(request.headers)) # # """ # 獲取單個(gè)請(qǐng)求頭信息 # """ # # 基于get使用請(qǐng)求頭原始屬性名獲取, User-Agent 客戶端的網(wǎng)絡(luò)代理工具名稱 # print(request.headers.get("User-Agent")) # PostmanRuntime/7.26.10 # # 把原始屬性名轉(zhuǎn)換成小寫下劃線格式來獲取 # print(request.user_agent) # PostmanRuntime/7.26.10 # # # 獲取本次客戶端請(qǐng)求的服務(wù)端地址 # print(request.host) # 127.0.0.1:5000 # # # 獲取本次客戶端請(qǐng)求提交的數(shù)據(jù)格式 # print(request.content_type) # multipart/form-data; # # # 獲取本次客戶端請(qǐng)求的uri路徑 # print(request.path) # /header # # 獲取本次客戶端請(qǐng)求完整url地址 # print(request.url) # http://127.0.0.1:5000/header # # 獲取本次客戶端請(qǐng)求的服務(wù)端域名 # print(request.root_url) # http://127.0.0.1:5000/ # # # 獲取本次客戶端的Http請(qǐng)求方法或請(qǐng)求動(dòng)作 # print(request.method) # POST # # # 獲取本次客戶端的IP地址 # print(request.remote_addr) # 127.0.0.1 # # # 獲取本次客戶端獲取到的服務(wù)端信息 # print(request.server) # ('0.0.0.0', 5000) # 獲取本次客戶端請(qǐng)求時(shí),服務(wù)端的系統(tǒng)系統(tǒng)環(huán)境變量信息 # print(request.environ) """ 獲取自定義請(qǐng)求頭 """ print(request.headers.get("company")) # flask.edu return "hello, flask" if __name__ == '__main__': app.run(host="0.0.0.0", port=5000, debug=True)
總結(jié):如上就是flask框中,請(qǐng)求體數(shù)據(jù)的獲取方式,文件上傳保存,請(qǐng)求頭數(shù)據(jù)獲取,自定義請(qǐng)求頭等詳細(xì)使用方法,持續(xù)更新中?。?!
到此這篇關(guān)于Python flask框架請(qǐng)求體數(shù)據(jù)、文件上傳、請(qǐng)求頭信息獲取方式的文章就介紹到這了,更多相關(guān)Python flask請(qǐng)求體數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用tarfile模塊實(shí)現(xiàn)免費(fèi)壓縮解壓
Python自帶的tarfile模塊可以方便讀取tar歸檔文件,厲害的是可以處理使用gzip和bz2壓縮歸檔文件tar.gz和tar.bz2,這篇文章主要介紹了Python使用tarfile模塊實(shí)現(xiàn)免費(fèi)壓縮解壓,需要的朋友可以參考下2024-03-03Python的Django框架下管理站點(diǎn)的基本方法
這篇文章主要介紹了Python的Django框架下管理站點(diǎn)的基本方法,需是Django站點(diǎn)部署的基礎(chǔ),要的朋友可以參考下2015-07-07centos6.5安裝python3.7.1之后無法使用pip的解決方案
今天小編就為大家分享一篇關(guān)于centos6.5安裝python3.7.1之后無法使用pip的解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02Python讀csv文件去掉一列后再寫入新的文件實(shí)例
下面小編就為大家分享一篇Python讀csv文件去掉一列后再寫入新的文件實(shí)例,具有很的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12使用Python操作MySQL數(shù)據(jù)庫的教程詳解
在這篇文章中,主要為大家詳細(xì)介紹如何在Python中使用pymysql模塊來操作MySQL數(shù)據(jù)庫,文中的示例代碼簡介易懂,需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07用python實(shí)現(xiàn)前向分詞最大匹配算法的示例代碼
這篇文章主要介紹了用python實(shí)現(xiàn)前向分詞最大匹配算法的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08運(yùn)行django項(xiàng)目指定IP和端口的方法
今天小編就為大家分享一篇運(yùn)行django項(xiàng)目指定IP和端口的方法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05