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表单

  • 相关阅读:
    Android 主题theme说明 摘记
    Android开发 去掉标题栏方法 摘记
    安卓项目五子棋代码详解(二)
    关于 ake sure class name exists, is public, and has an empty constructor that is public
    百度地图3.0实现图文并茂的覆盖物
    android onSaveInstanceState()及其配对方法。
    关于集成科大讯飞语音识别的 一个问题总结
    android 关于 webview 控制其它view的显示 以及更改view数据失败的问题总结
    C# 解析 json Newtonsoft果然强大,代码写的真好
    c#数据类型 与sql的对应关系 以及 取值范围
  • 原文地址:https://www.cnblogs.com/yblackd/p/12050827.html
Copyright © 2011-2022 走看看