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中的Cookie模块使用
Jul 06 Python
python操作mysql数据库
Mar 05 Python
启动targetcli时遇到错误解决办法
Oct 26 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
Nov 14 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
Feb 07 Python
对numpy中数组元素的统一赋值实例
Apr 04 Python
Python3 使用cookiejar管理cookie的方法
Dec 28 Python
Python并发:多线程与多进程的详解
Jan 24 Python
简单的Python调度器Schedule详解
Aug 30 Python
使用python实现画AR模型时序图
Nov 20 Python
python颜色随机生成器的实例代码
Jan 10 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 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 eval函数用法总结
2012/10/31 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
jquery垂直公告滚动实现代码
2013/12/08 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
2017/04/12 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
100行代码实现一个vue分页组功能
2018/11/06 Javascript
微信小程序实现购物车代码实例详解
2019/08/29 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
2020/04/15 Javascript
jQuery实现移动端图片上传预览组件的方法分析
2020/05/01 jQuery
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[42:11]TNC vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python线程的两种编程方式
2015/04/14 Python
Python中类型关系和继承关系实例详解
2015/05/25 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
Python和Anaconda和Pycharm安装教程图文详解
2020/02/04 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
html5的canvas方法使用指南
2014/12/15 HTML / CSS
英国版MAC彩妆品牌:Illamasqua
2018/04/18 全球购物
报关专员求职信范文
2014/02/22 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
法制教育主题班会
2015/08/13 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript