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中用Ctrl+C终止多线程程序的问题解决
Mar 30 Python
python在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
python实现发送和获取手机短信验证码
Jan 15 Python
python数据结构链表之单向链表(实例讲解)
Jul 25 Python
Python PyQt5实现的简易计算器功能示例
Aug 23 Python
Python实现的远程登录windows系统功能示例
Jun 21 Python
python GUI模拟实现计算器
Jun 22 Python
Python 高效编程技巧分享
Sep 10 Python
Jupyter notebook 不自动弹出网页的解决方案
May 21 Python
python 定义函数 返回值只取其中一个的实现
May 21 Python
教你怎么用PyCharm为同一服务器配置多个python解释器
May 31 Python
python 判断文件或文件夹是否存在
Mar 18 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
用Flash图形化数据(二)
2006/10/09 PHP
php Memcache 中实现消息队列
2009/11/24 PHP
PHP 引用是个坏习惯
2010/03/12 PHP
php中利用post传递字符串重定向的实现代码
2011/04/21 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
php实现映射操作实例详解
2019/10/02 PHP
thinkPHP框架乐观锁和悲观锁实例分析
2019/10/30 PHP
javascript中的一些注意事项 更新中
2010/12/06 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
jQuery的事件预绑定
2016/12/05 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
使用DataTable插件实现异步加载数据
2017/11/19 Javascript
详解vue 命名视图
2019/08/14 Javascript
深入解析Python中的lambda表达式的用法
2015/08/28 Python
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
Django中自定义admin Xadmin的实现代码
2019/08/09 Python
如何基于python实现脚本加密
2019/12/28 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
基于python实现获取网页图片过程解析
2020/05/11 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
什么是URL
2015/12/13 面试题
final, finally, finalize的区别
2012/03/01 面试题
公司员工奖惩制度
2015/08/04 职场文书
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
2021/04/01 PHP