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.寫個(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-05Python如何將兩個(gè)Excel文件按相同字段合并到一起
文章介紹了如何使用Pandas工具將兩個(gè)關(guān)聯(lián)的Excel文件合并成一個(gè),首先創(chuàng)建兩個(gè)Excel文件test1和test2,然后使用Pandas進(jìn)行合并,最后顯示新創(chuàng)建的Excel文件2025-02-02pandas根據(jù)指定條件篩選數(shù)據(jù)的實(shí)現(xiàn)示例
條件篩選是pandas中非常重要的一個(gè)功能,它允許我們根據(jù)特定條件來快速、高效地篩選數(shù)據(jù),本文主要介紹了pandas根據(jù)指定條件篩選數(shù)據(jù)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03python爬蟲入門教程--利用requests構(gòu)建知乎API(三)
這篇文章主要給大家介紹了關(guān)于python爬蟲入門之利用requests構(gòu)建知乎API的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-05-05Django項(xiàng)目創(chuàng)建及管理實(shí)現(xiàn)流程詳解
這篇文章主要介紹了Django項(xiàng)目創(chuàng)建及管理實(shí)現(xiàn)流程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Django實(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