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中if __name__ == "__main__"详细解释
Oct 21 Python
用Python实现一个简单的线程池
Apr 07 Python
Python自动化部署工具Fabric的简单上手指南
Apr 19 Python
Python中使用支持向量机(SVM)算法
Dec 26 Python
Python管理Windows服务小脚本
Mar 12 Python
python搭建服务器实现两个Android客户端间收发消息
Apr 12 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
django实现web接口 python3模拟Post请求方式
Nov 19 Python
基于python读取.mat文件并取出信息
Dec 16 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
Mar 01 Python
详解python模块pychartdir安装及导入问题
Oct 22 Python
python爬取股票最新数据并用excel绘制树状图的示例
Mar 01 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
PHP抽象类 介绍
2012/06/13 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
javascript 定义初始化数组函数
2009/09/07 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
AngularJS基础 ng-readonly 指令简单示例
2016/08/02 Javascript
浅谈 Vue v-model指令的实现原理
2017/06/08 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
基于jQuery的表单填充实例
2017/08/22 jQuery
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
Vue中正确使用jQuery的方法
2017/10/30 jQuery
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
利用Bootstrap Multiselect实现下拉框多选功能
2019/04/08 Javascript
讲解python参数和作用域的使用
2013/11/01 Python
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
3个用于数据科学的顶级Python库
2018/09/29 Python
python实现ip代理池功能示例
2019/07/05 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
Python filter()及reduce()函数使用方法解析
2020/09/05 Python
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
2013/08/11 HTML / CSS
通过一张图教会你CSS3倒影的实现
2017/09/26 HTML / CSS
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
可靠的数据流传输TCP
2016/03/15 面试题
村干部培训班主持词
2014/03/28 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/10/28 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
女方离婚起诉书
2015/05/18 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
详解Python描述符的工作原理
2021/06/11 Python