【问题标题】:How to properly use Regex in CORS Middleware for FastAPI?如何在 CORS 中间件中为 FastAPI 正确使用正则表达式?
【发布时间】:2022-10-23 21:00:13
【问题描述】:

我有一个使用 FastAPI 后端和 Next.js 前端的应用程序。在具有稳定来源的开发和生产中,我可以毫无问题地使用 CORSMiddleware。但是,我已经使用 Vercel 部署了 Next.js 前端,并希望利用 Vercel 在每次 git 提交时进行的自动预览部署,以允许分段类型的定性测试和健全性检查。

我在预览部署中遇到了 CORS 问题:由于每个预览部署都使用模式的自动生成 URL:<project-name>-<unique-hash>-<scope-slug>.vercel.app,因此我无法将它们直接添加到allow_originsCORSMiddleware 的参数。相反,我试图将模式添加到allow_origin_regex争论。

我对正则表达式很陌生,但能够找出我已经测试过在 REPL 中工作的模式。但是,因为我遇到了问题,我已经改用“。*”的超宽松正则表达式,只是为了让任何东西都能正常工作,但这也失败了。

main.py(相关部分)

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

app = FastAPI()

origins = [
    "http://localhost",
    "http://localhost:8080",
    "http://localhost:3000",
    "https://my-project-name.vercel.app"
]

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

我查看了 FastAPI/Starlette cors.py 文件以了解它如何摄取和使用原始正则表达式,但看不出问题出在哪里。我已经在 REPL 中测试了相同的方法,没有任何问题。为了解决这个问题,我不知道下一个调查途径。欢迎任何帮助或指示或“嘿,你忘了这个”cmets。

【问题讨论】:

    标签: python regex fastapi vercel starlette


    【解决方案1】:

    你可以使用:

    allow_origin_regex='https://.*.vercel.app'
    

    下面的示例基于 FastAPI/Starlette 的 CORSMiddleware 在内部的工作方式(参见实现 here)。该示例显示,使用上述正则表达式,将找到与 https://my-project-name.vercel.app 等来源的匹配项。

    import re
    
    origin = 'https://my-project-name.vercel.app'
    allow_origin_regex = 'https://.*.vercel.app'
    compiled_allow_origin_regex = re.compile(allow_origin_regex)
    
    if (compiled_allow_origin_regex is not None
            and compiled_allow_origin_regex.fullmatch(origin)):
        print('Math found')
    else:
        print('No match found')
    
    

    另外,请务必指定正确的协议(例如,httphttps)和港口8080003000)在allow_origin_regex

    【讨论】:

      【解决方案2】:

      一旦我意识到我的错误,我犹豫承认这个答案实际上是多么愚蠢,但我想在理智上诚实并提供更新,以防万一其他人有类似的空白并遇到这个问题。

      在大多数情况下,我对任何前端和开发都是新手,以前从未真正处理过 CORS。我非常关心在前端进行预览部署,并检查 Vercel 上自动构建的预览部署,以至于我忘记了我实际在哪里进行更改。我将项目的前端和后端作为子目录放在同一个 repo 中,因此后端代码的每次 git push 都会导致自动 Vercel 部署,我只是忽略了它不会导致实际 FastAPI 代码的更新。

      一旦我意识到并将更改推送到我的后端,一切都开始正常工作。

      我将另一个答案标记为正确,因为它在回答我提出的问题时是 100% 正确的,但提供这个是因为它是我在哪里犯了真正错误的问题的答案。

      【讨论】:

        猜你喜欢
        • 2021-03-15
        • 2023-01-23
        • 1970-01-01
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        • 2020-10-29
        • 2020-09-14
        相关资源
        最近更新 更多