如何在 Angular 前端与 Flask 后端之间实现跨域通信与数据交互

聖光之護

聖光之護

2026-07-13

447人浏览

原创

如何在 Angular 前端与 Flask 后端之间实现跨域通信与数据交互

本文详解 Angular 与 Flask 协同开发时的前后端通信方案,涵盖 Flask 的 CORS 配置、Angular 中使用 fetch 或 HttpClient 发起请求、服务封装最佳实践,以及常见跨域错误的根源与解决方法。

本文详解 angular 与 flask 协同开发时的前后端通信方案,涵盖 flask 的 cors 配置、angular 中使用 `fetch` 或 `httpclient` 发起请求、服务封装最佳实践,以及常见跨域错误的根源与解决方法。

在构建 Angular(前端)+ Flask(后端)架构的应用时,最常遇到的阻塞点并非逻辑实现,而是跨域资源共享(CORS)限制HTTP 客户端调用方式不匹配。以下为经过验证的完整解决方案,兼顾可维护性与生产就绪性。

✅ 第一步:Flask 后端启用 CORS 支持

默认情况下,Flask 不允许来自 http://localhost:4200(Angular 开发服务器)的跨域请求,浏览器会直接拦截响应并抛出 CORS error。解决方法是安装并启用 flask-cors:

pip install flask-cors

修改 app.py,关键在于 CORS(app) 必须在定义路由前调用:

from flask import Flask, jsonify
from flask_cors import CORS  # ? 导入 CORS

app = Flask(__name__)
CORS(app)  # ✅ 启用全局跨域支持(开发阶段推荐)

@app.route('/getconcepts', methods=['GET'])
def get_concepts():
    concepts = ["Physics", "Chemistry", "Biology"]  # 示例数据
    return jsonify(concepts)  # ✅ 确保返回 JSON 响应(含正确 Content-Type)

if __name__ == '__main__':
    app.run(port=5000, debug=True)

⚠️ 注意:CORS(app) 默认允许所有源(*),仅适用于开发环境;生产环境请明确指定 origins=['http://your-angular-domain.com'] 并禁用 debug=True。

✅ 第二步:Angular 中封装数据访问服务(推荐方式)

避免在组件中直接写 HTTP 调用逻辑。使用 Angular 服务(Service)解耦数据获取逻辑,提升复用性与可测试性。

面向设计的AXUI前端框架表单
面向设计的AXUI前端框架表单

面向设计的AXUI前端框架表单是一款包含表格、列表、弹窗等的AXUI前端框架表单下载。

下载

创建服务(如 my-service.service.ts):

import { Injectable } from '@angular/core';
import { Archivelink } from './archivelink';

@Injectable({
  providedIn: 'root' // 自动注入,无需手动声明 providers
})
export class MyService {
  private readonly apiUrl = 'http://localhost:5000/getconcepts';

  // 方式一:使用现代 fetch API(简洁、TypeScript 原生支持)
  async getAllArchiveLink(): Promise<archivelink> {
    try {
      const response = await fetch(this.apiUrl);
      if (!response.ok) throw new Error(`HTTP ${response.status}`);
      const concepts: string[] = await response.json();
      return concepts.map((concept, index) => ({
        id: index,
        concept: encodeURIComponent(concept),
        url: `/display?concept=${encodeURIComponent(concept)}`
      }));
    } catch (error) {
      console.error('Failed to fetch concepts:', error);
      return [];
    }
  }

  // 方式二:使用 HttpClient(需导入 HttpClientModule 并在 AppModule 中注册)
  // constructor(private http: HttpClient) {}
  // getAllArchiveLinkViaHttp(): Observable<archivelink> {
  //   return this.http.get<string>(this.apiUrl).pipe(
  //     map(concepts => concepts.map((c, i) => ({ 
  //       id: i, concept: encodeURIComponent(c), 
  //       url: `/display?concept=${encodeURIComponent(c)}`
  //     }))
  //   );
  // }
}</string></archivelink></archivelink>

✅ 第三步:在组件中安全调用服务

在 LeftNavigationComponent 中注入并使用服务。注意:避免在构造函数中执行异步操作(易引发生命周期问题),推荐在 ngOnInit 中调用:

import { Component, OnInit } from '@angular/core';
import { MyService } from '../my-service.service';
import { Archivelink } from '../archivelink';

@Component({
  selector: 'app-left-navigation',
  templateUrl: './left-navigation.component.html'
})
export class LeftNavigationComponent implements OnInit {
  archiveLinkList: Archivelink[] = [];

  constructor(private myService: MyService) {} // ✅ 构造函数注入

  ngOnInit(): void {
    this.myService.getAllArchiveLink()
      .then(links => this.archiveLinkList = links)
      .catch(err => console.error('Failed to load navigation links:', err));
  }
}

? 提示:若选择 HttpClient 方式,需确保 AppModule 已导入 HttpClientModule:

import { HttpClientModule } from '@angular/common/http';
@NgModule({
  imports: [/* ... */, HttpClientModule],
})
export class AppModule { }

? 常见错误排查清单

  • 未配置 CORS → 浏览器控制台报 Blocked by CORS Policy → 立即添加 flask-cors。
  • Flask 返回非 JSON 响应(如直接 return concepts)→ jsonify() 是必须的,否则响应头 Content-Type 不为 application/json,Angular 解析失败。
  • Angular 请求 URL 错误 → 检查是否为 http://localhost:5000/...(而非 /getconcepts 相对路径)。
  • 服务未正确注入 → 确认 @Injectable({ providedIn: 'root' }) 及组件构造函数参数类型正确。
  • 开发服务器端口冲突 → 确保 Flask 运行在 5000,Angular 在 4200,且无防火墙拦截。

通过以上步骤,你将获得一个稳定、清晰、易于扩展的 Angular + Flask 全栈通信基础架构。后续可进一步集成身份认证(JWT)、错误统一处理、请求拦截器及环境变量管理,迈向生产级应用。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

2154

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

2679

10

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

2285

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

2154

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

2345

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

357

5

Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

2025.08.25

1892

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Vue.js:纪录片
Vue.js:纪录片

共1课时 | 0.2万人学习

Angular js入门篇
Angular js入门篇

共17课时 | 3.7万人学习