Python Web.py HTTP服务器跨域请求解决方案

Noah
Noah
发布时间:2026-10-13| 2人浏览过
原创

本文解析Python Web.py框架开发HTTP服务器时遇到的跨域问题。当Postman请求正常而浏览器受同源策略限制时,需通过[[wp:a0]]设置响应头。重点说明Access-Control-Allow-Origin、Methods及Headers的配置方法,并提供完整代码示例,展示如何允许所有源访问以解决浏览器请求失败的问题。

在使用Web.py构建HTTP服务器进行开发时,常会遇到Postman等工具能正常获取数据,但浏览器端却无法请求到数据的情况。经排查,该问题的根源在于跨域请求限制。

跨域请求是指当浏览器与服务器基于“协议+域名+端口号”建立会话后,若提交的请求中任一属性与当前会话不同,浏览器即判定为跨域,从而触发同源策略限制。W3C标准中针对跨域访问定义了以下三种响应头限制机制:

Access-Control-Allow-Origin:用于限定允许跨域访问的源,例如http://192.168.10.12:8080。需注意,该字段仅支持通配符*(代表所有源)或单一特定源,不支持直接指定多个源。若需支持多源访问,需自行封装集合逻辑,在每次请求时判断源是否存在于集合中,若存在则将其加入响应头。

Access-Control-Allow-Methods:用于限定允许的HTTP方法类型,多个方法以逗号分隔,例如:POST, GET, OPTIONS, PUT, DELETE。

Access-Control-Allow-Headers:用于限定允许的HTTP头部字段,只有包含在此设置中的头部才允许跨域访问,例如:Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization。

在Web.py框架中,可以通过web.header() 函数来定义HTTP响应头。

完整的HTTP服务器代码示例如下(文件名为ap-httpserver.py):

#!/usr/bin/env python 
# encoding: utf-8 
import redis 
import web 
import json 
import string 
from time import time 
 
urls = ( 
  '/qlljx/realtimedata', 'realtimedata' 
  ) 
app = web.application(urls, globals()) 
 
def getResult(): 
 r = redis.Redis(host='127.0.0.1', port=6379) 
 result_list = [] 
 regionlist = r.hgetall('regionlist') 
 timestamp = r.hget('zhongguo_bgp', 'timestamp') 
 for region in regionlist: 
  value = {'mip': str(regionlist[region]), 'region': region, \ 
    'inpps': int(r.hget(region, 'inpps')), 'outpps': int(r.hget(region, 'outpps')), \ 
    'inbps': int(r.hget(region, 'inbps')), 'outbps': int(r.hget(region, 'outbps')), \ 
    'pktpct': string.atof(r.hget(region, 'pktpct')), 'bytpct': string.atof(r.hget(region, 'bytpct'))} 
  result_list.append(value) 
 
 result = {'timestamp': timestamp, 'result': result_list} 
 return json.dumps(result) 
 
class realtimedata: 
 def POST(self): 
  data = web.data() 
  request_type = str(json.loads(data)['type']) 
  if request_type == 'getRealTimeData': 
   result = getResult() 
   web.header("Access-Control-Allow-Origin", "*") 
   #web.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE") 
   #web.header("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, \ 
   #  Accept-Encoding, X-CSRF-Token, Authorization") 
   return result 
 
if __name__ == "__main__": 
 app.run() 

在上述代码中,仅使用了"Access-Control-Allow-Origin"这一项限制,旨在允许所有源的请求。启动HTTP服务器的命令如下:

[root@localhost python]# ./ap-httpserver.py 1216 

配置完成后,使用浏览器请求数据即可正常获取。

总结

以上为Python Web.py开发HTTP服务器解决跨域问题的完整解析,希望能对读者有所帮助。感兴趣的朋友可继续参考本站其他相关专题,如有疏漏欢迎留言指正。感谢支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。