zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【MySQL】根据JSON字段的内容检索查询数据
    【PHP】跑大批量数据脚本
    【Thinkphp】 CLI模式下接收参数的几种方式
    元素类型 “item” 相关联的 “name” 属性值不能包含 ‘<’ 字符
    python unicode、utf-8、gbk编码与解码展示
    python使用requests通过代理地址发送multipart/form-data报文数据
    python使用requests通过代理地址发送application/x-www-form-urlencoded报文数据
    python使用requests通过代理地址发送application/json报文数据
    python使用requests通过代理地址发送text/xml报文数据
    python使用requests通过代理地址发送text/plain报文数据
  • 原文地址:https://www.cnblogs.com/testlearn/p/14094799.html
Copyright © 2011-2022 走看看