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结合shell查询google关键词排名的实现代码
Feb 27 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
May 11 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
Dec 07 Python
pandas每次多Sheet写入文件的方法
Dec 10 Python
python实现控制台打印的方法
Jan 12 Python
Python爬虫学习之获取指定网页源码
Jul 30 Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
Python SQLAlchemy库的使用方法
Oct 13 Python
pytorch--之halfTensor的使用详解
May 24 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 microtime获取浮点的时间戳
2010/02/21 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
Thinkphp5 自定义上传文件名的实现方法
2019/07/23 PHP
dwr spring的集成实现代码
2009/03/22 Javascript
非阻塞动态加载javascript广告实现代码
2010/11/17 Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
2012/01/15 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
用python 制作图片转pdf工具
2015/01/30 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
Python类装饰器实现方法详解
2018/12/21 Python
python实现用户名密码校验
2020/03/18 Python
详解CSS3选择器:nth-child和:nth-of-type之间的差异
2017/09/18 HTML / CSS
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
介绍一下Make? 为什么使用make
2013/12/08 面试题
单位刻章介绍信范文
2014/01/11 职场文书
社区母亲节活动记录
2014/03/06 职场文书
公司活动总结范文
2014/07/01 职场文书
县政协领导班子群众路线教育实践活动四风问题整改方案
2014/10/26 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技