Python &引用;警告:龙卷风。入口:405“;从两个位置停止POST时出错";“本地主机”;及;文件://“;起源

Python &引用;警告:龙卷风。入口:405“;从两个位置停止POST时出错";“本地主机”;及;文件://“;起源,python,post,tornado,http-status-code-405,Python,Post,Tornado,Http Status Code 405,这是一个与这个问题()非常相似的问题,但是这个问题的简单答案仍然不起作用。在侧栏中还有很多很多类似的问题------>与龙卷风无关,也没有为我提供解决方案 现在我正在OSX上使用Firefox 我的龙卷风代码如下: import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def post(self): self.write("Hello, world"

这是一个与这个问题()非常相似的问题,但是这个问题的简单答案仍然不起作用。在侧栏中还有很多很多类似的问题------>与龙卷风无关,也没有为我提供解决方案

现在我正在OSX上使用Firefox

我的龙卷风代码如下:

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def post(self):
        self.write("Hello, world")
    get = post # <--------------

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
如果有帮助的话,我的ajax代码如下所示:

//tested and functional ajax code, for ease of testing
U = {};
U.Ajax = {};
U.Ajax.send = function(getOrPost, url, dataType, data) {
    return new Promise( function(resolve, reject) {
        var request = new XMLHttpRequest();

        if(getOrPost == "GET") {
            request.responseType = dataType || "text";
            request.open("GET", url);   
        }
        else {//getOrPost == "POST"
            request.open("POST", url);  
            request.setRequestHeader('Content-type', dataType)
        }


        request.onload = function() {
            if (request.status >= 200 && request.status < 400) {
                console.log("ajax", request.status+" "+url, request);

                resolve(request);               

            } else {
                request.onerror();
            }
        };

        request.onerror = function() {
            var err = "include src '"+url+"' does not exist";
            console.log(err)
            reject(err)
        };

        try {
            request.send(data); 
        }
        catch(e) {
            var err = "NS_ERROR_DOM_BAD_URI: Access to restricted URI '"+url+"' denied";
            console.log(err)
            reject(err)
        }


    });
}

U.Ajax.get = function(url, responseType) {
    return U.Ajax.send("GET", url, responseType);
}

U.Ajax.post = function(url, contentType, data) {
    return U.Ajax.send("POST", url, contentType, data);
}
//已测试且功能强大的ajax代码,便于测试
U={};
U.Ajax={};
U.Ajax.send=函数(getOrPost、url、数据类型、数据){
返回新承诺(功能(解决、拒绝){
var request=new XMLHttpRequest();
if(getOrPost==“GET”){
request.responseType=数据类型| |“text”;
打开(“获取”,url);
}
else{//getOrPost==“POST”
打开(“POST”,url);
request.setRequestHeader('Content-type',dataType)
}
request.onload=函数(){
如果(request.status>=200&&request.status<400){
log(“ajax”,request.status+“”+url,request);
解决(请求);
}否则{
request.onerror();
}
};
request.onerror=函数(){
var err=“include src'”+url+“'不存在”;
console.log(错误)
拒绝(错误)
};
试一试{
请求发送(数据);
}
捕获(e){
var err=“NS\u ERROR\u DOM\u BAD\u URI:访问受限URI'”+url+“'denied'”;
console.log(错误)
拒绝(错误)
}
});
}
U.Ajax.get=函数(url,responseType){
返回U.Ajax.send(“GET”、url、responseType);
}
U.Ajax.post=函数(url、contentType、数据){
返回U.Ajax.send(“POST”、url、contentType、data);
}
编辑::如果我将tornado代码更改为等同于GET POST和OPTION,它会工作,但不正确

class MainHandler(tornado.web.RequestHandler):
    def post(self):
        print(self.request)
    get = options = post # <--------------
class MainHandler(tornado.web.RequestHandler):
def post(自我):
打印(自我请求)
获取=选项=发布#
我不再收到错误,但当我打印self.request时,我的标题似乎以某种方式设置为“选项”

这将是CORS的飞行前请求

:

CORS飞行前请求是检查CORS协议是否被理解的CORS请求

它是一个使用两个HTTP请求头的选项请求:
访问控制请求方法
访问控制请求头
,以及原始头

需要时,浏览器会自动发出飞行前请求;在正常情况下,前端开发人员不需要自己编写这样的请求

对于跨域AJAX请求,浏览器首先需要与远程服务器检查是否希望使用特定方法和/或特定请求头接受请求


这是通过选项请求实现的。当服务器在响应中发出信号,表示客户端希望发出的实际请求是可接受的时,客户端就会发出该请求。

最近,我遇到了同样的问题。我用以下代码解决了这个问题:

import tornado.ioloop 
import tornado.web

class MainHandler(tornado.web.RequestHandler): 
    def set_default_headers(self):
        print('set headers!!')
        self.set_header('Access-Control-Allow-Origin', '*')
        self.set_header('Access-Control-Allow-Headers', '*')
        self.set_header('Access-Control-Max-Age', 1000)
        self.set_header('Content-type', 'application/json')
        self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
        self.set_header('Access-Control-Allow-Headers',
                        'Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Headers, X-Requested-By, Access-Control-Allow-Methods')
    def OPTIONS(self):
        pass

application = tornado.web.Application([ (r"/", MainHandler), ])    
if name == "main":application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

您使用的是什么javascript库
U.Ajax
?不,它几乎是从这里复制过来的,找到了一个半解决方案,更新了问题“但是当我打印self.request时,我的标题似乎以某种方式设置为“选项”–。。。这可能只是意味着您正在查看此类跨域请求所需的飞行前请求。您最好检查OPTIONS请求是否从浏览器发送(使用crhome的开发者工具或类似工具)。我认为这是javascript的问题。这对我来说很有效,但我必须将选项设置为小写。对于其他读者:请小心包含
内容类型]:“application json”
:这可能不适合您的应用程序app@RayB哪些选项?我不知道如何遵循您的建议。@javadba
def options(self):
import tornado.ioloop 
import tornado.web

class MainHandler(tornado.web.RequestHandler): 
    def set_default_headers(self):
        print('set headers!!')
        self.set_header('Access-Control-Allow-Origin', '*')
        self.set_header('Access-Control-Allow-Headers', '*')
        self.set_header('Access-Control-Max-Age', 1000)
        self.set_header('Content-type', 'application/json')
        self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
        self.set_header('Access-Control-Allow-Headers',
                        'Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Headers, X-Requested-By, Access-Control-Allow-Methods')
    def OPTIONS(self):
        pass

application = tornado.web.Application([ (r"/", MainHandler), ])    
if name == "main":application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()