如何在 FastAPI 中启用 CORS?

Posted

技术标签:

【中文标题】如何在 FastAPI 中启用 CORS?【英文标题】:How can I enable CORS in FastAPI? 【发布时间】:2021-04-14 12:51:12 【问题描述】:

我正在尝试在这个非常基本的 FastAPI 示例中启用 CORS,但它似乎不起作用。

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware


app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=['*']
)

@app.get('/')
def read_main():
    return 'message': 'Hello World!'

这是我得到的回复:

curl -v http://127.0.0.1:8000
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8000 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8000
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< date: Fri, 08 Jan 2021 19:27:37 GMT
< server: uvicorn
< content-length: 26
< content-type: application/json
<
* Connection #0 to host 127.0.0.1 left intact
"message":"Hello World!"*

【问题讨论】:

它似乎正在工作。您允许来自每个来源的请求 @Isabi 我的回复中没有得到 Access-Control-Allow-Origin: * 您是否尝试过使用浏览器或应用程序?我的猜测是 curl 没有在标题中发送Origin,因为它没有明确定义的来源,所以它不能在标题中返回它 我尝试使用 Chrome 和 Postman。我在响应中得到的唯一标题是:content-lengthcontent-typedateserver 这很奇怪。您是否尝试过完整的示例? fastapi.tiangolo.com/tutorial/cors/?h=+cors#use-corsmiddleware 【参考方案1】:

你可以从这里找到答案:fastapi cors

那么这是一个非常简单的代码来实现它:

    创建一个python文件并将其命名为main.py

    在此文件中添加代码。

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = ["*"]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.get("/")
async def main():
    return "message": "Hello World"

并运行这个应用程序:

uvicorn main:app  --reload --host 0.0.0.0 --port 8000

如果你的电脑ip是192.12.12.12

您可以查看此链接并在 html 中编写一个小的 javascript

<script>
        fetch("http://192.12.12.12:8000/").then((Response) => 
            return Response.json()
        ).then((data) => 
            console.log(data);
        )
    </script>

【讨论】:

即使重新启动服务器也不适合我 @SunilGarg 它不应该工作。在yuanzz fastapi.tiangolo.com/tutorial/cors/… 给出的链接上,它的字面意思是“allow_origins 不能设置为 ['*'] 以允许凭据” 当 with_credentials 设置为 true 时,您不能使用 [*] 作为允许的来源 来自帮助页面的文字引用:“此外,为了允许凭据,allow_origins 不能设置为 [*],必须指定来源。”【参考方案2】:

CORS 或“跨域资源共享”是指在浏览器中运行的前端具有与后端通信的 JavaScript 代码,并且后端与前端处于不同“来源”的情况。

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
    "http://domainname.com",
    "https://domainname.com",
    "http://localhost",
    "http://localhost:8080",
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

Know more

【讨论】:

以上是关于如何在 FastAPI 中启用 CORS?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Sharepoint Online 中启用 CORS

如何使用 CORS 启用自定义标头?

如何在 asp.net web apis 中启用 cors 选项。?

如何在ajax中启用cors?

如何在 ASP.NET Core 中启用 CORS

如何在 Spring Boot 和 Angular 中启用 CORS