flask框架初学-11-解决跨域问题

2023-05-16

在前面的学习中,我们都是在本地起服务,再在本地访问资源及界面,但是实际当中都是开启多台服务器,提供给局域网外的用户访问。这就牵涉到了跨域问题,跨域问题来源于同源策略,同源策略是一种约定,是浏览器最核心以及最基本的安全功能,它要求在使用JavaScript的浏览器中,只有协议+主机名+端口号(如存在)相同的两个URL才能互相访问,这样的限定可以减少恶意文档以及可能被攻击的媒介。但是却限定了浏览器只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。本章将会介绍如何解决这个问题。

目前解决跨域问题常见的方法有以下四种:

1、响应头添加Header允许访问

2、ajax跨域请求方案

3、httpClient内部转发

4、使用接口网关-nginx、springcloud zuul

5、跨域资源共享(CROS)

5、后端处理,使用第三方扩展 https://pypi.org (推荐)

解决方法一:响应头添加Header允许访问

response = make_response()
# 允许接收所有Origin
response.header['Access-Control-Allow-Origin']='*'
# 允许接收GET,POST类型的URL
response.header['Access-Control-Allow-Methods']='GET,POST'
# 允许接收x-request-with,Content-type头部信息的URL
response.header['Access-Control-Allow-Headers']='x-request-with,Content-type'
return response

解决方法二:ajax跨域请求方案

优点:兼容性强,适用于所有浏览器

缺点:

  • 没有关于调用错误的处理
  • 只支持GET请求,不支持POST以及大数据量的请求,也无法拿到相关的返回头,状态码等数据
  • callback参数恶意注入,可能会造成xss漏洞
  • 无法设置资源访问权限

用法:
1、dataType改为jsonp

2、jsonp:“jsonpCallback”—>发送到后端实际为http://a.a.com/a/FromSerclet?username=644064&jsonpCallback=jQueryXXX

3、后端获取get请求中的jsonCallback

4、构造回调结构

5、后端处理,使用第三方扩展 https://pypi.org (推荐)

前端:

$.ajax({
    type: "GET",
    async: false,
    url: "http://a.a.com/a/FromSerclet?username=644064",
    dataType:"jsonp", //数据类型为jsonp
    jsonp: "jsonpCallback",  //服务端用于修改callback调用的function名的参数
    success: function(data){
        alert(data["username"]);
        ),
        error: function(){
            alert('fail');
    }
});

后端:

jsonpCallback = request.args.get("jsonCallback");

解决方法五:后端处理,使用第三方扩展 https://pypi.org (推荐)

1、安装 pip install flask-cors
2、exts中定义

cors = CORS()

3、初始化

def create_app():
     ...
     cors.init_app(app=app,supports_credentials=True)

Example

exts下的init.py

from flask_caching import Cache
from flask_cors import CORS
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()

db = SQLAlchemy()
cors = CORS()
cache = Cache()

app下的init.py

from flask import Flask
from app.apis.news_api import news_bp
from app.apis.user_api import user_bp
from exts import db, cors, cache
from settings import DevelopmentConfig

config = {
    'CACHE_TYPE': 'redis',
    'CACHE_REDIS_HOST': '127.0.0.1',
    'CACHE_REDIS_PORT': 6379
}

def create_app():
    app = Flask(__name__,static_folder='../static',template_folder='../templates')
    app.config.from_object(DevelopmentConfig)

    db.init_app(app=app)
    cors.init_app(app=app,supports_credentials=True)
    cache.init_app(app=app,config=config)
    app.register_blueprint(news_bp)
    app.register_blueprint(user_bp)

    return app

本地news_api.py

from flask import Blueprint, app, g
from flask_restful import Api, Resource, fields, marshal_with, reqparse, marshal

from app.models.news_model import NewsType, News

news_bp = Blueprint('news',__name__,url_prefix='/news')
api = Api(news_bp)

# 新闻类型输出格式
types_fields = {
    'id': fields.Integer,
    'name': fields.String(attribute='type_name')
}

# 新闻类型api
class NewsTypeApi(Resource):
    @marshal_with(types_fields)
    def get(self):
        types = NewsType.query.all()
        # print(app.url_map)
        return types
    
    
api.add_resource(NewsTypeApi,'/types')

另一台电脑调用接口数据并展示

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
</head>
<style>
    #container{
        border: 1px solid red;
    }
    #container p{
        font-size: 20px;
        color: deepskyblue;
        font-weight: bold;
    }
</style>
<body>
    <div id="container">

    </div>
</body>
<script>
    $(function(){
        url = 'http://IP地址:5000/news/types';
        $.get(url,function(data){
          //  console.log(data);
          //  console.log(typeof data);
            for (i = 0; i < data.length; i++){
              //  console.log(data[i].name)
                $('#container').append('<p>'+data[i].name+'</p>')
            }
        });
    });
</script>
</html>

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flask框架初学-11-解决跨域问题 的相关文章

