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写的PHPMyAdmin暴力破解工具代码
Aug 06 Python
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 Python
python算法表示概念扫盲教程
Apr 13 Python
python enumerate函数的使用方法总结
Nov 15 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
Nov 29 Python
python迭代dict的key和value的方法
Jul 06 Python
Python3中urlencode和urldecode的用法详解
Jul 23 Python
解决python3 requests headers参数不能有中文的问题
Aug 21 Python
使用python去除图片白色像素的实例
Dec 12 Python
python中有关时间日期格式转换问题
Dec 25 Python
Django使用Celery加redis执行异步任务的实例内容
Feb 20 Python
Pygame框架实现飞机大战
Aug 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
重置版战役片段
2020/04/09 魔兽争霸
php google或baidu分页代码
2009/11/26 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
jQuery Validate表单验证深入学习
2015/12/18 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
谈一谈vue请求数据放在created好还是mounted里好
2020/07/27 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
Python3如何使用tabulate打印数据
2020/09/25 Python
python 制作本地应用搜索工具
2021/02/27 Python
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
amaze ui 的使用详细教程
2020/08/19 HTML / CSS
经典C++面试题一
2016/11/06 面试题
Linux的主要特性
2014/10/06 面试题
教育孩子心得体会
2014/01/01 职场文书
自荐信如何制作?
2014/02/21 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
财务审计整改报告
2014/11/06 职场文书
面试感谢信范文
2015/01/22 职场文书
发布会邀请函
2015/01/31 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL