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实现baidu hi自动登录的代码
Feb 10 Python
Python break语句详解
Mar 11 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
Jan 10 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
Feb 07 Python
Python字符串的常见操作实例小结
Apr 08 Python
浅谈django框架集成swagger以及自定义参数问题
Jul 07 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 Python
python进度条显示之tqmd模块
Aug 22 Python
python脚本第一行如何写
Aug 30 Python
用Python远程登陆服务器的步骤
Apr 16 Python
在Python中如何使用yield
Jun 07 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同时支持GIF、png、JPEG
2006/10/09 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
js中this用法实例详解
2015/05/05 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
JavaScript jquery及AJAX小结
2016/01/24 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
jQuery属性选择器用法示例
2016/09/09 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
php register_shutdown_function函数详解
2017/07/23 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
python实现从ftp服务器下载文件的方法
2015/04/30 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
对python使用http、https代理的实例讲解
2018/05/07 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
详解python的变量缓存机制
2021/01/24 Python
学生发电厂实习自我鉴定
2013/09/22 职场文书
大学生自我鉴定范文
2013/12/28 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
离婚上诉状范文
2015/05/23 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
请病假条范文
2015/08/17 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android
Java中的随机数Random
2022/03/17 Java/Android
python Tkinter模块使用方法详解
2022/04/07 Python