解决Flask跨域问题的几种方式

2023-05-16

  • 本文收录于《Python开发》专栏,此专栏聚焦于Python开发中的编程技巧和总结,将持续更新,欢迎大家订阅!
  • 个人主页:有梦想的程序星空
  • 个人介绍:小编是人工智能领域硕士,全栈工程师,深耕Flask后端开发、数据挖掘、NLP、Android开发、自动化等领域,有较丰富的软件系统、人工智能算法服务的研究和开发经验。
  • 如果文章对你有帮助,欢迎关注点赞收藏订阅。

1、什么是跨域问题

        跨域是因为出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。

        所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。

        跨域问题就是当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同时出现的问题。

2、问题描述

        当客户端向服务器端请求ajax服务时,如果客户端和服务器端域名不一致,就会出现跨域问题,ajax报错如下:

        No 'Access-Control-Allow-Origin' header is present on the requested

3、解决方式:

(1)安装flask_cors:

pip install flask_cors

app初始化的时候就加载配置,如下

from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
# r'/*' 是通配符,让本服务器所有的 URL 都允许跨域请求
CORS(app, resources=r'/*')
if __name__ == "__main__":
    app.run()

CORS参数说明

参数类型Head字段说明
resources字典、迭代器或字符串全局配置允许跨域的API接口
origins列表、字符串或正则表达式Access-Control-Allow-Origin配置允许跨域访问的源,
*表示全部允许
methods列表、字符串Access-Control-Allow-Methods配置跨域支持的请求方式,
如:GET、POST
expose_headers列表、字符串Access-Control-Expose-Headers自定义请求响应的Head信息
allow_headers列表、字符串或正则表达式Access-Control-Request-Headers配置允许跨域的请求头
supports_credentials布尔值Access-Control-Allow-Credentials是否允许请求发送cookie,
false是不允许
max_age整数、字符串Access-Control-Max-Age预检请求的有效时长

:param resources:
    The series of regular expression and (optionally) associated CORS
    options to be applied to the given resource path.

    If the argument is a dictionary, it's keys must be regular expressions,
    and the values must be a dictionary of kwargs, identical to the kwargs
    of this function.

    If the argument is a list, it is expected to be a list of regular
    expressions, for which the app-wide configured options are applied.

    If the argument is a string, it is expected to be a regular expression
    for which the app-wide configured options are applied.

    Default : Match all and apply app-level configuration

:type resources: dict, iterable or string

:param origins:
    The origin, or list of origins to allow requests from.
    The origin(s) may be regular expressions, case-sensitive strings,
    or else an asterisk

    Default : '*'
:type origins: list, string or regex

:param methods:
    The method or list of methods which the allowed origins are allowed to
    access for non-simple requests.

    Default : [GET, HEAD, POST, OPTIONS, PUT, PATCH, DELETE]
:type methods: list or string

:param expose_headers:
    The header or list which are safe to expose to the API of a CORS API
    specification.

    Default : None
:type expose_headers: list or string

:param allow_headers:
    The header or list of header field names which can be used when this
    resource is accessed by allowed origins. The header(s) may be regular
    expressions, case-sensitive strings, or else an asterisk.

    Default : '*', allow all headers
:type allow_headers: list, string or regex

:param supports_credentials:
    Allows users to make authenticated requests. If true, injects the
    `Access-Control-Allow-Credentials` header in responses. This allows
    cookies and credentials to be submitted across domains.

    :note: This option cannot be used in conjuction with a '*' origin

    Default : False
:type supports_credentials: bool

:param max_age:
    The maximum time for which this CORS request maybe cached. This value
    is set as the `Access-Control-Max-Age` header.

    Default : None
:type max_age: timedelta, integer, string or None

:param send_wildcard: If True, and the origins parameter is `*`, a wildcard
    `Access-Control-Allow-Origin` header is sent, rather than the
    request's `Origin` header.

    Default : False
:type send_wildcard: bool

:param vary_header:
    If True, the header Vary: Origin will be returned as per the W3
    implementation guidelines.

    Setting this header when the `Access-Control-Allow-Origin` is
    dynamically generated (e.g. when there is more than one allowed
    origin, and an Origin than '*' is returned) informs CDNs and other
    caches that the CORS headers are dynamic, and cannot be cached.

    If False, the Vary header will never be injected or altered.

    Default : True
