文章

Web框架 -> Flask

HTTP请求头部信息

请求方法

  1. GET请求:用于获取指定资源的信息,请求参数通常通过URL的查询字符串传递。
  2. POST请求:用于提交指定资源的信息,请求参数通常通过请求体传递。
  3. PUT请求:用于更新指定资源的信息,请求参数通常通过请求体传递。
  4. DELETE请求:用于删除指定资源。
  5. HEAD请求:类似于GET请求,但只返回响应头部信息,不返回响应体信息。
  6. OPTIONS请求:用于获取指定资源所支持的通信选项。
  7. TRACE请求:用于追踪请求-响应的传输路径,用于调试和测试。
  8. CONNECT请求:用于将服务器作为代理连接到其他网络资源,通常用于HTTPS协议的隧道。

请求数据类型(Content-Type 字段)

请求体(Body):用于传输请求的主体数据

  • application/x-www-form-urlencoded:表示表单数据,数据格式为 key-value 键值对的形式,多个键值对使用“&”符号分隔。例如,Content-Type 字段值为 application/x-www-form-urlencoded 时,请求体可能如下所示:
1
name=John&age=25
  • multipart/form-data:表示多部分表单数据,适用于上传文件等场景。请求体分为多个部分,每个部分都有自己的 Content-Type 和 Content-Disposition 字段,用于描述该部分的内容类型和附加属性。例如,Content-Type 字段值为 multipart/form-data 时,请求体可能如下所示:
1
2
3
4
5
6
7
8
9
10
--boundary
Content-Disposition: form-data; name="name"

John
--boundary
Content-Disposition: form-data; name="file"; filename="example.png"
Content-Type: image/png

二进制文件数据
--boundary--
  • application/json:表示 JSON 数据,数据格式为 JavaScript 对象或数组的形式。例如,Content-Type 字段值为 application/json 时,请求体可能如下所示:
1
2
3
4
{
  "name": "John",
  "age": 25
}
  • application/xml:表示 XML 数据,数据格式为 XML 的形式。例如,Content-Type 字段值为 application/xml 时,请求体可能如下所示:
1
2
3
4
<user>
  <name>John</name>
  <age>25</age>
</user>
  • text/plain:表示纯文本数据,数据格式为普通文本的形式。例如,Content-Type 字段值为 text/plain 时,请求体可能如下所示:
1
Hello, world!
  • application/octet-stream:表示二进制数据,适用于上传二进制文件等场景。例如,Content-Type 字段值为 application/octet-stream 时,请求体为二进制流的形式。

除了上述常见的 Content-Type 字段值外,HTTP 协议还定义了许多其他的媒体类型,例如 image/png、video/mp4、application/pdf 等,可以根据实际需要选择合适的媒体类型进行使用。

Flask框架(web应用)

1
from flask import Flask, request, render_template, redirect, session, jsonify

Request函数

描述:处理来自客户端的请求数据

当post请求时,需要使用request.form来获取数据

1
variable = request.form   #输出表单请求数据,类型为mmutableMultiDict
1
variable = request.form.to_dict()   #打印输出请求的数据类型mmutableMultiDict转换为字典型;方便存入后台数据库
1
variable = request.form.get('key')   #获取表单请求数据

当get请求时,需要使用request.args来获取数据

1
2
3
variable = request.args.get('id')  #获取具体某个参数
#http://192.168.1.1:4000/index?id=1&name=abc
#request.args就是获取请求链接中?后面所有参数;把所有参数转换成一个列表,列表里面的元素是一个元组,结构为:('id','1');再转换成一个字典,还有编码等操作。

打印http协议头部信息

1
variable = request.headers   

打印请求类型

1
variable = request.method    

打印请求的数据类型

1
variable = request.mimetype  

打印数据类型为application/json的请求数据

1
variable = request.json #如果mimetype(数据类型) 是 application/json,这个参数将会解析 json 数据,如果不是则返回 None

render_template函数(渲染模板并将其作为响应发送给客户端)

描述:用于渲染模板并将其作为响应发送给客户端。(内部URL)

render_template 则会将指定的模板文件和需要的数据作为参数传递给模板引擎,最终生成 HTML 页面返回给浏览器。

1
2
3
4
5
6
7
#后端传参给前端HTML模板
user = {'username': 'John', 'age': 25}
return render_template('index.html', user=user)  或者  ('index.html', name='John', age=25)
#前端调用参数
<h1>Welcome </h1>  或者  
<p>Your age is </p>  或者  
#HTML模板都放入/templates目录下;需要自行创建templates目录

redirect函数(重定向到外部链接)

描述:重定向到另一个URL,通常用于处理表单提交后的页面跳转等操作。(外部URL)

redirect 会发送一个 HTTP 重定向响应给浏览器,告诉浏览器要跳转到另一个 URL。

1
2
redirect('/thank-you')  #里面的参数可以是路由
redirect('https://www.baidu.com', code=302) #也可以是指定的外部链接

session函数(检查用户登录状态)

描述:session 变量是一种在服务器端存储和管理用户状态的机制,可以用于跨请求保留数据。当用户登录成功时,可以设置 session['logged_in'] = True,表示用户已经登录。

1
2
3
4
5
6
7
from flask import session

if 'logged_in' in session and session['logged_in']:
    # 用户已经登录
else:
    # 用户未登录
#ession['logged_in'] 检查 session 中是否存在 logged_in 变量,并且其值为 True。如果是,则说明用户已经登录。如果 logged_in 变量不存在或其值为 False,则说明用户未登录。

Python-json模块

JSON与PYTHON字典数据转换

将JSON数据转换为Python字典,可以使用 json.loads() 方法:

1
2
3
4
5
6
7
8
9
10
11
12
import json

# JSON数据
json_str = '{"name": "John", "age": 30, "city": "New York"}'

# 将JSON数据解析为Python字典
data = json.loads(json_str)

# 输出Python字典
print(data)

#输出 {'name': 'John', 'age': 30, 'city': 'New York'}

将Python字典转换为JSON数据,可以使用 json.dumps() 方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import json

# 定义一个Python字典
data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

# 将Python字典转换为JSON数据
json_data = json.dumps(data)

print(json_data)  

#输出 {"name": "John", "age": 30, "city": "New York"}

备注:JSON对象中的键都用双引号括起来,而Python字典中的键可以用单引号或双引号,甚至可以不用引号。此外,JSON对象中的值的类型受到限制,例如不能使用Python中的True和False,而Python字典中则没有这样的限制

本文由作者按照 CC BY 4.0 进行授权