Cherrypy多参数跨域

1. 浏览器端:
在发送跨域请求时,如:PUT http://cat:1974/api/v1/sources/16162
浏览器会自动将同样的参数以OPTIONS的请求方式对服务器进行请求:OPTIONS http://cat:1974/api/v1/sources/16162
当得到服务器端进行允许跨域的响应之后,才会按照我们指定的方式进行请求,如下图:


2. 服务器端(cherrypy):
假设服务器端有如下的可被访问的资源:
class sources:
    exposed = True

    def OPTIONS():
        # 跨域处理
    
    def PUT(id):
        # 跨域处理
        # do something
    
    def GET(start, count):
        # 跨域处理
        # do something
   
cherrypy会对跨域请求的url进行一系列的前处理,获取到所请求的方法名以及参数,找到相匹配的方法进行分配
如上中举的例子,当cherrypy获取到请求OPTIONS http://cat:1974/api/v1/sources/16162时,
它会根据url所指定的请求资源(sources),方法(OPTIONS),以及相应参数(start),找到相对应的方法,
但是由于相应的OPTIONS方法参数列表为空,与请求的参数start不匹配,所以cherrypy认为没有合适的资源,直接响应404,如下图:


2.1 所以使用cherrypy实现rest api跨域时,需要考虑到参数列表的情况,
上面的情况可以将OPTIONS和GET的参数列表设为一样即可:
def OPTIONS(start)

2.2 但是这样只能解决带有一个参数的请求跨域的情况,
如果浏览器发送的是GET http://cat:1974/api/v1/sources/0/10 这样的多参数的请求,则会有同样的问题,
这里可以用到python的可变参数*arg:
def OPTIONS(*arg)

这样的话,不管OPTION有多少个参数,都能请求成功了

2.3 另外,上面举的例子都是rest风格的url,如果换为标准的HTTP GET风格的url就需要使用**kwargs了,
如GET http://cat:1974/api/v1/sources?start=0&count=10


3. 最后的解决方案:
def OPTIONS(*args, **kwargs)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值