基于FastApi框架测试平台(10)-跨域问题

291 阅读2分钟

前言

解决上一节遗留的跨域问题。

跨域

官方文档介绍,CORS指浏览器中运行的前端拥有与后端通信的 JavaScript 代码,而后端处于与前端不同的「源」的情况。

源是协议(httphttps)、域(myapp.comlocalhostlocalhost.tiangolo.com)以及端口(804438080)的组合。

跨域问题产生

根据上面的概念,我们想到可能产生跨域问题的场景:

  1. 域名不同:如果两个页面的域名不同,即使是同一个 IP 地址也会被认为是不同源。例如,http://example.comhttp://api.example.com 就是不同域名。
  2. 协议不同:如果两个页面的协议不同,也会被认为是不同源。例如,http://example.comhttps://example.com 就是不同协议。
  3. 端口不同:如果两个页面的端口不同,同样会被认为是不同源。例如,http://example.comhttp://example.com:8080 就是不同端口。

使用 CORSMiddleware

步骤

  • 导入 CORSMiddleware
  • 创建一个允许的源列表(由字符串组成)。
  • 将其作为「中间件」添加到你的 FastAPI 应用中。

你也可以指定后端是否允许:

  • 凭证(授权 headers,Cookies 等)。
  • 特定的 HTTP 方法(POSTPUT)或者使用通配符 "*" 允许所有方法。
  • 特定的 HTTP headers 或者使用通配符 "*" 允许所有 headers。

修改源码

main.py

from fastapi import FastAPI
from apps.auth.api.v1 import user
from apps.auth.core.config import settings
from fastapi.middleware.cors import CORSMiddleware
​
app = FastAPI(title=settings.PROJECT_NAME, openapi_url=f"{settings.API_V1_STR}/openapi.json")
​
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
app.include_router(user.router, prefix=settings.API_V1_STR)

支持以下参数:

  • allow_origins - 一个允许跨域请求的源列表。例如 ['https://example.org', 'https://www.example.org']。你可以使用 ['*'] 允许任何源。
  • allow_origin_regex - 一个正则表达式字符串,匹配的源允许跨域请求。例如 'https://.*.example.org'
  • allow_methods - 一个允许跨域请求的 HTTP 方法列表。默认为 ['GET']。你可以使用 ['*'] 来允许所有标准方法。
  • allow_headers - 一个允许跨域请求的 HTTP 请求头列表。默认为 []。你可以使用 ['*'] 允许所有的请求头。AcceptAccept-LanguageContent-Language 以及 Content-Type 请求头总是允许 CORS 请求。
  • allow_credentials - 指示跨域请求支持 cookies。默认是 False。另外,允许凭证时 allow_origins 不能设定为 ['*'],必须指定源。
  • expose_headers - 指示可以被浏览器访问的响应头。默认为 []
  • max_age - 设定浏览器缓存 CORS 响应的最长时间,单位是秒。默认为 600

到这里,重新启动后端服务,再从前端请求,发现跨域问题已经解决了。

终于完成一个登录功能了。先简单实现,后续再进行优化