Python Web.py HTTP服务器跨域请求解决方案
本文解析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服务器解决跨域问题的完整解析,希望能对读者有所帮助。感兴趣的朋友可继续参考本站其他相关专题,如有疏漏欢迎留言指正。感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









