Quart扩展,用于提供跨源资源共享、访问控制和支持
项目描述
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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d667a0f13b4ce6d9e926489de5d819780844fbff5b2cdea156bd8867dd426a37 |
|
MD5 | 314cc79d05f8c134620cacf09bd988b9 |
|
BLAKE2b-256 | 20b1a5f6dd757496a8b29ac7ed41e581736b2b86327facb5f1c5ccba9e0513ee |
quart_cors-0.7.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fa872cc94a2ae6b51a35b028ebca65c14069d7121d63a4caa3526ebbfb7c5a99 |
|
MD5 | 6511fc4330f08b1595fe8278d38193f3 |
|
BLAKE2b-256 | 60fc1ffe9042df05d48f5eaac4116708fee3f7bb18b696380cc4e3797c8fd510 |