Flask_獲取請求信息(三)


引用request的方法:

from flask import request

與Django不同的是,flask是不需要將request對象作為第一個參數傳入視圖函數,他的request對象是來自於flask,是一個請求上下文對象(全局變量 --> 線程局部變量,使用起來就像線程全局變量一樣,具有較高的隔離性),我們只需導入即可使用,request對象中保存了一次HTTP請求的一切信息。

request常用屬性如下:

可以在 base_request.py 包的 BaseRequest 類中查看所有屬性。

data屬性

用於獲取請求中的參數

# 獲取請求中的參數
@app.route("/data/", methods=["POST"])
def request_data():
    data = request.data
    print(type(data))   # <class 'bytes'>
    return F"{data}"

form屬性

用於獲取請求中的表單參數

# 獲取請求的表單參數
@app.route("/form/", methods=["POST"])
def request_form():
    form = request.form
    print(type(form))   # <class 'werkzeug.datastructures.ImmutableMultiDict'>
    print(form)         # ImmutableMultiDict([('name', 'lisi'), ('age', '11')])
    name = form.get("name")
    age = form.get("age")
    return F"{name},{age}"

args屬性

用於獲取請求中的URL中的參數

# 獲取請求URL中的參數
@app.route("/args/")
def request_args():
    args = request.args
    print(type(args))   # <class 'werkzeug.datastructures.ImmutableMultiDict'>
    print(args)         # ImmutableMultiDict([('name', 'wangwu'), ('age', '12')])
    name = args.get("name")
    age = args.get("age")
    return F"{name},{age}"

cookies屬性

用於獲取請求中的cookies參數

# 獲取請求中的cookies信息
@app.route("/cookies/")
def request_cookies():
    cookies = request.cookies
    print(type(cookies))    # <class 'werkzeug.datastructures.ImmutableMultiDict'>
    print(cookies)          # ImmutableMultiDict([('cookie_name', 'zhaoliu')])
    cookie_name = cookies.get("cookie_name")
    return F"cookies:{cookie_name}"

 

headers屬性

用於獲取請求中的頭部信息

# 獲取請求中的headers信息
@app.route("/headers/")
def request_headers():
    headers = request.headers
    print(type(headers))    # <class 'werkzeug.datastructures.EnvironHeaders'>
    print(headers)
    """
    Headers-Name: luqi      # 自定義的頭部
    Cache-Control: no-cache
    Postman-Token: bb38af34-f18a-40f0-b974-a0af8d6e1389
    User-Agent: PostmanRuntime/7.6.1
    Accept: */*
    Host: 127.0.0.1:5000
    Cookie: cookie_name=zhaoliu
    Accept-Encoding: gzip, deflate
    Connection: keep-alive
    """
    headers_name = headers.get("Headers-Name")
    return F"{headers_name}"

method屬性

用於獲取請求的方式

# 獲取請求的請求方式
@app.route("/method/")
def request_method():
    method = request.method
    print(type(method))     # <class 'str'>
    print(method)           # GET
    return method

url屬性

用於獲取請求的鏈接

# 獲取請求中的url信息
@app.route("/url/")
def request_url():
    url = request.url
    print(type(url))     # <class 'str'>
    print(url)           # http://127.0.0.1:5000/url/
    return url

files屬性

from werkzeug.utils import secure_filename

# 文件上傳
# 限制文件大小為16M,如果超過16M,Flask 會拋出一個 RequestEntityTooLarge 異常
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
@app.route("/files/", methods=["POST"])
def request_files():
    files = request.files
    print(type(files))      # <class 'werkzeug.datastructures.ImmutableMultiDict'>
    print(files)            # ImmutableMultiDict([('filename', <FileStorage: '1.jpg' ('image/jpeg')>)])
    # 獲取文件對象
    file = files.get("file")    # <FileStorage: '1.jpg' ('image/jpeg')>
    if file is None:
        return "未上傳文件"
    # 獲取文件的名字
    filename = file.filename    # 1.jpg
    # 解決文件名偽造問題
    filename = secure_filename(filename)

    # 將文件保存到本地
    # 1、使用python的open方法
    # with open("./" + filename, "wb") as f:
    #     # 讀取上傳的文件
    #     file_content = file.read()
    #     # 寫入到本地文件
    #     f.write(file_content)

    # 2、使用flask封裝的save方法
    file.save("./" + filename)
    return "上傳成功"

