码迷,mamicode.com
首页 > 其他好文 > 详细

Flask_获取请求信息(三)

时间:2020-12-11 11:44:12      阅读:3      评论:0      收藏:0      [点我收藏+]

标签:http   request对象   mamicode   获取文件   需要   传递   encoding   个数   print   

引用request的方法:

from flask import request

与Django不同的是,flask是不需要将request对象作为第一个参数传入视图函数,他的request对象是来自于flask,是一个请求上下文对象(全局变量 --> 线程局部变量,使用起来就像线程全局变量一样,具有较高的隔离性),我们只需导入即可使用,request对象中保存了一次HTTP请求的一切信息。

request常用属性如下:

技术图片

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

Flask_获取请求信息(三)

标签:http   request对象   mamicode   获取文件   需要   传递   encoding   个数   print   

原文地址:https://www.cnblogs.com/testlearn/p/14094799.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!