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脚本将文字转换为图片的实例分享
Aug 29 Python
深入解析Python中的线程同步方法
Jun 14 Python
详解python如何调用C/C++底层库与互相传值
Aug 10 Python
Python中的函数作用域
May 07 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
Nov 29 Python
python列表list保留顺序去重的实例
Dec 14 Python
Python中拆分字符串的操作方法
Jul 23 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
Aug 08 Python
python实现翻译word表格小程序
Feb 27 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
Mar 24 Python
PyInstaller运行原理及常用操作详解
Jun 13 Python
pandas实现导出数据的四种方式
Dec 13 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
使用VisualStudio开发php的图文设置方法
2010/08/21 PHP
php中使用sftp教程
2015/03/30 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
JavaScript中的关联数组问题
2015/03/04 Javascript
js实现获取div坐标的方法
2015/11/16 Javascript
Bootstrap每天必学之按钮(Button)插件
2016/04/25 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
Vue实现百度下拉提示搜索功能
2017/06/21 Javascript
jQuery使用ajax_动力节点Java学院整理
2017/07/05 jQuery
javascript基本常用排序算法解析
2017/09/27 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
关于layui 弹出层一闪而过就消失的解决方法
2019/09/09 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
Python实现简单过滤文本段的方法
2017/05/24 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
2018/06/13 Python
python处理数据,存进hive表的方法
2018/07/04 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
关于numpy数组轴的使用详解
2019/12/05 Python
python实现与redis交互操作详解
2020/04/21 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
铭立家具面试题
2012/12/06 面试题
几道Web/Ajax的面试题
2016/11/05 面试题
总监职责范文
2013/11/09 职场文书
大学毕业生最详细的自我评价分享
2013/11/18 职场文书
内容编辑个人求职信
2013/12/10 职场文书
我的网上商城创业计划书
2013/12/26 职场文书
申论倡议书范文
2014/05/13 职场文书
个人校本研修方案
2014/05/26 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
八年级数学教学反思
2016/02/17 职场文书
最新的离婚协议书范本!
2019/07/02 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS