用于将cors头应用到asgi应用程序的asgi中间件

asgi-cors的Python项目详细描述


asgi cors

PyPICircleCILicense

用于将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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
计算Java和C之间字符串差异的显示宽度#   java在不关闭连接的情况下通过ADB多次访问应用程序数据库?   java使用testNG使测试并行运行   使用正则表达式模式替换文本块(在java中)   为Shopify应用程序生成访问令牌时发生java错误   找不到请求操作的java编解码器:[varchar<>com.thelastpickle.tlpstress.PartitionKey]   java用不同的字符替换字符串中的所有字符   java返回结果集会减慢程序的运行速度   java JPA,打开JPA OneToMany FailedObject   java如何在ArrayList中访问对象集并获取方法?   java Struts2增加上一个集合的<s:set/>值   在引用Java中的函数后使用外部函数   java如何配置两个hazelcast缓存(即IMap),一个用于分布式缓存,另一个用于单实例缓存   调试查找在java应用程序中执行的方法