跳转到主要内容

一个为支持CORS添加装饰器的Sanic扩展。基于Cory Dolphin的flask-cors。

项目描述

Build Status Latest Version Supported Python versions License

一个处理跨域资源共享(CORS)的Sanic扩展,使得跨域AJAX成为可能。基于Cory Dolphin的flask-cors

本包遵循简单哲学,当您想要启用CORS时,您希望在一个域的所有用例上启用它。这意味着不需要对不同允许的头部、方法等进行干预。默认情况下,由于安全影响,禁止跨域提交cookie,请参阅文档了解如何启用带凭证的请求,并在这样做之前确保添加某种形式的CSRF保护!

2022年9月通知:如果您在使用Sanic v22.9+时遇到意外结果,请升级到Sanic-CORS v2.2.0

2021年12月通知:如果您需要与Sanic v21.12+兼容,请升级到Sanic-CORS v2.0

2021年9月通知:如果您需要与Sanic v21.9及以下版本兼容,请升级到Sanic-CORS v1.0.1

安装

使用pip或easy_install安装此扩展。

$ pip install -U sanic-cors

使用方法

此包公开了一个Sanic扩展,默认情况下在所有路由上为所有源和所有方法启用CORS支持。它允许按资源级别参数化所有CORS头部。该包还包含一个装饰器,供那些喜欢这种方式的人使用。

简单用法

在最简单的情况下,使用默认参数初始化Sanic-Cors扩展,以允许所有路由上的所有域启用CORS。

from sanic import Sanic
from sanic.response import text
from sanic_cors import CORS, cross_origin

app = Sanic(__name__)
CORS(app)

@app.route("/", methods=['GET', 'OPTIONS'])
def hello_world(request):
  return text("Hello, cross-origin-world!")

资源特定的CORS

或者,您可以通过传递一个字典作为 resources 选项,将路径映射到一组选项,在资源级别和源级别上指定CORS选项。

app = Sanic(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})

@app.route("/api/v1/users", methods=['GET', 'OPTIONS'])
def list_users(request):
  return text("user example")

通过装饰器实现特定路由的CORS

此扩展还提供了一个简单的装饰器,用于装饰sanic路由。只需在Sanic的 @app.route(..) 调用下方添加 @cross_origin(app),即可在特定路由上允许CORS。

@app.route("/", methods=['GET', 'OPTIONS'])
@cross_origin(app)
def hello_world(request):
  return text("Hello, cross-origin-world!")

Sanic-Ext 使用方法

Sanic-CORS可以使用Sanic-Ext为您加载插件。(但您需要确保禁用内置的sanic-ext CORS支持)

from sanic import Sanic
from sanic.response import text
from sanic_ext import Extend
from sanic_cors.extension import CORS
app = Sanic(__name__)
CORS_OPTIONS = {"resources": r'/*', "origins": "*", "methods": ["GET", "POST", "HEAD", "OPTIONS"]}
# Disable sanic-ext built-in CORS, and add the Sanic-CORS plugin
Extend(app, extensions=[CORS], config={"CORS": False, "CORS_OPTIONS": CORS_OPTIONS})

@app.route("/", methods=['GET', 'OPTIONS'])
def hello_world(request):
  return text("Hello, cross-origin-world!")

文档

有关选项的完整列表,请参阅flask-cors的文档

预检请求

CORS请求必须通过选项方法发送预检请求,Sanic默认仅允许GET方法,为了服务您的CORS请求,您必须在路由装饰器的methods参数中指定OPTIONS

Sanic-CORS包括一个automatic_options配置参数,允许插件自动为您处理OPTIONS响应。默认情况下,此功能已启用,但您可以根据需要将其关闭,以进行自己的OPTIONS响应。

CORS(app, automatic_options=True)

@app.delete('/api/auth')
@auth.login_required
async def auth_logout(request):
auth.logout_user(request)
    return json(None, status=OK)

或使用应用配置键

app = Sanic(__name__)
app.config['CORS_AUTOMATIC_OPTIONS'] = True

CORS(app)

@app.delete('/api/auth')
@auth.login_required
async def auth_logout(request):
    auth.logout_user(request)
    return json(None, status=OK)

或直接在路由上使用cross_origin装饰器

@app.route('/api/auth', methods={'DELETE','OPTIONS'})
@auth.login_required
@cross_origin(app, automatic_options=True)
async def auth_logout(request):
    auth.logout_user(request)
    return json(None, status=OK)

注意:对于第三个示例,您必须使用@route(),而不是@delete(),因为您需要在那个路由上启用DELETEOPTIONS,即使装饰器正在处理OPTIONS响应。

测试

包含一组简单测试的 test/ 目录。要运行,请安装nose,然后简单地调用nosetestspython setup.py test 以执行测试。

贡献

有疑问、评论或改进建议?请创建Github上的问题。我将尽最大努力以任何可能的方式包括提出的每个贡献。

致谢

此Sanic扩展基于Armin Ronacher编写的HTTP访问控制装饰器

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

Sanic-Cors-2.2.0.tar.gz (33.7 kB 查看哈希值)

上传时间 源代码

构建分发

Sanic_Cors-2.2.0-py2.py3-none-any.whl (18.3 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面