上面代碼中,我們使用 Werkzeug提供的 secure_filename()函數來解決文件名偽造的問題:

filename = secure_filename(filename)

試想一下,如果我們不這樣處理,假如有人惡意仿造文件名,把下面的信息作為 filename 傳遞給你的應用:  

filename = "../../../../home/username/.bashrc"

假設 ../ 的個數是正確的,那么用戶就有可能修改服務器上的文件。

通過交互模式,我們看看 secure_filename() 函數的處理機制:

 

附碼:

from flask import Flask, request
from werkzeug.utils import secure_filename


app = Flask(__name__)


# 獲取請求的參數
@app.route("/data/", methods=["POST"])
def request_data():
    data = request.data
    print(type(data))   # <class 'bytes'>
    return F"{data}"


# 獲取請求的表單參數
@app.route("/form/", methods=["POST"])
def request_form():
    form = request.form
    print(type(form))   # <class 'werkzeug.datastructures.ImmutableMultiDict'>
    print(form)         # ImmutableMultiDict([('name', 'lisi'), ('age', '11')])
    name = form.get("name")
    age = form.get("age")
    return F"{name},{age}"


# 獲取請求URL中的參數
@app.route("/args/")
def request_args():
    args = request.args
    print(type(args))   # <class 'werkzeug.datastructures.ImmutableMultiDict'>
    print(args)         # ImmutableMultiDict([('name', 'wangwu'), ('age', '12')])
    name = args.get("name")
    age = args.get("age")
    return F"{name},{age}"


# 獲取請求中的cookies信息
@app.route("/cookies/")
def request_cookies():
    cookies = request.cookies
    print(type(cookies))    # <class 'werkzeug.datastructures.ImmutableMultiDict'>
    print(cookies)          # ImmutableMultiDict([('cookie_name', 'zhaoliu')])
    cookie_name = cookies.get("cookie_name")
    return F"cookies:{cookie_name}"


# 獲取請求中的headers信息
@app.route("/headers/")
def request_headers():
    headers = request.headers
    print(type(headers))    # <class 'werkzeug.datastructures.EnvironHeaders'>
    print(headers)
    """
    Headers-Name: luqi      # 自定義的頭部
    Cache-Control: no-cache
    Postman-Token: bb38af34-f18a-40f0-b974-a0af8d6e1389
    User-Agent: PostmanRuntime/7.6.1
    Accept: */*
    Host: 127.0.0.1:5000
    Cookie: cookie_name=zhaoliu
    Accept-Encoding: gzip, deflate
    Connection: keep-alive
    """
    headers_name = headers.get("Headers-Name")
    return F"{headers_name}"


# 獲取請求的請求方式
@app.route("/method/")
def request_method():
    method = request.method
    print(type(method))     # <class 'str'>
    print(method)           # GET
    return method


# 獲取請求中的url信息
@app.route("/url/")
def request_url():
    url = request.url
    print(type(url))     # <class 'str'>
    print(url)           # http://127.0.0.1:5000/url/
    return url


# 文件上傳
# 限制文件大小為16M,如果超過16M,Flask 會拋出一個 RequestEntityTooLarge 異常
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
@app.route("/files/", methods=["POST"])
def request_files():
    files = request.files
    print(type(files))      # <class 'werkzeug.datastructures.ImmutableMultiDict'>
    print(files)            # ImmutableMultiDict([('filename', <FileStorage: '1.jpg' ('image/jpeg')>)])
    # 獲取文件對象
    file = files.get("file")    # <FileStorage: '1.jpg' ('image/jpeg')>
    if file is None:
        return "未上傳文件"
    # 獲取文件的名字
    filename = file.filename    # 1.jpg
    # 解決文件名偽造問題
    filename = secure_filename(filename)

    # 將文件保存到本地
    # 1、使用python的open方法
    # with open("./" + filename, "wb") as f:
    #     # 讀取上傳的文件
    #     file_content = file.read()
    #     # 寫入到本地文件
    #     f.write(file_content)

    # 2、使用flask封裝的save方法
    file.save("./" + filename)
    return "上傳成功"


if __name__ == '__main__':
    app.run()

 

原文參考: https://blog.csdn.net/qq_42517220/article/details/88710861

BaseRequest


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM