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抓取模板之家的CSS模板
Mar 16 Python
python决策树之CART分类回归树详解
Dec 20 Python
python逆序打印各位数字的方法
Jun 25 Python
使用Python和Prometheus跟踪天气的使用方法
May 06 Python
python RC4加密操作示例【测试可用】
Sep 26 Python
python类中super() 的使用解析
Dec 19 Python
15行Python代码实现免费发送手机短信推送消息功能
Feb 27 Python
Python中常见的数制转换有哪些
May 27 Python
基于python模拟TCP3次握手连接及发送数据
Nov 06 Python
python函数超时自动退出的实操方法
Dec 28 Python
Python实现简单的2048小游戏
Mar 01 Python
教你利用python实现企业微信发送消息
May 23 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
杏林同学录(七)
2006/10/09 PHP
提高php运行速度的一些小技巧分享
2012/07/03 PHP
PHP队列用法实例
2014/11/05 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
jquery中animate动画积累的解决方法
2013/10/05 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
详解小程序横屏方案对比
2020/06/28 Javascript
Vue-cli打包后如何本地查看的操作
2020/09/02 Javascript
python使用super()出现错误解决办法
2017/08/14 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
音乐表演专业毕业生求职信
2013/10/14 职场文书
办公室保洁员岗位职责
2013/12/02 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
《美丽的彩虹》教学反思
2014/02/25 职场文书
《狼和小羊》教学反思
2014/04/20 职场文书
2014年科普工作总结
2014/12/06 职场文书
2015年教学工作总结
2015/04/02 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
mysql联合索引的使用规则
2021/06/23 MySQL
SQLServer中exists和except用法介绍
2021/12/04 SQL Server
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python
Python保存并浏览用户的历史记录
2022/04/29 Python