标签:http request对象 mamicode 获取文件 需要 传递 encoding 个数 print
引用request的方法:
from flask import request
与Django不同的是,flask是不需要将request对象作为第一个参数传入视图函数,他的request
对象是来自于flask,是一个请求上下文
对象(全局变量 --> 线程局部变量,使用起来就像线程全局变量一样,具有较高的隔离性
),我们只需导入即可使用,request对象中保存了一次HTTP请求的一切信息。
request常用属性如下:
用于获取请求中的参数
# 获取请求中的参数 @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中的参数
# 获取请求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信息 @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
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
标签:http request对象 mamicode 获取文件 需要 传递 encoding 个数 print
原文地址:https://www.cnblogs.com/testlearn/p/14094799.html