如何在 FastAPI 中启用 CORS?

use*_*199 10 fastapi

我试图在这个非常基本的 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!'}
Run Code Online (Sandbox Code Playgroud)

这是我得到的回应:

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!"}*
Run Code Online (Sandbox Code Playgroud)

yua*_*nzz 18

您可以从中找到答案:fastapi cors

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

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

  2. 在此文件中添加代码。

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"}
Run Code Online (Sandbox Code Playgroud)

并运行这个应用程序:

uvicorn main:app  --reload --host 0.0.0.0 --port 8000
Run Code Online (Sandbox Code Playgroud)

如果你的电脑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>
Run Code Online (Sandbox Code Playgroud)

  • 帮助页面的文字引用:*“此外,allow_origins 不能设置为 `[*]` 才能允许凭据,必须指定来源。”* (6认同)
  • 当 with_credentials 设置为 true 时,不能使用 [*] 作为允许的来源 (5认同)
  • @SunilGarg 它不应该工作。在yuanzz https://fastapi.tiangolo.com/tutorial/cors/?h=%20cors#use-corsmiddleware给出的链接上,它的字面意思是“allow_origins不能设置为['*']以允许凭证” (3认同)
  • 正如其他人所说,如果来源是通配符,请删除 `allow_methods=["*"],`,否则它将不起作用 (2认同)

小智 11

就我而言,当发生 pydantic 或类型问题时,CORS 不起作用。

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

app = FastAPI()

origins = [
    "http://localhost:3000",
]

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

# works well!
@app.get("/list")
async def main():
    return ["hi", "hello"]

# error cases
from typing import List
from app.nosql.model import Book

@app.get("/error")
async def main():
    # case 1
    ret = mongo_db.engine.find(Book, limit=10) # keyword "await" missing
    return ret  # CORS 500 error
    # case 2
    ret: List[Book] = await mongo_db.engine.find(Book, limit=10) # data was not fit with model Book
    return ret # CORS error
    # case 3
    return ["hi", "hello"] # works well...
Run Code Online (Sandbox Code Playgroud)

服务器端错误说明了什么?可能是服务器出现错误。测试一下新功能怎么样?(没有错误)如果服务器运行良好..嗯..对此感到抱歉。


归档时间:

查看次数:

9996 次

最近记录:

4 年,3 月 前