让python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE等请求

栏目: jQuery · 发布时间: 6年前

内容简介:让python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE等请求

这两天在用 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等请求

 版权声明:

本文由AllEmpty原创并发布于博客园,版权与博客园共同所有,欢迎转载,未经本人同意必须保留此段声明,且在文章页面明显位置给出原文链接, 否则保留追究法律责任的权利 。如有问题,可以通过 1654937@qq.com  联系我,非常感谢。

发表本编内容, 是为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:327360708 ,大家一起探讨。

更多内容,敬请观注博客: http://www.cnblogs.com/EmptyFS/


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ActionScript 3.0 Cookbook

ActionScript 3.0 Cookbook

Joey Lott、Darron Schall、Keith Peters / Adobe Dev Library / 2006-10-11 / GBP 28.50

Well before Ajax and Microsoft's Windows Presentation Foundation hit the scene, Macromedia offered the first method for building web pages with the responsiveness and functionality of desktop programs......一起来看看 《ActionScript 3.0 Cookbook》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器