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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章