python web.py開發httpserver解決跨域問題例項解析

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

使用web.py做http server開發時,遇到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() ,可以定義header。

完整的httpserver程式碼如下【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" 限制,允許所有源的請求。啟動httpserver:


[[email protected] python]# ./ap-httpserver.py 1216 

使用瀏覽器請求資料正常了。

總結

相關文章

程式語言 最新文章