注在学习本篇文章之前请先学习FastAPI入门实战:从零搭建到核心功能详解

前言

Web开发的核心在于处理请求与维持状态。本文从FastAPI的Request对象出发,详解请求头读取、参数获取的实用技巧,并深入剖析Cookie的工作原理。无论你是刚入门的新手,还是想系统梳理知识点的开发者,都能在这里找到清晰的答案。

一、request请求

1.1 什么是request请求

用户打开浏览器访问网站时,浏览器会向服务器发送一条消息。这条消息就是request请求。它里面包含了用户想干什么、带了什么数据、用什么方式访问等信息。
服务器收到这条消息后,会查看里面的内容,然后决定返回什么给用户。

1.2获取Content-Type请求头信息的两种方法

请求头里面放了很多辅助信息。比如用户的浏览器类型、想要接收什么格式的数据、身份验证的令牌等。

1.2.1 直接通过字典方式获取(不推荐)

这种方式像查字典一样,直接用中括号取值。但如果请求头里没有这个字段,程序会直接报错。

from fastapi import APIRouter, Request, Response

request_router = APIRouter()


@request_router.get("/header/")
async def get_request_header(request: Request):
    # 获取Content-Type请求头的头信息
    # Content-Type是HeaderName(头名)
    # 如果请求头中没有该头信息Content-Type,则会抛出异常
    content_type = request.headers["Content-Type"]
    return {"Content-Type": content_type}

代码详解

  • 使用字典的索引访问方式 request.headers["Content-Type"]

  • 当请求头种不存在“Content-Type”时,会抛出KeyError异常

    这会导致API响应500 Internal Server Error异常

1.2.2 通过get方法获取(推荐)

这种方式更安全。如果请求头里没有这个字段,它会返回None,程序不会崩溃。

from fastapi import APIRouter, Request, Response

request_router = APIRouter()


@request_router.get("/header/2/")
async def get_request_header_2(request: Request):
    # 获取Content-Type请求头的头信息
    # Content-Type是HeaderName(头名)
    # 如果请求头中没有该头信息Content-Type,则会返回None
    content_type = request.headers.get("Content-Type")
    user_agent = request.headers.get("User-Agent")

    return {"Content-Type": content_type, "User-Agent": user_agent}

代码详解

  • 使用字典的get()方法request.headers.get("Content-Type")
  • 当请求头中不存在“Content-Type”时,返回None
    不会抛出异常,API会正常响应
  • 可以提供默认值:
    request.headers.get("Content-Type","application/json")

1.3 request请求三种获取参数的方法

用户传数据给服务器,通常有三种方式。这些方式对应URL的不同部分。

1.3.1 第一种:路径参数

路径参数写在URL里面,是URL路径的一部分。比如 /path_params/张三

from fastapi import APIRouter, Request, Response

request_router = APIRouter()


@request_router.get("/path_params/{name}")
async def get_path_params(request: Request):
    # 获取路径参数 path_params
    name = request.path_params.get("name")
    return {"name": name}

1.3.2 第二种:查询参数

查询参数跟在问号后面,用键值对的形式。比如 /?name=张三

from fastapi import APIRouter, Request, Response

request_router = APIRouter()


@request_router.get("/params/")
async def get_request_params(request: Request):
    # 获取请求参数 query_params
    name = request.query_params.get("name")
    return {"name": name}

1.3.3 第三种:请求体参数

请求体放在POST或PUT请求里面,通常是JSON格式的数据。获取请求体需要用到await,因为读取数据是异步操作。

from fastapi import APIRouter, Request, Response

request_router = APIRouter()


@request_router.post("/body/")
async def get_request_body(request: Request):
    # 获取请求体 body
    # body_data = await request.body()
    # print(body_data)
    # return {"body_data": body_data}

    # 获取请求体 body,推荐使用json方法
    body_data = await request.json()
    return {"body_data": body_data}

二、什么是Cookie

2.1 什么是Cookie

Cookie是服务器放在用户浏览器里的一小段文字。这段文字可以保存用户的身份标识、偏好设置等信息。

下次用户在访问网站时,浏览器会自动带上这段文字。服务器看到这段文字,就能认出这个用户是谁。

2.2 Cookie的原理是什么

HTTP协议本身不保存状态。这意味着服务器记不住用户之前做过什么。但网站经常需要记住用户,比如记住登录状态。Cookie解决了这个问题。
它的工作流程如下:

2.2.1 第一步:服务器创建Cookie

用户第一次访问时,服务器生成一个唯一的编号。这个编号就是SessionID。服务器把这个编码存到数据库里,同时把它发给用户的浏览器。

2.2.2 浏览器保存Cookie

浏览器收到这个编号后,把它存到本地。这就是Cookie。

2.2.3 浏览器自动发送Cookie

用户下次访问时,浏览器会自动把这个编号发送给服务器。服务器检查这个编号,就能知道用户是谁。

在这里插入图片描述

注:这种构架设计还存在一些问题:
服务器为每个用户创建独立的线程对象,并分配不同的SessionID。这样不同用户的数据就不会混在一起。如果用户太多,服务器内存可能不够用,这时可以用Redis等工具来存Session数据。

2.3 添加Cookie

服务器通过Response对象把Cookie发给浏览器。可以设置Cookie的名字、值、有效期等。

from fastapi import APIRouter, Request, Response

request_router = APIRouter()


@request_router.post("/cookie/set")
async def set_cookie(response: Response):
    # 获取Cookie
    # Cookie是HeaderName(头名)
    # 如果请求头中没有该头信息Cookie,则会返回None
    response.set_cookie("session_id", "123456", max_age=60)
    return {"message": "cookie set"}

2.4 获取Cookie

浏览器再次访问时,会自动带上之前保存的Cookie。服务器通过Request对象可以读取这些Cookie。

from fastapi import APIRouter, Request, Response

request_router = APIRouter()


@request_router.get("/cookie/get")
async def get_cookie(request: Request):
    # 获取Cookie
    # Cookie是HeaderName(头名)
    # 如果请求头中没有该头信息Cookie,则会返回None
    session_id = request.cookies.get("session_id")
    return {"message": "cookie get","session_id": session_id}

结语

掌握Request与Cookie,你就掌握了Web开发的两大基石。前者让你读懂用户的每一次请求,后者让你记住用户的每一次到访。把这些知识串起来,你就能构建出真正可用的Web服务。继续实践,继续探索,下一篇文章我们再见。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