翼度科技»论坛 编程开发 python 查看内容

python实现跨域代理服务器

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15

  • 准备环境

  • python3.7+
  • 依赖:aiohttp


  • 代码实现(代理服务器,返回响应体和进行跨域处理后的headers)
  1. import aiohttp
  2. from functools import wraps
  3. from aiohttp import web
  4. corscode = {
  5.                 'Access-Control-Allow-Origin': '*',
  6.                 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', # 需要限制请求就在这里增删
  7.                 'Access-Control-Allow-Headers': '*',
  8.                 'Server':'is my server',
  9.             }
  10. # 实例化路由
  11. routes = web.RouteTableDef()
  12. # 异步json序列化
  13. def jsondump(func):
  14.     @wraps(func)
  15.     async def wrapper(*args,**kwargs):
  16.         result = await func(*args,**kwargs)
  17.         try:
  18.             return json.dumps(result ,ensure_ascii=False)
  19.         except:
  20.             return result
  21.     return wrapper
  22. # 封装一下web.json_resp
  23. # def wj(dt):
  24. #    return web.json_response(dt)
  25. wj = lambda dt: web.json_response(dt)
  26. # 处理OPTIONS和跨域的中间件
  27. @jsondump
  28. async def options_middleware(app, handler):
  29.     async def middleware(request):
  30.         # 处理 OPTIONS 请求,直接返回空数据和允许跨域的 header
  31.         if request.method == 'OPTIONS':
  32.             return web.Response(headers=corscode)
  33.         # 继续处理其他请求
  34.         response = await handler(request)
  35.         # 为每次响应添加header
  36.         try:
  37.             response.headers.update(corscode)
  38.         except Exception as e:
  39.             return response
  40.         return response
  41.     return middleware
  42. @jsondump
  43. @routes.view(r'/get')
  44. async def geturl(request):
  45.     url = request.query.get('url')
  46.     if not url:
  47.         return wj({"data":"参数错误"})
  48.     async with aiohttp.ClientSession() as session:
  49.         async with session.get(url) as response:
  50.             # 检查请求是否成功,如果不成功,可以根据需要进行处理
  51.             if response.status == 200:
  52.                 file = await response.read()
  53.                 return web.Response(body=file, headers=response.headers)
  54. if __name__ == '__main__':
  55.     app = web.Application()
  56.     app.add_routes(routes)
  57.     app.middlewares.append(options_middleware)
  58.     web.run_app(app)
复制代码

  • 测试

  • 写个get的方法
  1. function downloadfile(url, fileName) {
  2.   var xhr = new XMLHttpRequest();
  3.   xhr.open('GET', url, true);
  4.   xhr.responseType = 'blob';
  5.   xhr.onload = function() {
  6.     if (xhr.status === 200) {
  7.       var blob = xhr.response;
  8.       var a = document.createElement('a');
  9.       var url = window.URL.createObjectURL(blob);
  10.       a.href = url;
  11.       a.download = fileName;
  12.       document.body.appendChild(a);
  13.       a.click();
  14.       document.body.removeChild(a);
  15.       window.URL.revokeObjectURL(url);
  16.     }
  17.   };
  18.   xhr.send();
  19. }
复制代码

  • 下载测试
  1. downloadfile(url, fileName)
复制代码

  • 结果

    可以正常下载
    并且在响应头中能看到Server:is my server
    同时可以看到添加成功的Allow-Origin响应头


来源:https://www.cnblogs.com/ymer/p/17560121.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具