Python Tornado之跨域请求与Options请求方式


Posted in Python onMarch 28, 2020

问题背景

公司的项目是前后端分离,前端Vue+后端JavaSpringBoot为主,部分功能是PythonTornado,那么需要支持一个是跨域以及Options请求。

Option请求

只需要跟处理get一样处理options请求就可以了。vue一般需要访问options方法, 如果报错则很难继续,所以只要通过就行了,当然需要其他逻辑就自己控制。

#COM串口
class SerialHandler(BaseHandler):
 #处理GET请求
 def get(self):
  self.write('血压监测结果为:')
  #省略其他逻辑
 #处理OPTIONS请求
 def options(self):
  #返回方法1
  #self.set_status(204)
  #self.finish()
  #返回方法2
  self.write('{"errorCode":"00","errorMessage","success"}')

跨域请求

既然是前后端分离,那就肯定会遇到cros跨域请求难题,可以设置一个BaseRequest,然后继承即可。

class BaseHandler(tornado.web.RequestHandler):
 #blog.csdn.net/moshowgame 解决跨域问题
 def set_default_headers(self):
  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',#'*')
      'authorization, Authorization, Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Headers, X-Requested-By, Access-Control-Allow-Methods')

补充知识:Python之flask框架配置接口,处理跨域

Flask框架介绍

Flask是当下流行的Web框架,它是用Python实现的。

Flask显著的特点是:它是一个“微”框架。”微”意味着Flask旨在保持核心的简单,但同时又易于扩展。默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask的这些特性,使得它在Web开发方面变得非常流行。

Flask安装

通过python的pip包管理工具进行安装,python3之后下载python也会自动带出pip。

验证pip是否安装:打开命令行直接输入pip,如果出现下面的显示则表示已安装

Python Tornado之跨域请求与Options请求方式

安装flask:

pip install flask

Flask使用

import flask,json #引入flask框架
server = flask.Flask(__name__) #实例化server,把当前这个python文件当做一个服务,__name__代表当前这个python文件
@server.route('/index',methods=['get']) #'index'是接口路径,methods不写,则默认get请求
#装饰器下面的函数为一个接口
def index():
 res = {'msg':'接口返回信息','code':'0000'}
 return json.dumps(res,ensure_ascii=False)
 #json.dumps序列化时对中文默认使用ascii编码,想输出真正的中文需要指定ensure_ascii=False
#启动服务
server.run(port=8080,debug=True,host='0.0.0.0') 
#debug=True改了代码后,不用重启,它会自动重启
#'host'='0.0.0.0'别人可以通过IP访问

结果:

Python Tornado之跨域请求与Options请求方式

前端请求数据

<!doctype html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>python接口测试</title>
 <script src="http://static.wanlianjin.com/data/m/wlcs/js/nocar/jquery-1.7.2.min.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
 <button onclick="getMessage()">点击获取数据</button>
 <script>
 function getMessage(){
 $.ajax({
 url:'http://100.39.8.55:8080/index',
 type:'GET',
 dataType:'json',
 succrss:(data)=>{
  console.log(data)
 }
 })
 }
 </script>
</body>
</html>

结果:

Python Tornado之跨域请求与Options请求方式

因协议、域名、端口的不同,接口请求的数据需要进行跨域

解决方法如下:

1.JSONP

将dataType改为jsonp,仅用于GET方法

Python Tornado之跨域请求与Options请求方式

注意:

请求到数据是一个纯Json格式的话,是不能用Jsonp方式调用的,支持Jsonp方式的url返回的一定是js脚本,一般是一句函数调用,请注意报的错是callback=,=号后面的就是你得到的。callback是客户端页面定义的函数名,JSONP方式会在返回的Javascript代码里面调用这个函数,JSON数据是当做参数传入方法的而不是直接返回一个json。这个地址不支持jsonp,请求来的数据是json,浏览器要把当做Javascript来解析,遇到 “:” 就报错了。如果这个地址支持JSONP,应该返回Javascript代码,在代码里面调用callback函数才对。

修改客户端和服务端代码:

客户端:

<!doctype html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>python接口测试</title>
 <script src="http://static.wanlianjin.com/data/m/wlcs/js/nocar/jquery-1.7.2.min.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
 <button onclick="getMessage()">点击获取数据</button>
 <script>
 function jsonpCallback(data) {
  console.log("jsonpCallback: " + JSON.parse(data).name)
 }
 function getMessage(){
 $.ajax({
 url:'http://100.39.8.55:8080/index?callback=?',
 type:'GET',
 dataType:'jsonp',
 crossDomain:true,
 contentType: "application/jsonp;",
 // jsonp 字段含义为服务器通过什么字段获取回调函数的名称
   jsonp: 'callback',
   // 声明本地回调函数的名称,jquery 默认随机生成一个函数名称
   jsonpCallback: 'jsonpCallback',
 success: function(data) {
    console.log("ajax success callback: " + JSON.parse(data).name)
   },
   error: function(jqXHR, textStatus, errorThrown) {
    console.log(textStatus + ' ' + errorThrown);
   }
 })
 }
 </script>
