跳转到主要内容

Quart扩展,用于提供跨源资源共享、访问控制和支持

项目描述

Build Status pypi python license

Quart-CORS是Quart的一个扩展,用于启用和控制跨源资源共享(CORS,也称为访问控制)。

CORS由于同源策略的需要而变得必要,该策略阻止来自不同源的资源被使用。在这种情况下,源被定义为方案、主机和端口的组合,资源对应于路径。

在实践中,同源策略意味着访问http://quart.com的浏览器将阻止读取GET http://api.com的响应。它还将阻止如POST http://api.com的请求。请注意,CORS适用于浏览器发起的请求,非浏览器客户端(如requests)不受CORS限制。

CORS允许服务器向浏览器指示某些资源可以被使用,这与同源策略相反。它是通过访问控制头来实现的,这些头信息通知浏览器资源如何被使用。对于GET请求,这些头信息包含在响应中。对于非GET请求,浏览器必须在发送实际请求之前向服务器请求访问控制头,它是通过一个预检OPTIONS请求来完成的。

同源策略不适用于WebSocket,因此无需CORS。相反,服务器独自负责决定是否允许WebSocket,它应通过检查WebSocket请求的源头来实现。

简单的(GET)请求应返回CORS头,指定允许使用资源的源。这可以是任何源,*(通配符),或特定源的列表。响应还应包括一个CORS头,指定是否可以使用响应凭据,例如cookie。请注意,如果允许凭据共享,则允许的源必须特定,而不能是通配符。

预检请求应返回CORS头,指定允许使用资源的源,允许发送到资源的请求中的方法和头,是否可以使用响应凭据,最后是哪些响应头可以使用。

请注意,某些操作在同源策略中是允许的,例如嵌入例如<img src="http://api.com/img.gif">和简单的POST。但是,对于本readme的目的,这些复杂性被忽略。

CORS访问控制响应头包括:

头名称

含义

Access-Control-Allow-Origin

允许使用资源的源。

Access-Control-Allow-Credentials

是否可以共享凭据。

Access-Control-Allow-Methods

在请求资源时可能使用的方法。

Access-Control-Allow-Headers

在请求资源时可能发送的头。

Access-Control-Expose-Headers

在响应资源时可能读取的头。

Access-Control-Max-Age

缓存CORS头的时间(以资源为单位)的最大年龄。

Quart-CORS在它们具有相同含义时使用相同的命名(不使用Access-Control前缀)为其参数和设置。

用法

要将CORS访问控制头添加到应用程序中的所有路由,只需将cors函数应用到应用程序,或特定的蓝图,

app = Quart(__name__)
app = cors(app, **settings)

blueprint = Blueprint(__name__)
blueprint = cors(blueprint, **settings)

或者,如果您想按资源选择性地添加CORS,将route_cors函数应用到路由,或将websocket_cors函数应用到WebSocket,

@app.route('/')
@route_cors(**settings)
async def handler():
    ...

@app.websocket('/')
@websocket_cors(allow_origin=...)
async def handler():
    ...

这些是这些参数的设置,

参数

类型

allow_origin

Union[Set[Union[Pattern, str]], Union[Pattern, str]]

allow_credentials

bool

allow_methods

Union[Set[str], str]

allow_headers

Union[Set[str], str]

expose_headers

Union[Set[str], str]

max_age

Union[int, flot, timedelta]

它们对应于上面提到的CORS头。请注意,所有设置都是可选的,可以在应用程序配置中指定默认值,

配置键

类型

QUART_CORS_ALLOW_ORIGIN

Set[Union[Pattern, str]]

QUART_CORS_ALLOW_CREDENTIALS

bool

QUART_CORS_ALLOW_METHODS

Set[str]

QUART_CORS_ALLOW_HEADERS

Set[str]

QUART_CORS_EXPOSE_HEADERS

Set[str]

QUART_CORS_MAX_AGE

float

websocket_cors装饰器只接受一个allow_origin参数,该参数定义了允许使用WebSocket的源。来自不允许源的WebSocket请求将以400响应响应。

allow_origin源应该是源本身(没有路径、查询字符串或片段),即https://quart.com而不是https://quart.com/

cors_exempt装饰器可以与cors结合使用,以免除WebSocket处理程序或视图函数的CORS。

简单示例

要允许任何源使用应用程序(不推荐,因为它太宽容了),

app = Quart(__name__)
app = cors(app, allow_origin="*")

要允许路由或WebSocket从另一个特定的域(例如https://quart.com)使用,

@app.route('/')
@route_cors(allow_origin="https://quart.com")
async def handler():
    ...

@app.websocket('/')
@websocket_cors(allow_origin="https://quart.com")
async def handler():
    ...

允许路由或WebSocket从< span class="docutils literal">quart.com的任何子域名(但不是域名本身)使用,

@app.route('/')
@route_cors(allow_origin=re.compile(r"https:\/\/.*\.quart\.com"))
async def handler():
    ...

@app.websocket('/')
@websocket_cors(allow_origin=re.compile(r"https:\/\/.*\.quart\.com"))
async def handler():
    ...

允许从< span class="docutils literal">https://quart.com向API路由发送JSON POST请求,

@app.route('/', methods=["POST"])
@route_cors(
    allow_headers=["content-type"],
    allow_methods=["POST"],
    allow_origin=["https://quart.com"],
)
async def handler():
    data = await request.get_json()
    ...

贡献

Quart-CORS是在GitHub上开发的。非常欢迎您打开问题或提出合并请求

测试

测试Quart-CORS的最佳方法是使用Tox,

$ pip install tox
$ tox

这将检查代码风格并运行测试。

帮助

这是开始的地方,之后尝试打开一个问题

项目详情


下载文件

下载适用于您平台的项目文件。如果您不确定选择哪个,请了解更多关于安装软件包的信息。

源分布

quart_cors-0.7.0.tar.gz (9.8 kB 查看哈希值)

上传时间

构建分布

quart_cors-0.7.0-py3-none-any.whl (8.0 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWSAWS云计算和安全赞助商 DatadogDatadog监控 FastlyFastlyCDN GoogleGoogle下载分析 MicrosoftMicrosoftPSF赞助商 PingdomPingdom监控 SentrySentry错误记录 StatusPageStatusPage状态页面