# 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属性 <form method="post" enctype="multipart/form-data"> <label>标题:<input type="text" name="title"></label> <label>图片:<input type="file" name="picture"></label> <label><button class="btn btn-primary">提交</button></label> </form> (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请求-前端页面 ''' <form method="post" enctype="multipart/form-data"> <label>标签名称:<input type="text" name="name"></label> <label>标签描述:<textarea name="desc"><textarea></label> <label><input type="submit" value="提交"></label> </form> ''' # 启动项目服务器--可以通过参数更改,通常网站的页面需要放到网站服务器上,用户无法双击打开 if __name__ == '__main__': def run(self): app.run( # host:主机地址 host="localhost", # port:访问端口 port=80, # debug:调试模式,测试环境True,生产环境Fasle debug=True, # use_reloader:自动重启 use_reloader=True )
Flask08_post请求
最新推荐文章于 2023-07-25 08:15:00 发布