Python &引用;警告:龙卷风。入口:405“;从两个位置停止POST时出错";“本地主机”;及;文件://“;起源
这是一个与这个问题()非常相似的问题,但是这个问题的简单答案仍然不起作用。在侧栏中还有很多很多类似的问题------>与龙卷风无关,也没有为我提供解决方案 现在我正在OSX上使用Firefox 我的龙卷风代码如下: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"
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哪些选项?我不知道如何遵循您的建议。@javadbadef 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()