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练习程序批量修改文件名
Jan 16 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
Feb 19 Python
Python中遇到的小问题及解决方法汇总
Jan 11 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
Jun 28 Python
Python Process多进程实现过程
Oct 22 Python
DJANGO-URL反向解析REVERSE实例讲解
Oct 25 Python
pytorch sampler对数据进行采样的实现
Dec 31 Python
在Mac中PyCharm配置python Anaconda环境过程图解
Mar 11 Python
Python实现Canny及Hough算法代码实例解析
Aug 06 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
Oct 15 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 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
PHP异常处理Exception类
2015/12/11 PHP
php while循环控制的简单实例
2016/05/30 PHP
JavaScript window.setTimeout() 的详细用法
2009/11/04 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
2015/12/02 Javascript
jQuery动画效果实现图片无缝连续滚动
2016/01/12 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
Vue-CLI与Vuex使用方法实例分析
2020/01/06 Javascript
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
[59:00]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第一场 3月7日
2021/03/11 DOTA
关于Python的一些学习总结
2018/05/25 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
python程序变成软件的实操方法
2019/06/24 Python
详解Python3定时器任务代码
2019/09/23 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
css3给背景图片加颜色遮罩的方法
2019/11/05 HTML / CSS
html5绘制时钟动画
2014/12/15 HTML / CSS
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
什么样的创业计划书可行性高?
2014/02/01 职场文书
广告传媒专业应届生求职信
2014/03/01 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
应聘教师自荐信
2015/03/26 职场文书
初中重阳节活动总结
2015/05/05 职场文书
上班迟到检讨书范文
2015/05/06 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
天河观后感
2015/06/11 职场文书
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
javascript对象3个属性特征
2021/11/17 Javascript