上一篇中已经讲述了: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表单

Flask中获取参数(路径,查询,请求体,请求头)的更多相关文章

  1. Django中获取参数(路径,查询,请求头,请求体)

    一.通常HTTP协议向服务器传参有几种途径 : 提取URL的特定部分,如/weather/shanghai/2018,可以在服务器端的路由中用正则表达式截取: 查询字符串(query string), ...

  2. go的gin框架从请求中获取参数的方法

    前言: go语言的gin框架go里面比较好的一个web框架, github的start数超过了18000.可见此框架的可信度 如何获取请求中的参数 假如有这么一个请求: POST   /post/te ...

  3. 使用HTTP协议向服务器传参的方式及django中获取参数的方式

    使用HTTP协议向服务器传参的四种方式 URL路径携带参数,形如/weather/beijing/2018; 查询字符串(query string),形如key1=value1&key2=va ...

  4. Flask中路由参数

    Flask中路由参数.请求方式设置 一.参数设置 1.参数类型 Flask中参数的使用 @app.route('/parames/<username>/') def hello_world ...

  5. JSP userBean setProperty直接从request中获取参数

    JSP userBean setProperty直接从request中获取参数: form表单Jsp: <%@ page language="java" import=&qu ...

  6. Java中获取文件路径

    Java中获取文件路径 1.实例说明 (1)得到 ClassPath的绝对URI路径 Thread.currentThread().getContextClassLoader().getResourc ...

  7. Android中获取文件路径的方法总结及对照

    最近在写文件存贮,Android中获取文件路径的方法比较多,所以自己也很混乱.找了好几篇博客,发现了以下的路径归纳,记录一下,以备不时之需 Environment.getDataDirectory() ...

  8. flask中获取request的参数的方法

    request请求总体分为两类: 1.get请求 访问时会在地址栏直接显示参数不安全,且参数大小比较小. 2.post请求 参数不显示在地址栏,一般用户注册.登录都通过post请求完成. flask获 ...

  9. web项目中获取各种路径的方法

    ~Apple   web项目中各种路径的获取 1.可以在servlet的init方法里 String path = getServletContext().getRealPath("/&qu ...

随机推荐

  1. linux-touch 、mkdir、rm、pwd、which、locate、whatis

    1.touch: 创建空文件,修改文件时间戳信息 atime(access time):最近访问文件内容时间 mtime(modify time):最近修改文件内容时间 ctime(change ti ...

  2. BIOS安全设置

    1.开机按F2进入BIOS 2.进入 Security 界面 3.Set user password 用户密码 开机密码 设置为123456 4.Set supervisor password 进BI ...

  3. hdu 6299 Balanced Sequence (贪心)

    Balanced Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. 用正则表达式【regexp】进行高级搜索数据

    正则表达式介绍 正则表达式是用来匹配文本的特殊字符集合,如果你想从一个文本中提取电话号码而已使用正则表达式,如果你需要查找名字中包含数字的所有文件可以使用正则,如果你你要在文本块中找到所有重复的单词, ...

  5. 十分钟学会Markdown基本语法

    文章目录 Markdown 语法 一.标题 这是一级标题 这是二级标题 这是三级标题 这是四级标题 这是五级标题 这是六级标题 二.字体 三.引用 四.分割线 五.图片 六.超链接 七.列表 八.表格 ...

  6. LeetCode刷题总结-双指针、位运算和分治法篇

    本文总结LeetCode上有关双指针.位运算和分治法的算法题,推荐刷题总数14道.具体考点分析如下图: 一.双指针 1.字符串和数组问题 题号:424. 替换后的最长重复字符,难度中等 题号:828. ...

  7. NLP(十六)轻松上手文本分类

    背景介绍   文本分类是NLP中的常见的重要任务之一,它的主要功能就是将输入的文本以及文本的类别训练出一个模型,使之具有一定的泛化能力,能够对新文本进行较好地预测.它的应用很广泛,在很多领域发挥着重要 ...

  8. Android App内文档展示方案整理

    一.Word.Excel.PPT 展示 1. 微软Office公开Api接口 如果文档内容不是很机密或者只是需要实现预览文档的话,可以考虑使用微软的公共Api接口实现. 微软Office公开Api地址 ...

  9. AbstractMethodError: abstract method "androidx.databinding.ViewDataBinding androidx.databinding.DataBinderMapper.getDataBinder(androidx.databinding.DataBindingComponent, android.view.View, int)"

    混淆导致的数据绑定库错误 问题摘要 AbstractMethodError: abstract method "androidx.databinding.ViewDataBinding an ...

  10. Androi O Automotive 介绍

    最近由于工作需要对android o 中的 automotive源码进行了深入的学习,现总结如下: Android O Vehicle之架构介绍 Android O Vehicle之Car Servi ...