随机推荐

  • oneindex +OneDrive搭建私人网盘

    一 xff1a 下载oneindex安装包 GitHub链接一 xff1a https github com donwa oneindexGitHub链接二 xff1a https github com 0oVicero0 oneindex
  • 虚拟机+Ubuntu 安装教程

    准备 下载Ubuntu镜像安装vmware workstation player 附 xff1a 1 Ubuntu镜像下载地址 xff1a https ubuntu com download desktop 2 vmware worksta
  • PicGo + 阿里云OSS 搭建图床工具(附Typora设置)

    PicGo 43 阿里云OSS 搭建图床工具 xff08 附Typora设置 xff09 一 xff1a 准备 点击下载PicGo 安装包 点击下载Typora安装包 开通阿里云OSS对象存储服务 这里我开通的是1年40GB xff0c 9
  • Python107(石头剪刀布06—电脑随机出拳)

  • mysql5.5开启ssl_在MySQL中,启用SSL

    问题描述 我正在运行Ubuntu Server 12 04 xff0c 并且想启用与MySQL的SSL连接 我已经使用OpenSSL生成了以下密钥 证书文件 xff1a ca cert pem server cert pem server
  • 如何设计一个锂电池充电电路(TP4056)

    这个是个单节18650锂电池的充电模块 xff0c 这个是个18650的锂电池 xff0c 18指的是它的直径是18mm xff0c 65指的是它的高度为65mm 这个18650电池的标称电压是3 7V xff0c 电池充满时电压为4 2V
  • ajax请求携带自定义请求头header(跨域和同域)

    1 ajax跨域请求 xff08 无cookie 无header xff09 案例 xff08 java xff09 xff08 1 xff09 启动一个java web项目 xff0c 配置两个域名 xff08 host xff09 cz
  • VSCode如何直接打开html文件

    用VSCode的同行越来越多 xff0c 但是有人功能还不太熟练 xff0c 是不是有点小尴尬啊哈哈 功能实现 xff1a 直接打开Html 操作步骤 xff1a 快捷键 Ctrl 43 shift 43 x 打开vscode的应用商店 x
  • ubuntu18.04微信安装

    先安装一下wine wget O https deepin wine i m dev setup sh sh 若出现不能解析https的问题 xff0c 则 echo 39 nameserver 8 8 8 8 39 gt gt etc r
  • rstudio r语言_R语言的重大更新带来了巨大的变化

    rstudio r语言 用于统计计算的R语言版本4 0 0已发布 xff0c 其中对语言的语法以及与错误检查和长向量有关的功能进行了更改 升级版于4月24日发布 R 4 0 0的源代码可从cran r project org访问 R是一个G
  • 【千律】C++基础:编写实现自定义的字符串拼接函数

    include lt iostream gt using namespace std char strconnect char str 1 char str 2 int len 1 int len 2 初始化字符串 str 1 的 int
  • OpenWrt路由开启DDNS+端口转发进行外网访问

    OpenWrt路由开启DDNS 43 端口转发进行外网访问 xff08 LuCI界面实现 xff09 开篇一 准备工作二 开机 xff01 三 连接 结尾 开篇 本篇适用于一切装有OpenWrt系统的路由器 软路由 xff0c 只要你保证有
  • c语言概念题

    任何表达式语句都是表达式加分号组成的 C语言程序是从源文件的第一条语句开始执行的 xff08 x 从main函数开始执行 C 语言中的变量名区分大小写 运算符优先级以及结合方式 1 初等运算符 xff1a xff08 xff09 取结构体变
  • c 语言概念题【最全整理】

    任何表达式语句都是表达式加分号组成的 C语言程序是从源文件的第一条语句开始执行的 xff08 x 从main函数开始执行 C 语言中的变量名区分大小写 运算符优先级以及结合方式 1 初等运算符 xff1a xff08 xff09 取结构体变
  • python中变量的命名以及使用

    一 变量的概念 变量名只有在第一次出现的时候 xff0c 才是定义变量 当再次出现时 xff0c 不是定义变量 xff0c 而是直接使用之前定义的变量 1 变量命名 1 xff09 命名的规范性 变量名可以包括字母 数字 下划线 xff0c
  • WSL 导入导出迁移 相关命令

    wsl export Ubuntu D Ubuntu tar wsl unregister Ubuntu wsl import Ubuntu D Ubuntu D Ubuntu tar version 2 ubuntu exe config
  • 2019年3月PAT甲级认证经验教训总结~~~路还很长,慢慢来

    今天的PAT认证是我人生中的第二次算法考试 xff0c 第一次是六年前大一学习 C 语言时学校举行的算法比赛 跟第一次一样 xff0c 这次考得也非常失败 xff0c 只做出来前两道题 去年七月份辞职跨专业考研 xff0c 选了自己感兴趣的
  • ubuntu系统代理配置

    vim etc apt apt conf Acquire http proxy http username password 64 192 168 1 1 8080
  • Linux 软件包管理常用命令

    安装软件包 apt get install packagename 删除软件包 apt get remove packagename 更新软件包列表 apt get update 升级有可用更新的系统 xff08 慎用 xff09 apt
  • flask框架初学-11-解决跨域问题

    在前面的学习中 xff0c 我们都是在本地起服务 xff0c 再在本地访问资源及界面 xff0c 但是实际当中都是开启多台服务器 xff0c 提供给局域网外的用户访问 这就牵涉到了跨域问题 xff0c 跨域问题来源于同源策略 xff0c 同