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写xml文件的操作实例
Oct 05 Python
Python语言的面相对象编程方式初步学习
Mar 12 Python
Python使用dis模块把Python反编译为字节码的用法详解
Jun 14 Python
python 内置函数filter
Jun 01 Python
python 判断是否为正小数和正整数的实例
Jul 23 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
Django模板语言 Tags使用详解
Sep 09 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
Jul 28 Python
python获取整个网页源码的方法
Aug 03 Python
详解pycharm自动import所需的库的操作方法
Nov 30 Python
python实现图片转字符画
Feb 19 Python
如何使用python包中的sched事件调度器
Apr 30 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
mysql5详细安装教程
2007/01/15 PHP
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
php set_time_limit()函数的使用详解
2013/06/05 PHP
php如何连接sql server
2015/10/16 PHP
Javascript 二维数组
2009/11/26 Javascript
jQuery DOM操作小结与实例
2010/01/07 Javascript
js parsefloat parseint 转换函数
2010/01/21 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
javascript常用代码段搜集
2014/12/04 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
javascript实现很浪漫的气泡冒出特效
2020/09/05 Javascript
jquery实现定时自动轮播特效
2015/12/10 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
2016/11/01 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
Python中operator模块的操作符使用示例总结
2016/06/28 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
Python之用户输入的实例
2018/06/22 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
Python 如何提高元组的可读性
2019/08/26 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
公司企业表扬信
2014/01/11 职场文书
五一劳动节活动总结
2015/02/09 职场文书
党小组意见范文
2015/06/08 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle
Pygame Time时间控制的具体使用详解
2021/11/17 Python
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫
vue3不同环境下实现配置代理
2022/05/25 Vue.js