0

0

Python HTTP服务器处理JavaScript跨域请求:CORS配置指南

心靈之曲

心靈之曲

发布时间:2025-10-31 14:29:14

|

1004人浏览过

|

来源于php中文网

原创

Python HTTP服务器处理JavaScript跨域请求:CORS配置指南

本文旨在解决python `http.server`在处理javascript `xmlhttprequest`跨域请求时遇到的无响应问题。核心在于理解跨域资源共享(cors)机制,并指导如何在python服务器端正确配置`access-control-allow-origin`响应头,确保客户端能够顺利接收到服务器的响应数据,从而实现前后端正常通信。

在现代Web开发中,前后端分离架构日益普及,JavaScript客户端通过HTTP请求与后端服务器进行数据交互是常见模式。然而,当JavaScript运行在浏览器中,并且尝试向与自身来源(协议、域名、端口)不同的服务器发送请求时,可能会遭遇浏览器安全策略的限制,导致请求看似成功发送,但客户端却无法接收到响应数据。这种现象通常与“同源策略”和“跨域资源共享(CORS)”机制有关。

理解同源策略与CORS

同源策略(Same-Origin Policy)是浏览器的一项核心安全功能,它限制了从一个源加载的文档或脚本如何与另一个源的资源进行交互。例如,运行在http://example.com的JavaScript代码无法直接读取http://api.example.org的数据。这一策略旨在防止恶意网站读取用户敏感信息或执行未经授权的操作。

然而,在许多合法的应用场景中,跨域通信是不可避免的。为了解决这一问题,W3C引入了跨域资源共享(CORS)标准。CORS允许服务器明确声明哪些源被允许访问其资源。当浏览器检测到跨域请求时,它会在请求头中携带Origin信息,服务器收到请求后,可以通过在响应头中添加特定的CORS字段来告知浏览器是否允许该跨域请求。如果服务器的响应头中不包含或不正确配置CORS相关信息,浏览器会拒绝将响应暴露给JavaScript代码,即使HTTP请求本身可能已经到达服务器并得到了处理。

客户端JavaScript请求示例

以下是一个典型的JavaScript XMLHttpRequest(XHR)请求示例,它尝试从http://127.0.0.1:8080/example获取数据。在多数情况下,这段客户端代码本身是正确的,问题往往出在服务器端。

立即学习Java免费学习笔记(深入)”;

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
    // readyState == 4 表示请求已完成
    // status == 200 表示请求成功
    if (this.readyState == 4 && this.status == 200) {
       var responseData = this.responseText;
       console.log("接收到服务器响应:", responseData);
       // 在这里处理接收到的数据
    } else if (this.readyState == 4 && this.status !== 200) {
       console.error("请求失败,状态码:", this.status);
    }
};
// 发送GET请求到指定的URL
xhr.open('GET', 'http://127.0.0.1:8080/example', true);
xhr.send();

如果这个JavaScript代码运行在一个不同于http://127.0.0.1:8080的源(例如,一个通过文件系统打开的HTML文件,或运行在http://localhost:3000的页面),它就是一个跨域请求。

Python HTTP服务器初始实现

一个基于http.server模块的Python HTTP服务器可以用于处理HTTP请求。以下是一个基本的Python HTTP服务器实现,它能够响应GET请求:

from http.server import BaseHTTPRequestHandler, HTTPServer
import logging

hostName = "localhost"
serverPort = 8080

class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        logging.info("GET request received, path: %s", self.path)
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        # 缺少CORS头,导致跨域请求无响应
        self.end_headers()

        response_content = f"""
        
        Python HTTP Server Response
        
            

GET Request Path: {self.path}

This is the response from the Python HTTP server.

Hello from Python!

""" self.wfile.write(bytes(response_content, "utf-8")) def do_POST(self): logging.info("POST request received, path: %s", self.path) content_length = int(self.headers.get("Content-Length", 0)) post_body = self.rfile.read(content_length) logging.info("POST body: %s", post_body.decode('utf-8')) self.send_response(200) self.send_header("Content-type", "text/plain") # 同样需要为POST请求添加CORS头 self.end_headers() self.wfile.write(b"Received your POST request!") if __name__ == "__main__": logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') webServer = HTTPServer((hostName, serverPort), MyServer) logging.info("Server started http://%s:%s", hostName, serverPort) try: webServer.serve_forever() except KeyboardInterrupt: pass webServer.server_close() logging.info("Server stopped.")

运行上述Python服务器,并从一个不同源的HTML页面尝试发送JavaScript XHR请求,你会在浏览器的开发者工具控制台中看到类似“Cross-Origin Request Blocked”的错误,即使服务器日志显示它已成功处理了GET请求并发送了响应。

Cutout.Pro抠图
Cutout.Pro抠图

AI批量抠图去背景

下载

解决方案:添加CORS响应头

解决此问题的关键是在Python服务器的响应中添加Access-Control-Allow-Origin HTTP头。这个头告诉浏览器,即使请求来自不同的源,也允许其访问资源。

修改MyServer类中的do_GET方法,添加一行self.send_header("Access-Control-Allow-Origin", "*"):

