python實(shí)現(xiàn)跨域代理服務(wù)器的方法
- 準(zhǔn)備環(huán)境
- python3.7+
- 依賴:aiohttp
- 代碼實(shí)現(xiàn)(代理服務(wù)器,返回響應(yīng)體和進(jìn)行跨域處理后的headers)
import aiohttp
from functools import wraps
from aiohttp import web
corscode = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', # 需要限制請(qǐng)求就在這里增刪
'Access-Control-Allow-Headers': '*',
'Server':'is my server',
}
# 實(shí)例化路由
routes = web.RouteTableDef()
# 異步j(luò)son序列化
def jsondump(func):
@wraps(func)
async def wrapper(*args,**kwargs):
result = await func(*args,**kwargs)
try:
return json.dumps(result ,ensure_ascii=False)
except:
return result
return wrapper
# 封裝一下web.json_resp
# def wj(dt):
# return web.json_response(dt)
wj = lambda dt: web.json_response(dt)
# 處理OPTIONS和跨域的中間件
@jsondump
async def options_middleware(app, handler):
async def middleware(request):
# 處理 OPTIONS 請(qǐng)求,直接返回空數(shù)據(jù)和允許跨域的 header
if request.method == 'OPTIONS':
return web.Response(headers=corscode)
# 繼續(xù)處理其他請(qǐng)求
response = await handler(request)
# 為每次響應(yīng)添加header
try:
response.headers.update(corscode)
except Exception as e:
return response
return response
return middleware
@jsondump
@routes.view(r'/get')
async def geturl(request):
url = request.query.get('url')
if not url:
return wj({"data":"參數(shù)錯(cuò)誤"})
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
# 檢查請(qǐng)求是否成功,如果不成功,可以根據(jù)需要進(jìn)行處理
if response.status == 200:
file = await response.read()
return web.Response(body=file, headers=response.headers)
if __name__ == '__main__':
app = web.Application()
app.add_routes(routes)
app.middlewares.append(options_middleware)
web.run_app(app)- 測(cè)試
1.寫(xiě)個(gè)get的方法
function downloadfile(url, fileName) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.onload = function() {
if (xhr.status === 200) {
var blob = xhr.response;
var a = document.createElement('a');
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}
};
xhr.send();
}2.下載測(cè)試
downloadfile(url, fileName)
3.結(jié)果

可以正常下載
并且在響應(yīng)頭中能看到Server:is my server
同時(shí)可以看到添加成功的Allow-Origin響應(yīng)頭

到此這篇關(guān)于python實(shí)現(xiàn)跨域代理服務(wù)器的文章就介紹到這了,更多相關(guān)python跨域代理服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pandas實(shí)現(xiàn)批量拆分與合并Excel的示例代碼
這篇文章主要為大家詳細(xì)講講如何利用python Pandas實(shí)現(xiàn)批量拆分與合并Excel,文中有非常詳細(xì)的的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下2022-05-05
Python如何將兩個(gè)Excel文件按相同字段合并到一起
文章介紹了如何使用Pandas工具將兩個(gè)關(guān)聯(lián)的Excel文件合并成一個(gè),首先創(chuàng)建兩個(gè)Excel文件test1和test2,然后使用Pandas進(jìn)行合并,最后顯示新創(chuàng)建的Excel文件2025-02-02
pandas根據(jù)指定條件篩選數(shù)據(jù)的實(shí)現(xiàn)示例
條件篩選是pandas中非常重要的一個(gè)功能,它允許我們根據(jù)特定條件來(lái)快速、高效地篩選數(shù)據(jù),本文主要介紹了pandas根據(jù)指定條件篩選數(shù)據(jù)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
python爬蟲(chóng)入門教程--利用requests構(gòu)建知乎API(三)
這篇文章主要給大家介紹了關(guān)于python爬蟲(chóng)入門之利用requests構(gòu)建知乎API的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05
Django項(xiàng)目創(chuàng)建及管理實(shí)現(xiàn)流程詳解
這篇文章主要介紹了Django項(xiàng)目創(chuàng)建及管理實(shí)現(xiàn)流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
Django實(shí)現(xiàn)內(nèi)容緩存實(shí)例方法
在本篇文章里小編給大家整理了關(guān)于Django實(shí)現(xiàn)內(nèi)容緩存實(shí)例方法,有需要的朋友們可以跟著學(xué)習(xí)下。2020-06-06
使用Python實(shí)現(xiàn)檢測(cè)并刪除離群值
離群值是一個(gè)數(shù)據(jù)項(xiàng)/對(duì)象,它明顯偏離其余的(所謂的正常)對(duì)象,本文主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)檢測(cè)并刪除離群值,感興趣的小伙伴可以了解下2024-01-01

