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属性
    <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
        )


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值