from http.server import BaseHTTPRequestHandler, HTTPServer
import logging

hostName = "localhost"
serverPort = 8080

class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        logging.info("GET request received, path: %s", self.path)
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.send_header("Access-Control-Allow-Origin", "*") # 关键的CORS头
        self.end_headers()

        response_content = f"""
        
        Python HTTP Server Response
        
            

GET Request Path: {self.path}

This is the response from the Python HTTP server.

Hello from Python!

""" self.wfile.write(bytes(response_content, "utf-8")) def do_POST(self): logging.info("POST request received, path: %s", self.path) content_length = int(self.headers.get("Content-Length", 0)) post_body = self.rfile.read(content_length) logging.info("POST body: %s", post_body.decode('utf-8')) self.send_response(200) self.send_header("Content-type", "text/plain") self.send_header("Access-Control-Allow-Origin", "*") # POST请求也需要CORS头 self.end_headers() self.wfile.write(b"Received your POST request!") if __name__ == "__main__": logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') webServer = HTTPServer((hostName, serverPort), MyServer) logging.info("Server started http://%s:%s", hostName, serverPort) try: webServer.serve_forever() except KeyboardInterrupt: pass webServer.server_close() logging.info("Server stopped.")

重新运行这个Python服务器,并再次从JavaScript客户端发送请求。此时,浏览器将不再阻止响应,JavaScript的xhr.onreadystatechange回调函数将能够正常接收并处理服务器返回的数据。

注意事项与最佳实践

  1. Access-Control-Allow-Origin的值:

    • * (星号):表示允许任何源访问资源。这在开发和测试阶段非常方便,但不推荐用于生产环境,因为它存在安全风险。
    • 指定具体源:在生产环境中,应将*替换为你的前端应用的实际源,例如http://localhost:3000或https://your-frontend-domain.com。如果需要支持多个特定源,服务器可以根据请求的Origin头动态设置Access-Control-Allow-Origin为匹配的源。
      # 示例:允许特定源
      # allowed_origins = ["http://localhost:3000", "https://your-frontend-domain.com"]
      # origin = self.headers.get("Origin")
      # if origin and origin in allowed_origins:
      #     self.send_header("Access-Control-Allow-Origin", origin)
      # else:
      #     # 或者不发送CORS头,让浏览器阻止
      #     pass
      self.send_header("Access-Control-Allow-Origin", "http://localhost:3000")
  2. 预检请求(Preflight Requests): 对于非简单请求(例如,使用PUT、DELETE方法,或发送自定义HTTP头,或Content-Type为application/json等),浏览器会在发送实际请求之前,先发送一个OPTIONS方法类型的预检请求。服务器需要对OPTIONS请求做出响应,并包含必要的CORS头,如Access-Control-Allow-Methods、Access-Control-Allow-Headers等。如果预检请求未通过,实际请求将不会被发送。在BaseHTTPRequestHandler中,你需要实现do_OPTIONS方法来处理这类请求。

    class MyServer(BaseHTTPRequestHandler):
        # ... do_GET, do_POST methods ...
    
        def do_OPTIONS(self):
            self.send_response(200)
            self.send_header("Access-Control-Allow-Origin", "*")
            self.send_header("Access-Control-Allow-Methods", "GET, POST, OPTIONS") # 允许的HTTP方法
            self.send_header("Access-Control-Allow-Headers", "Content-Type") # 允许的请求头
            self.send_header("Access-Control-Max-Age", "86400") # 预检结果缓存时间(秒)
            self.end_headers()
  3. 其他CORS头:

    • Access-Control-Allow-Methods: 指定允许的HTTP方法。
    • Access-Control-Allow-Headers: 指定允许的请求头。
    • Access-Control-Allow-Credentials: 如果前端请求需要发送cookie或HTTP认证信息,此头必须设置为true,并且Access-Control-Allow-Origin不能为*,必须是具体的源。
    • Access-Control-Expose-Headers: 允许浏览器访问非简单的响应头。
  4. 错误排查: 当遇到跨域问题时,首先检查浏览器的开发者工具(通常是F12键打开)的“控制台”(Console)和“网络”(Network)标签页。控制台会显示CORS错误信息,网络标签页可以查看请求和响应的完整HTTP头,帮助你定位问题所在。

  5. 更高级的Python Web框架: 对于更复杂的应用,推荐使用成熟的Python Web框架,如Flask、Django、FastAPI等。这些框架通常提供更完善的CORS处理机制,例如Flask-CORS扩展,可以非常方便地配置CORS策略,无需手动管理每个HTTP头。

总结

Python http.server在处理JavaScript跨域请求时无响应的问题,本质上是浏览器同源策略导致的CORS限制。通过在服务器端正确配置Access-Control-Allow-Origin等CORS响应头,可以明确告知浏览器允许跨域访问,从而解决客户端无法接收响应的问题。在实际开发中,务必根据安全需求选择合适的Access-Control-Allow-Origin值,并在必要时处理预检请求,以确保Web应用的安全性和功能性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Flask框架
Python Flask框架

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

89

2025.08.25

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

72

2025.12.15

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

420

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

536

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

312

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

27

2025.12.22

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6430

2023.06.30

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号