</body>
</html>

服务端:

import flask,json #引入flask框架
server = flask.Flask(__name__) #实例化server,把当前这个python文件当做一个服务,__name__代表当前这个python文件
@server.route('/index',methods=['get']) #'index'是接口路径,methods不写,则默认get请求
#装饰器下面的函数为一个接口
def index():
 data = '{"name":"xiaoming","age":"15"}'
 callback = 'jsonpCallback'
 jsonp = callback + '(' + json.dumps(data) + ')'
 return jsonp #返回的是代码字样
#启动服务
server.run(port=8080,debug=True,host='0.0.0.0') 
#debug=True改了代码后,不用重启,它会自动重启
#'host'='0.0.0.0'别人可以通过IP访问

结果:

Python Tornado之跨域请求与Options请求方式

2.Flask-CORS

安装:pip install flask-cors

服务端代码:

import flask,json #引入flask框架
from flask_cors import CORS
server = flask.Flask(__name__) #实例化server,把当前这个python文件当做一个服务,__name__代表当前这个python文件
# r'/*' 是通配符,让本服务器所有的URL 都允许跨域请求
CORS(server, resources=r'/*')
@server.route('/index',methods=['get']) #'index'是接口路径,methods不写,则默认get请求
#装饰器下面的函数为一个接口
def index():
 data = {"name":"xiaoming","age":"15"}
 return json.dumps(data,ensure_ascii=False)

#启动服务
server.run(port=8080,debug=True,host='0.0.0.0') 
#debug=True改了代码后,不用重启,它会自动重启
#'host'='0.0.0.0'别人可以通过IP访问

以上这篇Python Tornado之跨域请求与Options请求方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python操作数据库之sqlite3打开数据库、删除、修改示例
Mar 13 Python
python 读写txt文件 json文件的实现方法
Oct 22 Python
Python中最大最小赋值小技巧(分享)
Dec 23 Python
Python实现简易Web爬虫详解
Jan 03 Python
Python迭代器与生成器用法实例分析
Jul 09 Python
Python合并同一个文件夹下所有PDF文件的方法
Mar 11 Python
Django框架模板的使用方法示例
May 25 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
Jan 18 Python
Python调用百度OCR实现图片文字识别的示例代码
Jul 17 Python
彻底搞懂python 迭代器和生成器
Sep 07 Python
使用Python Tkinter实现剪刀石头布小游戏功能
Oct 23 Python
python​格式化字符串
Apr 20 Python
关于python 跨域处理方式详解
Mar 28 #Python
对python中各个response的使用说明
Mar 28 #Python
基于Django signals 信号作用及用法详解
Mar 28 #Python
浅谈django 模型类使用save()方法的好处与注意事项
Mar 28 #Python
Django 实现对已存在的model进行更改
Mar 28 #Python
浅谈Django QuerySet对象(模型.objects)的常用方法
Mar 28 #Python
django使用F方法更新一个对象多个对象字段的实现
Mar 28 #Python
You might like
广播爱好者需要了解的天线知识
2021/03/01 无线电
在PHP中使用与Perl兼容的正则表达式
2006/11/26 PHP
php auth_http类库进行身份效验
2009/03/19 PHP
thinkphp3.2点击刷新生成验证码
2016/02/16 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
laravel框架实现敏感词汇过滤功能示例
2020/02/15 PHP
PHP生成图表pChart的示例解析
2020/07/31 PHP
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
firefox下input type=&quot;file&quot;的size是多大
2011/10/24 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
解决vue里碰到 $refs 的问题的方法
2017/07/13 Javascript
VUE实现一个分页组件的示例
2017/09/13 Javascript
vuex实现购物车功能
2020/06/28 Javascript
python编写暴力破解FTP密码小工具
2014/11/19 Python
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
Python装饰器用法实例总结
2018/05/26 Python
基于python历史天气采集的分析
2019/02/14 Python
Python可以用来做什么
2020/11/23 Python
得到Class的三个过程是什么
2012/08/10 面试题
人力资源管理专业应届生求职信
2013/09/28 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
中班开学寄语
2014/04/04 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
先进党员事迹材料
2014/12/24 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers