當前位置:
首頁 > 知識 > 讓python bottle框架支持jquery ajax的RESTful風格的PUT和DELETE等請求

讓python bottle框架支持jquery ajax的RESTful風格的PUT和DELETE等請求

這兩天在用python的bottle框架開發後台管理系統,介面約定使用RESTful風格請求,前端使用jquery ajax與介面進行交互,使用POST與GET請求時都正常,而Request Method使用PUT或DELETE請求時,直接爆「HTTP Error 405: Method Not Allowed」錯誤。而ajax提交的Request Method值DELETE也變成了OPTIONS了。

讓python bottle框架支持jquery ajax的RESTful風格的PUT和DELETE等請求

度娘了好多答案,要麼說是瀏覽器不支持,要麼說自己重新封裝jquery,還有其他的一些方法......呃...重新封裝jquery就算了,javascript不是很熟無從下手,然後其他方法一個個都試過也沒有用,想來想去還是從python源碼入手好一點。

說干就干,在主文件main.py中,添加了bottle勾子 @hook("before_request") 函數(引用:from bottle import request),然後添加r = request,用來接收bottle的request變數,方便debug時在IDE的Debugger視圖中查看request裡面的值,見下圖

讓python bottle框架支持jquery ajax的RESTful風格的PUT和DELETE等請求

我們找到request的environ變數,可以看到用ajax提交時,比平常提交多了"HTTP_ACCESS_CONTROL_REQUEST_METHOD" (64411616) = {str}"DELETE" 參數

而Request Method的值則變為:"REQUEST_METHOD" (45248088) = "OPTIONS" ,難怪jquery的ajax方式提交,python bottle框架設定的路由一直接收不到

知道問題所在要改造就好多了

方法一:直接在勾子里添加下面代碼,改變REQUEST_METHOD的值

@hook("before_request")
def validate:
"""使用勾子處理頁面或介面訪問事件"""
# 讓bottle框架支持jquery ajax的RESTful風格的PUT和DELETE等請求
REQUEST_METHOD = request.environ.get("REQUEST_METHOD")
HTTP_ACCESS_CONTROL_REQUEST_METHOD = request.environ.get("HTTP_ACCESS_CONTROL_REQUEST_METHOD")
if REQUEST_METHOD == "OPTIONS" and HTTP_ACCESS_CONTROL_REQUEST_METHOD:
request.environ["REQUEST_METHOD"] = HTTP_ACCESS_CONTROL_REQUEST_METHOD

方法二:修改bottle調用模塊的源碼

通過debug,我們可以發現,bottle.py調用wsgiref.simple_server模塊中,class WSGIRequestHandler(BaseHTTPRequestHandler)類的def get_environ(self)方法是用來設置request的environ變數

讓python bottle框架支持jquery ajax的RESTful風格的PUT和DELETE等請求

所以我們只需要在return env前添加處理代碼就可以了,具體見下面代碼

class WSGIRequestHandler(BaseHTTPRequestHandler):

server_version = "WSGIServer/" + __version__

def get_environ(self):
env = self.server.base_environ.copy
env["SERVER_PROTOCOL"] = self.request_version
env["SERVER_SOFTWARE"] = self.server_version
env["REQUEST_METHOD"] = self.command
if "?" in self.path:
path,query = self.path.split("?",1)
else:
path,query = self.path,""

env["PATH_INFO"] = urllib.parse.unquote(path, "iso-8859-1")
env["QUERY_STRING"] = query

host = self.address_string
if host != self.client_address[0]:
env["REMOTE_HOST"] = host
env["REMOTE_ADDR"] = self.client_address[0]

if self.headers.get("content-type") is None:
env["CONTENT_TYPE"] = self.headers.get_content_type
else:
env["CONTENT_TYPE"] = self.headers["content-type"]

length = self.headers.get("content-length")
if length:
env["CONTENT_LENGTH"] = length

for k, v in self.headers.items:
k=k.replace("-","_").upper; v=v.strip
if k in env:
continue # skip content length, type,etc.
if "HTTP_"+k in env:
env["HTTP_"+k] += ","+v # comma-separate multiple headers
else:
env["HTTP_"+k] = v

# 讓bottle框架支持jquery ajax的RESTful風格的PUT和DELETE等請求
if "REQUEST_METHOD" in env and env["REQUEST_METHOD"] == "OPTIONS" and "HTTP_ACCESS_CONTROL_REQUEST_METHOD" in env:
env["REQUEST_METHOD"] = env["HTTP_ACCESS_CONTROL_REQUEST_METHOD"]

return env

重新啟動python服務後,我們再次提交一下ajax,就可以發現提交成功了,檢查http請求頭,Request Method的值還是OPTIONS,但伺服器已經可以正常接收請求了

讓python bottle框架支持jquery ajax的RESTful風格的PUT和DELETE等請求

版權聲明:

本文由AllEmpty原創並發布於博客園,版權與博客園共同所有,歡迎轉載,未經本人同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。如有問題,可以通過1654937@qq.com聯繫我,非常感謝。

發表本編內容,要是為了和大家共同學習共同進步,有興趣的朋友可以加加Q群:327360708 ,大家一起探討。

更多內容,敬請觀注博客:http://www.cnblogs.com/EmptyFS/

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

「2017-05-25」WebForm母版頁
java函數式編程Lambda表達式的示例(一)
一個Monad的不嚴謹介紹
8.SparkContext與Application介紹
深入理解C中的String

TAG:科技優家 |

您可能感興趣

AI 框架使用排行:TensorFlow、Scikit Learn、IBM Watson、Spark-MLib、Keras
LinkedIn 開源 TonY:在 Hadoop 上運行 TensorFlow 的框架
LinkedIn 開源 TonY:在 Hadoop 上運行 TensorFlow 的框架
谷歌开源AdaNet:基于TensorFlow的AutoML框架
谷歌開源AdaNet:基於TensorFlow的AutoML框架
JFinal框架學習——EhCachePlugin
Electron 軟體框架漏洞影響眾多熱門應用:Skype、Signal、Slack、Twitch……
GitOps:一款基於Kubernetes的高速CI/CD框架
領英開源TonY:構建在Hadoop YARN上的TensorFlow框架
類Keras的PyTorch 深度學習框架——PyToune
筆記應用GoodNotes將推出macOS版本,基於Project Catalyst框架
Google 跨平台 UI 框架-Flutter
圍觀丨Google 的 Mobile UI 框架 Flutter Preview 1 發布!
資源 | 谷歌開源AdaNet:基於TensorFlow的AutoML框架
資源 | 領英開源TonY:構建在Hadoop YARN上的TensorFlow框架
Facebook旗下Oculus VR團隊開源了DeepFocus框架
基於Asyncio的Python微框架:Quart
微軟開源 Windows UX 框架:WPF、WinUI、Windows Forms
RPC框架實踐之:Apache Thrift
淺談Metasploit框架中的Payload