为cors支持添加decorator的sanic扩展。基于科里海豚的烧瓶。
Sanic-Cors的Python项目详细描述
处理跨源资源共享(CORS)的SANIC扩展, 使跨源ajax成为可能。基于 flask-cors科里海豚。
这个包有一个简单的原理,当你想启用cors时,你 希望为域上的所有用例启用它。这意味着不要弄脏 默认情况下,使用不同的允许头、方法等, 由于安全原因,已禁用跨域提交cookie 含义,请参阅文档了解如何启用 凭证请求,请确保添加某种 CSRF 在这样做之前保护!
安装
使用pip或easy_install安装扩展。
$ pip install -U sanic-cors
用法
这个包公开了一个sanic扩展,默认情况下,它在 所有路线,所有来源和方法。它允许所有 每个资源级别上的cors头。包中还包含一个decorator, 对于那些喜欢这种方法的人。
简单用法
在最简单的情况下,使用默认值初始化sanic cors扩展 参数,以便允许所有路由上所有域的CORS。
fromsanicimportSanicfromsanic.responseimporttextfromsanic_corsimportCORS,cross_originapp=Sanic(__name__)CORS(app)@app.route("/",methods=['GET','OPTIONS'])defhello_world(request):returntext("Hello, cross-origin-world!")
特定于资源的COR
或者,可以在资源和源上指定CORS选项 通过将字典作为资源选项传递的粒度级别, 将路径映射到一组选项。
app=Sanic(__name__)cors=CORS(app,resources={r"/api/*":{"origins":"*"}})@app.route("/api/v1/users",methods=['GET','OPTIONS'])deflist_users(request):returntext("user example")
通过decorator路由特定的COR
这个扩展还公开了一个简单的decorator来装饰sanic路由。 和。只需在调用sanic的下面添加@cross_origin(app)。 @app.route(..)允许cors在给定的路由上运行。
@app.route("/",methods=['GET','OPTIONS'])@cross_origin(app)defhello_world(request):returntext("Hello, cross-origin-world!")
SPF使用
sanic cors在幕后使用sanic插件框架。 这意味着您可以使用spf为您加载插件,如果您是 使用多个SPF插件编排和应用程序。
fromsanicimportSanicfromsanic.responseimporttextfromspfimportSanicPluginsFrameworkfromsanic_cors.extensionimportcorsapp=Sanic(__name__)spf=SanicPluginsFramework(app)spf.register_plugin(cors,automatic_options=True)@app.route("/",methods=['GET','OPTIONS'])defhello_world(request):returntext("Hello, cross-origin-world!")
文档
欲了解完整的选项列表,请参阅烧瓶瓶 documentation。
飞行前请求
CORS请求必须发送pre-flight requests 通过options方法,sanic默认只允许GET方法,以便 为cors请求提供服务您必须在methods参数中指定OPTIONS以 你的路线设计师。
或者,可以使用automatic_options配置参数 为您自动处理OPTIONS响应。
CORS(app,automatic_options=True)@app.delete('/api/auth')@auth.login_requiredasyncdefauth_logout(request):auth.logout_user(request)returnjson(None,status=OK)
或者使用app config键:
app=Sanic(__name__)app.config['CORS_AUTOMATIC_OPTIONS']=TrueCORS(app)@app.delete('/api/auth')@auth.login_requiredasyncdefauth_logout(request):auth.logout_user(request)returnjson(None,status=OK)
或者直接使用cross_origindecorator:
@app.route('/api/auth',methods={'DELETE','OPTIONS'})@auth.login_required@cross_origin(app,automatic_options=True)asyncdefauth_logout(request):auth.logout_user(request)returnjson(None,status=OK)
注意:对于第三个示例,必须使用@route(),而不是 @delete()因为您需要同时启用DELETE和OPTIONS来 尽管decorator正在处理^{tt4},也要处理该路径$ 回应。
故障排除
如果事情没有如您所期望的那样工作,请启用日志记录以帮助理解 引擎盖下面发生了什么,为什么。
logging.getLogger('sanic_cors').level=logging.DEBUG
测试
一组简单的测试包含在test/中。要运行,安装机头, 只需调用nosetests或python setup.py test来执行 测试。
贡献
问题、评论或改进?请在上创建问题 Github。我尽力 尽我所能把所有提议的贡献都包括在内。
学分
这个sanic扩展基于armin编写的Decorator for the HTTP Access Control 罗纳克。