前言
解决上一节遗留的跨域问题。
跨域
官方文档介绍,CORS指浏览器中运行的前端拥有与后端通信的 JavaScript 代码,而后端处于与前端不同的「源」的情况。
源
源是协议(http,https)、域(myapp.com,localhost,localhost.tiangolo.com)以及端口(80、443、8080)的组合。
跨域问题产生
根据上面的概念,我们想到可能产生跨域问题的场景:
- 域名不同:如果两个页面的域名不同,即使是同一个 IP 地址也会被认为是不同源。例如,
http://example.com和http://api.example.com就是不同域名。 - 协议不同:如果两个页面的协议不同,也会被认为是不同源。例如,
http://example.com和https://example.com就是不同协议。 - 端口不同:如果两个页面的端口不同,同样会被认为是不同源。例如,
http://example.com和http://example.com:8080就是不同端口。
使用 CORSMiddleware
步骤
- 导入
CORSMiddleware。 - 创建一个允许的源列表(由字符串组成)。
- 将其作为「中间件」添加到你的 FastAPI 应用中。
你也可以指定后端是否允许:
- 凭证(授权 headers,Cookies 等)。
- 特定的 HTTP 方法(
POST,PUT)或者使用通配符"*"允许所有方法。 - 特定的 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 请求头列表。默认为[]。你可以使用['*']允许所有的请求头。Accept、Accept-Language、Content-Language以及Content-Type请求头总是允许 CORS 请求。allow_credentials- 指示跨域请求支持 cookies。默认是False。另外,允许凭证时allow_origins不能设定为['*'],必须指定源。expose_headers- 指示可以被浏览器访问的响应头。默认为[]。max_age- 设定浏览器缓存 CORS 响应的最长时间,单位是秒。默认为600。
到这里,重新启动后端服务,再从前端请求,发现跨域问题已经解决了。
终于完成一个登录功能了。先简单实现,后续再进行优化