:type vary_header: bool

(2)在被请求的Response header中加入header

@app.after_request
def func_res(resp):     
    res = make_response(resp)
    res.headers['Access-Control-Allow-Origin'] = '*'
    res.headers['Access-Control-Allow-Methods'] = 'GET,POST'
    res.headers['Access-Control-Allow-Headers'] = 'x-requested-with,content-type'
    return res

(3)改成jsonp格式(不推荐)

在ajax请求里将数据类型改成jsonp,但是在返回数据的时候需要一个回调函数读取,而且jsonp只支持get方式,即使使用post方式,在调用的时候也会变成get方式,这带来安全性上的问题,并不推荐。

$.ajax({
        type:'POST',
        url:'127.0.0.1:5000',
        data:data,
        dataType:'jsonp',//改成了jsonp格式,解决了跨域访问的问题
        success:function(data){
            console.log(data)
        }

关注微信公众号【有梦想的程序星空】,了解软件系统和人工智能算法领域的前沿知识,让我们一起学习、一起进步吧!

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

解决Flask跨域问题的几种方式 的相关文章

  • Python Flask 不更新图像[重复]

    这个问题在这里已经有答案了 这里有一些关于图像的 Flask 问题 但没有一个能解决我的问题 我有一个应用程序可以创建图像 保存它 然后显示它 一次 它应该多次执行此操作 每次更改图像时 它应该加载新图像 它不是 它只显示与其显示的文件名关
  • 无法在 python 3.8 上将带有 webapp 的 python 部署到 azure

    我正在尝试使用部署一个测试项目Flask使用以下方法将框架迁移到 Azure 云中Azure CLI https learn microsoft com en us azure app service containers quicksta
  • 如何在单元测试中使用 JSON 发送请求

    我的 Flask 应用程序中有在请求中使用 JSON 的代码 我可以像这样获取 JSON 对象 Request request get json 这一直工作得很好 但是我正在尝试使用 Python 的 unittest 模块创建单元测试 但
  • 缓存 Flask-登录 user_loader

    我有这个 login manager user loader def load user id None return User query get id 在我引入 Flask Principal 之前它运行得很好 identity loa
  • Flask 的“app.logger”的 Pylint 误报:E1101:方法“logger”没有“debug”成员(无成员)

    使用烧瓶的app logger成员函数 例如app logger error 原因pylint报告E1101 no member 错误 即使这些成员app logger是在运行时定义的 这可以通过使用以下文件来重现 app py impor
  • Flask send_from_directory

    我有一个 Flask Web 应用程序 允许用户上传文件 然后下载或在浏览器中显示它们 我应该使用send from directory在生产时从我的服务器上的上传文件夹提供这些文件 你最好让 nginx 为你的静态文件提供服务 众所周知
  • wtforms 自定义验证器可以使字段可选吗?

    如果选中复选框 我正在使用自定义验证器来检查字段不为空 它检查正确 但无论如何它总是仍然验证该值是否是数字 基本上我需要一个字段来在表单的某些条件下停止验证 有没有办法让自定义验证器停止现场验证 是的 自定义验证器可以像内置的可选和必需验证
  • Flask 装饰器怎么能有参数呢?

    我以与这里相同的方式实现了一个装饰器如何在 Flask 中使用参数创建 python 装饰器函数 用于授权 https stackoverflow com questions 13896650 how to make a python de
  • Python Heroku 上的 Zombie SharedDataMiddleware

    我正在 Heroku 上设置 Flask 应用程序 一切工作正常 直到我添加静态文件 我正在使用这个 from werkzeug import SharedDataMiddleware app Flask name app wsgi app
  • GET 和 POST 方法的单独 Flask 路由

    在 Flask 中定义路由时 最好的做法是使用由多个 HTTP 方法定义的单个路由 并在该单个路由中使用显式逻辑处理不同的 HTTP 方法 例如 app route api users methods GET POST def users
  • 属性错误 - current_user 是权限装饰器中的 NoneType

    当我尝试运行我的应用程序时 我不断收到以下错误消息 if not current user can permission AttributeError NoneType object has no attribute can 模型 py f
  • 包含文件中的块未被扩展模板填充

    我有一个如下所示的模板 include base top html with context include base nav html with context div Stuff block content endblock div i
  • 尝试使用 Flask-Admin 设置模型视图会导致 ImportError

    我正在尝试向 Flask Admin 添加用户模型视图 但是 我得到ImportError cannot import name db 为什么会发生这种情况以及如何解决它 app init py from flask import Flas
  • 在 Python 中获取数组作为 GET 查询参数

    我知道在 php 中我可以使用 GET key1 key2 检索以数组形式发送的 GET 数据 但这在 Python 中是可能的 因为我只收到一个字符串 但它不被识别为数组 列表 如果重要的话我使用flask werkzeug 参数名称的深
  • 本地 Flask 实例中有多个静态路径[重复]

    这个问题在这里已经有答案了 是否可以为我的本地开发 Flask 实例添加更多静态路径 我想要默认static用于存储站点的 js css images 文件的文件夹和另一个文件夹 例如designs保留我的特定资产 我不想放置designs
  • 不能在jinja2宏中使用current_user?

    我使用 Flask Login 它提供了current user模板中的对象 我想编写一个宏来显示评论表单或登录链接 具体取决于用户是否登录 如果我直接在模板中使用此代码 它会起作用 if current user is authentic
  • Flask/Apache 提交按钮用于文件上传

    我有一个在 apache 后面运行的 Flask 应用程序 在我的 index html 页面上有一个文件上传按钮和一个提交按钮 如下所示
  • 使用主宰器将实时数据发送给客户端

    我尝试使用 Flask 的主宰框架 以便按照 Flask 代码片段将实时信息发送到客户端浏览器http flask pocoo org snippets 80 http flask pocoo org snippets 80 当我尝试为我的
  • 如何通过API(最好使用flask-restplus)封送腌制对象?

    我有一个完整记录并完成的 API 使用 Flask restplus 在 python 3 5 flask 中构建 我想添加一大块功能 返回一个腌制对象作为我的响应的一部分 欢迎非特定于 Flask restplus 的通用解决方案 但由于
  • 在 Flask 中将配置文件作为字典读取

    在 instance app cfg 我已经配置 test test 在我的烧瓶文件 app py 中 with app open instance resource app cfg as f config f read print con

随机推荐

  • 【Deep-sort多目标跟踪流程及其改进方法的解读】

    Deep sort多目标跟踪流程及其改进方法的解读 文前白话相关的文章 资源链接流程及其改进方法的梳理一 多目标跟踪的流程二 Sort 与 deepSort 的对比三 DeepSort主要的跟踪流程四 关于DeepSort中部分模块原理的理
  • 【IEEE论文投稿word中双栏情况下插入单栏效果图片】

    IEEE论文投稿word中双栏情况下插入单栏效果图片 word中双栏情况下插入单栏效果图片流程 xff1a word中双栏情况下插入单栏效果图片流程 xff1a 1 光标放在要插入图片的地方 xff0c 选择 布局 gt gt gt 分隔符
  • 【相机标定&基于消失点的外参标定】

    相机标定 amp 基于消失点的外参标定 文章一 xff1a Camera calibration using two or three vanishing points文章二 xff1a Online Extrinsic Camera Ca
  • 【Ubuntu20.04安装 ROS2-galactic】

    Ubuntu20 04 安装 ROS2 galactic 按照官网流Ubuntu20 04 安装 ROS2 galactic程在终端依次执行命令就行 xff1a 安装流程链接 install ros 2 package 执行到最后一步 xf
  • 【labelme格式json转为labelimg格式的xml(VOC)】

    64 TOC readme 用labelme标注图片 xff0c 得到的是json格式文件 xff0c 有时候需要voc格式的数据 xff0c 可以使用以下转换脚本 xff0c 只需把文件路径替换 code span class token
  • 详解MYSQL数据库密码的加密方式及破解方法(1)

    转自 http hi baidu com davice li blog item 5f5b470be3307e32b0351db5 html MYSQL数据库用户密码跟其它数据库用户密码一样 xff0c 在应用系统代码中都是以明文出现的 x
  • 2020-11-15 强引用、软引用、弱引用、幻象引用有什么区别

    强引用 xff08 34 Strong 34 Reference xff09 普通对象引用 xff0c 只要还有强引用指向一个对象 xff0c 就能表明对象还 活着 xff0c 垃圾收集器不会碰这种对象 对于一个普通的对象 xff0c 如果
  • RAID(独立磁盘冗余阵列)

    RAID 0 数据从内存缓冲区写入磁盘时 xff0c 根据磁盘数量将数据分成N份 xff0c 这些数据同时并发写入N块磁盘 xff0c 使得数据整体写入速度是一块磁盘的N倍 xff1b 读取的时候也一样 xff0c 因此具有极快的数据读写速
  • printf()函数常用格式控制

    格式字符含义d以十进制形式输出有符号整数o以八进制形式输出无符号整数x X以十六进制形式输出无符号整数u以十进制形式输出无符号整数f以小数形式输出单 双精度浮点数c输出单个字符s输出字符串p打印指针地址
  • getchar()函数使用要点

    注意点 xff1a 该函数一次只能读取一个字符 xff0c 但只在键盘上输入一个字符 xff08 回车外 xff09 时 xff0c getchar 函数读不到任何字符 xff0c 只有按下回车之后getchar 函数才会真正读取字符 键盘
  • 例子程序1:读取文件内容并打印到屏幕上

    文件名 xff1a 作者 xff1a kehanxin 时间 xff1a 说明 xff1a 读取特定文件paper txt中内容并打印在屏幕上 span class hljs comment include lt stdio h gt sp
  • 复制字符串strcpy()函数

    strcpy 函数原型 xff1a span class hljs preprocessor include lt string h gt span span class hljs keyword char span span class
  • Linux系统组成

    Linux一般有4个主要部分 xff1a 内核 Shell 文件系统 应用程序 Shell是一个命令解释器 xff0c 它解释用户输入的命令并且把它们送到内核执行 目前常见的Shell有Bourne Shell sh Korn Shell
  • 在VC++6.0中嵌入汇编

    span class hljs preprocessor include lt stdio h gt span span class hljs keyword int span main span class hljs keyword in
  • VS Code For Web 深入浅出 -- 进程间通信篇

    在上一篇中 xff0c 我们一起分析了 VS Code 整体的代码架构 xff0c 了解了 VS Code 是由前后端分离的方式开发的 且无论前端是基于 electron 还是 web xff0c 后端是本地还是云端 xff0c 其调用方式
  • QtMath:通用数学函数

    头文件 xff1a include lt QtMath gt 一 描述 这些函数是 C 或标准模板库中不可用的基本数学运算的部分方便定义 二 宏成员 M E xff1a 自然对数的底 xff0c e 61 exp 1 M LOG2E xff
  • 深入剖析PE文件 (告诉你exe文件打开后是依据什么来创建进程并在系统中运行)

    转自 深入剖析PE文件 告诉你exe文件打开后是依据什么来创建进程并在系统中运行 转载自http lwglucky blog 51cto com 1228348 283812 PE文件是Win32的原生文件格式 每一个Win32可执行文件都
  • 串口和TCP互相转发工具

    由于项目调试需求 xff0c 代码在远程服务器的虚拟机上 xff0c 在本地计算机通过串口连接需要对接的设备 xff0c 在远程服务器的上位机程序需要和此设备进行对接 xff0c 系统结构如图1所示 图1 系统网络结构图 如何将本地的串口共
  • Linux系统基础操作管理

    一 系统基础操作规范 1 第一个规范 输出命令信息需要在命令提示符之后输入 命令提示符 xff1a span class token punctuation span root 64 oldboy span class token punc
  • 解决Flask跨域问题的几种方式

    本文收录于 Python开发 专栏 xff0c 此专栏聚焦于Python开发中的编程技巧和总结 xff0c 将持续更新 xff0c 欢迎大家订阅 xff01 个人主页 xff1a 有梦想的程序星空个人介绍 xff1a 小编是人工智能领域硕士