IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> flask 请求数据和响应 -> 正文阅读

[Python知识库]flask 请求数据和响应

一.请求带参

????????

1、路径中带参

????????固定参数是指在URL中固定的, 是不可获取的一部分, 区别与查询字符串, 查询字符串是可有可无的.

标准格式

/path/<参数>

默认 参数 格式是字符串

但是我们还有其他的格式,可以做数据格式转换

flask提供了常见数据格式的转换

string、int、float、path、uuid

# 2请求参数的获取
# (1).语法形式:
@app.route('/users/<user_id>')
def user_info(user_id):
? ? print(user_id)
? ? print(type(user_id))
? ? return '获取到的userid为: {}'.format(user_id)
# (2).语法解释:
在路由中使用<user_id>来接收固定参数, 且不要忘记传递给视图, 即视图必须定义形参user_id.
注意:
? ? - 路由中的user_id前可以限定类型, 写法参考: <int:user_id>, 限定了类型, 前端传来的固定参数就必须符合类型要求, 否则报错; 如果不限定类型, 默认接收到的为字符串类型
? ? - 视图必须定义形参, 且形参的名字必须与路由中一直, 即路由中写user_id, 视图函数形参也必须是user_id

/path/<string:参数> ? ? 默认string可不写
?
/path/<int:参数> ? ? 会把参数 转成 整数  如果参数不是整数 会报错返回 404
?
/path/<float:参数>

# .转换器
上面的固定参数是使用转换器实现的, flask自带的转换器共有6个:
? ? - UnicodeConverter: 字符串转换器
? ? - AnyConverter: 匹配any中任意路径, 写法:'/users/<any(xxx,yyy):user_id>'
? ? - PathConverter: 路径转换器, 与字符串转换器相似, 但参数中可以包含"/"
? ? - IntergerConverter: 整型转换器
? ? - FloatConverter: 浮点型转换器
? ? - UUIDConverter: UUID唯一标识码转换器

  • 自定义 转换器

1、创建一个自定义转换器
自定义Converter类
class PhoneConverter(BaseConverter):
    # 重写 正则规则  查看参数是否匹配该正则 
 ?  regex = r'1[3-9]\d{9}'
?
?
2、注册至converters容器  phone 转换器别名
app.url_map.converters['phone'] = PhoneConverter
?
?
3、使用自定义转换器
@app.route('/user/<phone:user_id>')
def user_info(user_id):
 ?  return "手机号登录:{}".format(user_id)

二.处理请求

处理请求

flask提供了视图函数,可以在视图函数中 处理请求

1、获取url后?参数

request.args.get("参数","默认值")
?
title = request.args.get("title", "没有")

2、form表单传参

title = request.form.get("title")
price = request.form.get("price")

3、 json格式传参

title = request.json.get("title")
price = request.json.get("price")

4、文件上传

file1 = request.files.get("file1")

可以获取文件名

file1.filename

保存文件

file1.save()

def upload_file():
? ? # 获取前端传递过来的文件对象
? ? img = request.files.get('pic')
? ? # 获取文件对象的文件名
? ? file_name = img.filename
? ? # 保存文件对象
? ? img.save(file_name)
? ? return '上传成功!'

三.响应

1、返回字符串

默认就可以直接返回字符串,其实返回的还是网页,只不过内容是纯文本

return "返回图书集合"

2、返回模板网页

from flask import render_template
?
@app.route("/", methods=["GET", "POST"])
def hello_world():
 ?  return render_template("home.html")

  • 扩展一点 Jinjia2 模板引擎

Jinjia2模板 和我们django 内置模板语法 基本一致, 我们简单了解

我们在 视图中 定义好 变量数据

@app.route("/", methods=["GET", "POST"])
def hello_world():
 ?  new_list = ["新闻1", "新闻2", "新闻3", "新闻4"]
?
 ?  return render_template("home.html", news={"news_list": new_list, "title": "我是新标题"})
 ? ?

在 模板中使用 定义好的变量数据

{{变量名}} 会展示变量的值

{% for 语句 %} 循环体 {% endfor %}

<body>
<h1>{{ news.title }}</h1>
<h1>《功勋-李延年》</h1>
?
{% for item in news.news_list %}
 ?  <p>{{ item }}</p>
{% endfor %}
?
?
</body>

3、返回重定向地址

有的时候,资源不在当前 路径对应的视图中,而是在另外一个地方,我们就需要重定向,告诉浏览器你在访问 这个地方。

浏览器 其实访问了两遍

from flask import redirect
from flask import url_for

?
@app.route("/books", methods=["GET"])
def go_book():
 ?  return redirect("/book")

  • url_for函数

我们在代码中 尽量避免 直接写路径,如果写的多了,想修改某路径的时候,那就需要修改很多地方。

我们使用endpoint 参数 给 路由 起别名, 使用别名代表 该用户

@app.route("/book", endpoint="book")
def book_list():
 ?  title = request.args.get("title", "没有")
?
 ?  return "返回图书集合"

url_for 传入别名 找到对应的路由

?
@app.route("/books", methods=["GET"])
def go_book():
 ?  return redirect(url_for("book"))

4、返回json格式数据

我们要返回json格式数据,可以借助于 提供的函数 jsonify

from flask import jsonify

jsonify 会返回一个 Content-Type是 application/json 格式的 响应对象

5、返回元组响应

我们可以 同时设置?返回内容、响应码、响应头等信息

(响应内容,响应码,响应头)

@app.route("/book/add", methods=["POST"])
def book_add():
?
 ?  return ("添加图书成功", 500, {"Content-Type": "application/json"})

6、make_response 返回

我们也可以自定义返回的内容,使用make_reponse 方法。

from flask import make_response

@app.route("/book/<int:id>/")
def book_one(id):
 ?  print(type(id))
?
 ?  resp = make_response("我要升天")
 ?  resp.headers["Content-Type"] = "text/html"
 ?  resp.status_code = 500
 ?  resp.status = "500 error"

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-26 12:10:07  更:2021-10-26 12:11:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:03:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码