zoukankan      html  css  js  c++  java
  • Flask中获取参数(路径,查询,请求体,请求头)

    上一篇中已经讲述了:HTTP协议向服务器传参有几种途径{ 链接 }

    在Flask中同样通过这4中传参途径进行归纳:

    1. URL中路径参数的获取:

    拓展:

    • # 路由参数/路径参数:http://127.0.0.1:5000/users/13312345678
    • # 路由查询参数:http://127.0.0.1:5000/users/?mobile=13312345678&?user_name="yd"

    1.1 是什么?

      Flask不同于Django直接在定义路由时编写正则表达式的方式,而是采用转换器;

    1.2 怎么用?

    • 1.语法:<>

    • 2.作用:提取URL路径参数

    • 3.效果:将该位置数据以字符串格式匹配,值同样为字符串类型,转换器中的值为参数名传入视图

    • 4.案例  
    # 127.0.0.1/user/123
    @app.route('/users/<user_id>') def user_info(user_id): print(type(user_id)) return 'hello user {}'.format(user_id)
    • 5.转换器原理:

    导包:`from werkzeug.routing import BaseConverter`,进入BaseConverter通过继承查看。

    • 6.Flask默认转换器:共6种+1个默认
    DEFAULT_CONVERTERS = {
        "default": UnicodeConverter,
        "string": UnicodeConverter,
        "any": AnyConverter,
        "path": PathConverter,
        "int": IntegerConverter,
        "float": FloatConverter,
        "uuid": UUIDConverter,
    }
    • 7.转换器string和path的区别:
    http://127.0.0.1:5000/users/4/2/3
    # @app.route('/users/<path:user_id>')
    # user_id=4/2/3
    
    @app.route('/users/<string:user_id>')
    # 找不到
    http://127.0.0.1:5000/users/4
    # 只能匹配到/users/ 斜线后面部分
    # user_id=4
    
    # string匹配的转换器所在位置的数据,不带斜线
    # path配置转换器所在位置的数据,包括(除# ?之外的所有符号【包括中引文不同状态】)
    • 8.自定义转换器
    • 8.1为什么?

      内置转换器不满足需求时,自定义匹配

    • 8.2怎么做?

      参考源码实现

      #app文件导包routing中的map类,app.py中类属性 = routing中的 map类, map类属性:self.converters = self.default_converters.copy() 。。。
    • 8.3实现步骤:

      1. 定义类

      2. 继承BaseConverter

      3. 定义正则表达式

      4. 把自定义转换器,添加到默认转换字典中

      8.4案例:

    # 个人练习:匹配学号--2015100446
    class StuIdConverter(BaseConverter):
        regex = "20[0-5]{2}100\d[0-9]{2}"
    
    # 添加自定义转换器到默认转换器字典中
    app.url_map.converters['stu_id'] = StuIdConverter
    
    @app.route('/<stu_id:data>')
    def get_stu_id(data):
        print("stu_id={}".format(data))
        return 'stu_id value is stu_id={}'.format(data)

    2.查询参数,请求头,请求体

      使用请求上下文对象request获取

    属性说明类型
    data记录请求的数据,并转换为字符串*
    form记录请求中的表单数据MultiDict
    args记录请求中的查询参数MultiDict
    cookies记录请求中的cookie信息Dict
    headers记录请求中的报文头EnvironHeaders
    method记录请求使用的HTTP方法GET/POST
    url记录请求的URL地址string
    files记录请求上传的文件*

    案例:

    # 访问127.0.0.1:5000/?name=yd,获取name值
    from flask import request
    
    app = Flask(__name__)
    
    @app.route("/")
    def index():
        name = request.args.get("name")
        return "请求参数:{}".format(name)
    
    if __name__ == "__main__":
        app.run()

    #上传图片

    from flask import Flast, request

     
      

    app = Flask(__name__)

     
      

    @app.route("/img", methods=["POST"])
    def up_load():
    image = request.file.get("image")
    image.save("./new_image.jpg")

    if __name__ == "__main__":
    app.run()

    # 注释
    1. 客户端发图片是post请求,而Flask默认是GET请求,所以我们需要指明请求方式是POST
    2. 通过request.file.get("image")获取到前端上传的文件,我们直接用image接受,image此时是一个对象,我们可以直接用image.save()方法保存。保存时需要指定存储路径和文件名。

     
     

    3. 注意坑:

    • args:查询字符串,当多个同名参数Flask取第一个,django取最后一个。

    • method:get请求方式也能提交form表单

  • 相关阅读:
    epoll的LT和ET模式
    linux搭建java环境
    【第三方SDK】百度地图实现最简单的定位功能(无地图界面)
    闲云控制台(二)查看文件功能,支持十六进制查看文件
    ios8 swift开发:显示变量的类名称
    cocos2dx的runAction: 反复运行,多个动作连接运行,多个动作同一时候运行的实现
    myeclipse设置凝视
    2-06. 数列求和(20)(ZJUPAT 数学)
    【IPC进程间通信之四】数据复制消息WM_COPYDATA
    条件熵定义推导公式
  • 原文地址:https://www.cnblogs.com/yblackd/p/14533431.html
Copyright © 2011-2022 走看看