python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法


Posted in Python onMay 24, 2017

这两天在用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' 参数

python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法

而Request Method的值则变为:'REQUEST_METHOD' (45248088) = 'OPTIONS' ,难怪jquery的ajax方式提交,python bottle框架设定的路由一直接收不到

python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法

知道问题所在要改造就好多了

方法一:直接在勾子里添加下面代码,改变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方法

以上这篇python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

原文地址:http://www.cnblogs.com/EmptyFS/p/6895479.html

Python 相关文章推荐
python Django连接MySQL数据库做增删改查
Nov 07 Python
python回调函数的使用方法
Jan 23 Python
Python正则表达式的使用范例详解
Aug 08 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
windows环境下tensorflow安装过程详解
Mar 30 Python
python增加矩阵维度的实例讲解
Apr 04 Python
python使用folium库绘制地图点击框
Sep 21 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
Jul 12 Python
解决pycharm 安装numpy失败的问题
Dec 05 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
python爬虫数据保存到mongoDB的实例方法
Jul 28 Python
python中spy++的使用超详细教程
Jan 29 Python
Python生成密码库功能示例
May 23 #Python
Python计算两个日期相差天数的方法示例
May 23 #Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
May 23 #Python
浅谈django model的get和filter方法的区别(必看篇)
May 23 #Python
Python常用内置模块之xml模块(详解)
May 23 #Python
Python使用PyCrypto实现AES加密功能示例
May 22 #Python
django+js+ajax实现刷新页面的方法
May 22 #Python
You might like
smarty实例教程
2006/11/19 PHP
PHP 开发工具
2006/12/06 PHP
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
理解javascript中的闭包
2017/01/11 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
js指定日期增加指定月份的实现方法
2018/12/19 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
17个Python小技巧分享
2015/01/23 Python
对于Python中线程问题的简单讲解
2015/04/03 Python
python里运用私有属性和方法总结
2019/07/08 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
创建Shapefile文件并写入数据的例子
2019/11/26 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
python模拟实现分发扑克牌
2020/04/22 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
建筑专业自我鉴定
2013/10/22 职场文书
会计主管岗位职责范文
2013/11/08 职场文书
幼儿园美术教学反思
2014/01/31 职场文书
会计专业毕业自荐书范文
2014/02/08 职场文书
《晏子使楚》教学反思
2014/02/08 职场文书
团日活动总结范文
2014/04/25 职场文书
社区党员公开承诺书
2014/08/30 职场文书