前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >FastAPI(39)- 使用 CORS 解决跨域问题

FastAPI(39)- 使用 CORS 解决跨域问题

作者头像
小菠萝测试笔记
发布2021-10-09 11:37:50
发布2021-10-09 11:37:50
3.9K00
代码可运行
举报
运行总次数:0
代码可运行

同源策略

https://cloud.tencent.com/developer/article/1884129

CORS

https://cloud.tencent.com/developer/article/1884130

FastAPI 模拟跨域问题

https://cloud.tencent.com/developer/article/1886112

需要先了解什么是同源策略、CORS、跨域报错栗子才能更好看懂这篇文章

先看看之前跨域请求报错的截图

  • preflight 就是预检请求,没有通过服务端的允许,所以访问失败;
  • 点下右侧的箭头,实际发起的 login 请求会高亮
  • 第一个 login 请求就是实际发送的请求,因为预检请求失败,所以会报跨域错误

CORSMiddleware

  • CORSMiddleware 使用的默认参数在默认情况下是有限制性的,所以才有跨域问题
  • 因此需要显式启用特定的源、方法或 Headers,以便允许浏览器在跨域上下文中使用它们
allow_origins
  • 允许发出跨域请求的源列表
  • 例如

'https://example.org', 'https://www.example.org'

  • 可以使用 来允许任何来源

'*'

allow_methods
  • 允许跨域请求的 HTTP 方法列表
  • 默认为

'GET'

  • 可以使用 来允许所有标准请求方法

'*'

allow_headers
  • 允许跨域请求携带的 HTTP Request Headers 列表
  • 默认为

[]

  • 可以使用 来允许所有 Headers

'*'

  • 对于 CORS 请求,始终允许 Accept、Accept-Language、Content-Language 和 Content-Type
allow_credentials
  • 跨域请求应该支持 cookie
  • 默认为 False
  • 重点:为了允许凭据,allow_origins 不能设置为 '*',必须指定 origins
allow_origin_regex
  • 正则表达式字符串
  • 匹配允许发出跨域请求的源
expose_headers
  • 允许浏览器访问的任何 Response Headers
  • 默认为

[]

max_age
  • 设置浏览器缓存 CORS 响应的最长时间(以秒为单位),其实就是 preflight 预检请求的结果能够被缓存多久
  • 默认为 600

使用 CORSMiddleware 解决跨域问题

代码语言:javascript
代码运行次数:0
运行
复制
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/9/28 12:58 下午
# file: 33_cors.py
"""
import uvicorn
from fastapi import FastAPI, Body
# 1、导入对应的包
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

# 2、声明一个 源 列表;重点:要包含跨域的客户端 源
origins = [
    "http://localhost.tiangolo.com",
    "https://localhost.tiangolo.com",
    "http://localhost",
    "http://localhost:8080",
    # 客户端的源
    "http://127.0.0.1:8081"
]

# 3、配置 CORSMiddleware
app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,  # 允许访问的源
    allow_credentials=True,  # 支持 cookie
    allow_methods=["*"],  # 允许使用的请求方法
    allow_headers=["*"]  # 允许携带的 Headers
)


# 模拟服务端 登录 接口
@app.post("/login")
def get_login(id: str = Body(...), name: str = Body(...)):
    return {"id": id, "name": name}


if __name__ == '__main__':
    # 服务端端口是 8080!
    uvicorn.run(app="33_cors1:app", reload=True, host="127.0.0.1", port=8080)
访问浏览器,查看 F12 开发者工具 Network
  • preflight 就是预检请求,服务端允许它访问了,所以请求成功
  • 点下右侧的箭头,实际发起的 login 请求会高亮
  • 第一个 login 请求就是实际发送的请求,因为预检请求成功,所以它也请求成功啦

看看 preflight 预检请求的响应

这些就是 FastAPI 服务端设置的

看看实际 login 请求的响应头
看看响应体

至此!现在可以正常跨域发起请求啦!

至此!现在可以正常跨域发起请求啦!

至此!现在可以正常跨域发起请求啦!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 同源策略
  • CORS
  • FastAPI 模拟跨域问题
  • 先看看之前跨域请求报错的截图
  • CORSMiddleware
    • allow_origins
    • allow_methods
    • allow_headers
    • allow_credentials
    • allow_origin_regex
    • expose_headers
    • max_age
  • 使用 CORSMiddleware 解决跨域问题
    • 访问浏览器,查看 F12 开发者工具 Network
    • 看看实际 login 请求的响应头
    • 看看响应体
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档