Flask08_post请求

# encoding=utf-8
"""
1、request对象:获取原始请求信息数据对象
(01)request.user_agent:获取用户代理,包含用户的客户端类型,操作系统类型等信息
(02)request.headers:获取一个Werkzeug的EnvironHeaders对象,包含首部字段,可以以字典的形式操作
(03)request.application:获取服务器请求的应用类型
(04)request.charset:获取请求的编码格式
(05)request.url-charset:获取使用url的编码格式
(06)request.host:获取服务器请求的主机地址
(07)request.host_url:获取服务器请求的完整主机地址(包括协议)
(08)request.base_url:获取url的基础地址(?参数之前的地址)
(09)request.url:获取浏览器的完整url地址
(10)request.url_root:获取浏览器的根url
(11)request.path:查看浏览器匹配的路由(路由路径)
(12)request.full_path:查看浏览器传递给Flask服务的数据(路由+参数)
(13)request.blueprint:获取项目当前使用蓝图的信息
(14)request.endpoint:获取与当前请求相匹配的端点值
(15)request.referrer:获取浏览器请求发起的源URL
(16)request.scheme:获取请求的URL模式/协议(http或https)
(17)request.method:获取浏览器请求的http方法(get/post)
(18)request.cookies:获取一个包含索引随请求提交的cookies字典校验
(19)request.args:获取get请求方法的类字典参数信息
    A、可以获取到Werkzeug的ImmutableMultiDict对象,存储解析后的查询字符串,可通过字典的方式获取键和值
    B、要想获取未解析的原生查询字符串,可以使用query_string属性
    C、request.args.get(需求键):可以找到键时,可以通过指定键获取到数据;无法找到键时,request会返回None,Flask服务器会报500错误
    D、request.args.get(需求键,默认值):为其设置默认值,无法获取到键时直接使用默认值
    E、request.args.getlist(需求键):有多个重复键的数据时获取多个,返回到一个列表中
(20)request.data:接收所有请求参数,是请求体的原始数据
(21)request.get_data():获取请求中的数据,默认读取为字节字符串(bytestring),将as_text参数设置为True则返回值将是unicode字符串
(22)request.files:获取请求的文件类型的数据
    A、获取一个Werkzeug的MultiDict对象,包含所有上传文件,可以使用字典的形式获取文件
    B、使用的键为文件input标签中的name属性值,对应的值为Werkzeug的FileStorage对象
    C、可以调用save()方法并传入保存路径来保存文件
(23)request.form:获取post请求数据的方法,获取一个Werkzeug的ImmutableMultiDict对象,包含解析后的表单数据,表单字段值通过input标签的name属性值作为键获取
(24)request.values:获取一个Werkzeug的CombinedMultiDict对象,结合了args和form属性值
(25)request.is_json:通过MIME类型判断是否为JSON数据,返回布尔类型的值
(26)request.get_json():作为JSON解析并返回数据
    A、如果MIME类似不是JSON,返回None(除非force设置为True)
    B、解析出错抛出Werkzeug提供的BadRequest异常(如果未开启调试模式,则返回400错误码)
    C、如果silent设置为True,则返回None,cache设置是否缓存解析后的JSON数据
(27)request.json:包含解析后的JSON数据,内部调用get_json(),通过字典的方式获取键值
2、post请求
(1)一种HTTP请求方法,POST用于向指定的资源提交要被处理的数据
(2)使用场景:不适合将数据放到URL参数中(密码),或者浏览器不支持太长长度的URL时
(3)测试方法:使用requests库模拟浏览器,requests.post方法模拟请求
(4)设置请求方式
    A、页面调试报错method not allowed:视图函数没有允许post请求
    B、@app.route路由器中添加methods参数,将允许支持的请求方式写入列表中(['GET','POST'])
(5)request.headers:获取post请求生成的HTTP请求头
(6)request.stream.read():获取post请求体的数据(post请求传递的数据)
(7)request.form:获取浏览器传递的数据(ImmutableMultiDict对象)
    ImmutableMultiDict([('name', 'duxun'), ('hobby', '篮球'), ('hobby', '学习')])
(8)request.form.get(需求键)/request.form[需求键]方法
    A、可以在字典参数中重大奥对应的数据键时,可以通过指定键获取到数据(类似字典取值)
    B、无法在字典参数中找到对应的数据键时,request会返回内置的None,Flask服务器会报500错误
        >>先判断得到的数据是否为None,再进行处理
        >>通过request.form.get(需求键,默认值)的方式为其设置默认值,当无法获取到键时,直接使用默认值代替
(9)request.form.getlist(需求键):post请求数据存放于组合数据类型中有多个值时,返回到一个列表中
3、post表单请求
(1)前端form标签设置
    A、利用HTML的表单和组件向服务器发起请求,需要对form标签设置参数
    B、method:请求方式,设置成post
    C、action:请求的地址,就是将数据提交到哪里,默认提交到当前路由(设置空)
    D、enctype:用来表述请求数据不单单是字符
    E、name:表单提交数据的参数,后端通过对应name值获取数据
(2)后post请求步骤
    A、路由部分允许使用post请求:methods=["GET","POST"]
    B、前端输入数据,发送请求
    C、判断使用post请求:if request.method=="POST"
    C、需要使用rquest.form,获取post请求传参
        >> data = request.form.get("data")
    D、视图函数+数据库,获得数据,返回到页面
    E、进行模版渲染,展示数据
4、post的form操作
(1)前端form标签设置
    A、利用HTML的表单和组件向服务器发起请求,需要对form标签设置参数
    B、method:请求方式,设置成post
    C、action:请求的地址,就是将数据提交到哪里,默认提交到当前路由(设置空)
    D、enctype:用来表述请求数据不单单是字符(multipart/form-data)
    E、name:表单提交数据的参数,后端通过对应name值获取数据
    >> 前端需要注意在form标签上添加enctype属性
    
(2)后post请求步骤 A、路由部分允许使用post请求:methods=["GET","POST"] B、前端输入数据,发送请求 C、判断使用post请求:if request.method=="POST" C、需要使用rquest.files,获取file数据 >> data = request.files.get("img") >> 获取文件名:filename = data.filename D、将文件保存到服务器上:data.save("文件路径") D、将文件在服务器上的路径,保存到数据库中 p.img = "文件路径" p.save() D、视图函数+数据库,返回到页面:{{ p.文件(数据库字段) }} E、进行模版渲染,展示数据 (3)post请求用于向服务器提交数据 A、flask视图函数默认只接受get请求数据 B、post数据需要设置:methods = ["GET","POST"] C、使用request.form接受post数据,使用get方法提取需求数据 D、post数据需要在form标签上设置method属性:method="post" (4)图片处理步骤 A、get请求获取form表单 B、Form表单选中图片,进行上传 post 请求 C、视图接受到post请求的参数(图片) D、视图保存数据:图片(静态资源)保存在服务器上面、数据库中保存图片的路径 """ import os from flask import Flask from flask import request from flask import render_template basic = "F:/MyProject" # 创建web服务器(http)实例:内置方法__name__是预定义变量,被设置为使用本模块,html存放的路径,静态文件的路径 app = Flask(__name__) # 支持post请求:路由上添加methods方法(允许方式均可写入列表中) @app.route('/demo/post', methods=['GET', 'POST']) def post_demo(): # request.headers:获取post请求生成的HTTP请求头 print(request.headers) # request.stream.read():获取post请求体的数据-->不要使用,否则后续form获取不到 # print(request.stream.read()) # 查看post请求向服务器传递的参数对象 print(request.form) # 获取post请求的某个参数数据 print(request.form.get('name')) # 获取post请求的某个参数数据 print(request.form['name']) # post请求的字典参数中不存在时,进行判断处理 user = request.form.get('user') if user is None: print("参数数据user不存在~") else: print(f"参数数据user为:{user}") # post请求的字典参数中不存在时,进行默认值设置 print(request.form.get('nick', '未知')) # post请求的字典参数中存在组合类型的多个数据时 print(request.form.getlist('hobby')) return '这是一个post请求' # 结合数据库:设置允许请求方式:get、post @app.route("/demo/database/",methods=["GET","POST"]) def get_test(): # 请求是post请求时,处理 if request.method == "POST": # 接收表单数据:按照前端name属性获取值 name = request.form.get("name") desc = request.form.get("desc") # 调用Label表,保存数据 label = Label() label.name = name label.desc = desc label.save() return render_template("example.html",**locals()) # post请求-前端页面 '''