首页 > 编程语言 >python实现跨域代理服务器

python实现跨域代理服务器

时间:2023-07-17 15:01:44浏览次数:39  
标签:web return 跨域 xhr python 代理服务器 url async response

  • 准备环境
  1. python3.7+
  2. 依赖:aiohttp

  • 代码实现(代理服务器,返回响应体和进行跨域处理后的headers)
import aiohttp
from functools import wraps
from aiohttp import web


corscode = {
                'Access-Control-Allow-Origin': '*',
                'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', # 需要限制请求就在这里增删
                'Access-Control-Allow-Headers': '*',
                'Server':'is my server',
            }

# 实例化路由
routes = web.RouteTableDef()

# 异步json序列化
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)

# 处理OPTIONS和跨域的中间件
@jsondump
async def options_middleware(app, handler):
    async def middleware(request):
        # 处理 OPTIONS 请求,直接返回空数据和允许跨域的 header
        if request.method == 'OPTIONS':
            return web.Response(headers=corscode)
        # 继续处理其他请求
        response = await handler(request)
        # 为每次响应添加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":"参数错误"})
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            # 检查请求是否成功,如果不成功,可以根据需要进行处理
            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)

  • 测试
  1. 写个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();
}
  1. 下载测试
downloadfile(url, fileName)
  1. 结果
    image
    可以正常下载
    并且在响应头中能看到Server:is my server
    同时可以看到添加成功的Allow-Origin响应头
    image

标签:web,return,跨域,xhr,python,代理服务器,url,async,response
From: https://www.cnblogs.com/ymer/p/17560121.html

相关文章

  • python爬取之url管理器
    classUrlManager():#url管理器def__init__():#设置新老url数组,分别为未爬取和已爬取self.new_urls=set()self.old_urls=set()defadd_new_url(self,url):#添加单个urlifurlisNoneorlen(url)==0:return......
  • python连接Mysql 1-01
    一,下载对应python环境的MySQL连接包我的是python3所以下载的是这个(cmd)pip3installPyMySQL二,创建py文件编写importpymysql#打开数据库连接db=pymysql.connect(host='localhost',user='root',password='123456',db='test1')#使用cursor()方法创建一个游......
  • python:python解析器和pycharm编译器安装
    python解析器下载地址:https://www.python.org/getit/注意事项:1.建议下载3.6以以上的版本,2.官网下载比较慢,可以自行寻找其它网站下载,3.建议使用.exe安装包方式下载安装 下载完成后双击运行     验证是否安装成功:  pycharm编译器下载......
  • Python 全栈工程师必备面试题 300 道(2020 版)
    2020元旦巨献,面试升级必备!献给正在学习Python的同学!Python全栈工程师必备面试题300道(2020版)Python面试不仅需要掌握Python基础知识和高级语法,还会涉及网络编程、web前端后端、数据库、网络爬虫、数据解析、数据分析和数据可视化等各方面的核心知识。针对网上资料参差不齐,并......
  • python操作mongodb实现读写分离
    读写分离默认情况下,MongoClient实例将查询发送到副本集的主要成员。要使用副节点作为查询,以实现读写分离,我们必须更改读取首选项:读取首选项在模块pymongo.ReadPreference下:PRIMARY:从主节点中读取(默认)PRIMARY_PREFERRED:优先从主节点读取,如果不可用则从副节点读取、SECOND......
  • python学习_循环结构(while循环和for循环)
    一、什么叫循环结构?反复做同一件事情的情况,就要循环python中的循环结构主要有两种:1)while2)for-in 二、while循环只要条件成立,其包含的某条语句或某个语句块就会一直被执行,while循环与if语句的区别就是if语句是判断一次,条件为True就执行一次执行体,while循环是判断N+1次,条件......
  • python操作mongodb基本使用
    使用pymongo,具体可以参考官方文档:语法上基本和原生mongodb是一样的,所以非常容易入手...https://pymongo.readthedocs.io/en/stable/tutorial.html日常使用importpprintimportpymongofrompymongo.collectionimportCollectionfrompymongo.databaseimportDatabasei......
  • python知识点
    anoldcat 博客园首页新随笔联系订阅管理随笔-66  文章-61  评论-7  阅读- 14万Python知识点大全(转载) 转载自:https://github.com/kenwoodjw/python_interview_question大佬总结得很好,本来我也想总结一个的,直到我看到了这个。。。额,我......
  • uniapp H5 解决跨域
    1、请求地址:http://192.168.1.216:8080/renren-api/api/getUserInfo2、修改 manifest.json "h5":{"devServer":{"port":5173,//端口号"disableHostCheck":true,"proxy":{&quo......
  • AnaConda 打包 python 程序为 exe
    1.打开AnacondaPrompt2.查看环境并激活condaenvlist##查看所有环境activateenv_name##激活对应环境3.进入程序所在对应windows目录4.打包主程序pyinstaller-Fxxxx.py##打包程序-F覆盖 ......