用于将cors头应用到asgi应用程序的asgi中间件
asgi-cors的Python项目详细描述
asgi cors
用于将cors头应用到asgi应用程序的asgi中间件。
安装
pip install asgi-cors
关于CORS的一些背景
CORS代表跨源资源共享。它是一个web标准,允许应用程序选择允许在其他域上运行的javascript进行可以从应用程序检索数据的fetch()
调用。
有关更多背景信息,请参见MDN's CORS article。
允许在其他域上运行的脚本从应用程序访问数据的最简单方法是添加以下http头:
Access-Control-Allow-Origin: *
这将允许在任何域上运行的脚本对应用程序进行fetch()
调用。对于公共数据,这通常是可以的,但是在某些情况下,这可能不是您想要做的:一个例子可能是运行在vpn后面的代码,需要允许特定的、受信任的主机加载数据,而不必将自己打开到internet上的每个站点。
对于这些情况,服务器需要检查来自客户机的origin报头,并在上面的报头中返回该报头。例如,来自http://localhost:8000
的传入请求可能被判断为可信的-在这种情况下,应用服务器需要像这样回复:
Access-Control-Allow-Origin: http://localhost:8000
注意,Access-Control-Allow-Origin
头只能返回一个值。这意味着,如果希望允许来自多个来源的请求,则需要动态地列出这些来源,并根据传入的请求返回不同的头值。
如何使用此中间件
我们假设你有一个现有的ASGI应用程序,在一个名为^ {CD5>}的变量中。
首先,导入asgi_cors
函数:
from asgi_cors import asgi_cors
要为Everywhere启用CORS头(通过向每个请求添加Access-Control-Allow-Origin: *
头),请执行以下操作:
app = asgi_cors(app, allow_all=True)
如果您希望仅允许来自特定主机,请使用以下命令:
app = asgi_cors(app, hosts=[
"https://www.example.com"
])
现在,在https://www.example.com上执行的javascript将能够调用您的api。您可以通过在浏览器中打开example.com、打开浏览器的devtools控制台并粘贴以下javascript进行测试:
fetch("https://your-api.com/").then(r => r.json()).then(d => console.log(d))
您可以在列表中包含多个主机。
最后,如果要打开应用程序,直到收到来自由通配符定义的主机选择的请求,请使用以下命令:
app = asgi_cors(app, host_wildcards=[
"http://localhost:800*",
"http://*.example.com"
])
这将允许从端口8000到8009上本地主机服务器上运行的任何javascript或example.com的任何子域进行访问。
如果需要执行一些无法使用hosts=
或host_wildcards=
参数表示的更复杂的操作,可以使用callback=
指定自定义函数。例如:
def validate_origin(origin):
return origin.startswith("https://")
app = asgi_cors(app, callback=validate_origin)
回调函数将传递浏览器传入的Origin
头。
将中间件用作装饰器
如果您将您的asgi应用程序直接定义为一个函数,那么您可以使用asgi_cors_decorator
函数装饰器,如下所示:
from asgi_cors import asgi_cors_decorator
@asgi_cors_decorator(allow_all=True)
async def my_asgi_app(scope, recieve, send):
# Your app goes here