在flask中返回requests响应

  在flask服务端,有时候需要使用requests请求其他url,并将响应返回回去。查阅了flask文档,About Responses,可以直接构造响应结果进行返回。

  If a tuple is returned the items in the tuple can provide extra information. Such tuples have to be in the form (response, status, headers) or (response, headers) where at least one item has to be in the tuple. The status value will override the status code and headers can be a list or dictionary of additional header values.

  

_headers = {
    ‘Accept‘:‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8‘,
    ‘Accept-Encoding‘:‘gzip, deflate, br‘,
    ‘Accept-Language‘:‘zh-CN,zh;q=0.8‘,
    ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36‘
}
def proxy(url, try_times=0):
    headers = dict(_headers)
    headers[‘Host‘] = re.match(r‘https?://([^/?]+)‘, url).group(1)
    response =  requests.get(url, headers=headers, timeout=5, allow_redirects=False)  #禁用自动跳转,因为跳转后Host可能会变,需要重新计算
    if  300 < response.status_code < 400 and try_times < 3:
        url = response.headers.get(‘Location‘)
        if url.startswith(‘/‘):
            return redirect(url, code=response.status_code)  #相对地址,特殊处理
        try_times += 1
        return proxy(url, try_times)
    return response.content, response.status_code, response.headers.items()

  这段代码在大部分情况下都运行良好。flask服务端显示相应正常,浏览器也看到有返回相应,偶尔浏览器出现ERR_CONTENT_DECODING_FAILED错误。看英文错误应该是,内容解码错误。

看了下requests的相应头中有,Content-Encoding: gzip,显示了网页内容进过gzip压缩。而requests会对部分压缩的内容进行解码:The gzip and deflate transfer-encodings are automatically decoded for you.

  知道原因了,解决办法也很容易。1、删除相应头中的Content-Encoding,因为经过requests之后,返回给浏览器的已经不是压缩的内容了。2、重新计算Content-Length

def make_response(response):
    headers = dict(response.headers)
    content_encoding = headers.get(‘Content-Encoding‘)
    if content_encoding == ‘gzip‘ or content_encoding == ‘deflate‘:
        del headers[‘Content-Encoding‘]
    if headers.get(‘Transfer-Encoding‘):
        del headers[‘Transfer-Encoding‘]
    if headers.get(‘Accept-Ranges‘):
        del headers[‘Accept-Ranges‘]
    headers[‘Content-Length‘] = len(response.content)
    return response.content, response.status_code, headers.items()
时间: 2024-09-30 12:00:17

在flask中返回requests响应的相关文章

Flask中的Templates

1.什么是模板 模板 , 在Flask 中就是允许响应给用户看的网页 在模板中,允许包含"占位变量"来表示动态的内容 模板最终也会被解析成字符串再响应给客户端,这一过程通常称为"渲染" Flask中的模板是依赖于 Jinja2 的模板系统 2.模板的设置 默认情况下,Flask会在程序文件夹中的 templates 的子文件夹中搜索模板 默认情况下,需要手动创建 templates 文件夹 3.模板的渲染 作用:在视图中,将模板文件(xx.html)渲染成字符串之后

Flask框架 请求与响应 &amp; 模板语法

目录 Flask框架 请求与响应 & 模板语法 简单了解Flask框架 Flask 框架 与 Django 框架对比 简单使用Flask提供服务 Flask 中的 Response(响应) Flask 中的 Request(请求) Flask 模板语言简单使用 Flask框架参考手册 原文地址:https://www.cnblogs.com/guokaifeng/p/11587311.html

Flask中的http请求与响应

参考:<Flask web开发> Flask 上下文全局变量 Flask使用上下文临时将某些对象变为全局可访问.在Flask中有两种上下文:应用上下文和请求上下文. 变量名 上下文 说明 current_app 应用上下文 当前应用的应用实例 g 应用上下文 处理请求时用作临时存储的对象,每次请求都会重设这个对象 request 请求上下文 请求对象,封装了客户端发出的HTTP请求中的内容 session 请求上下文 用户会话,值为一个字典,存储请求之间需要"记住"的值 请

Flask 中 @app.before_request、@app.after_request 和 @app.teardown_request

Flask 中 @app.before_request.@app.after_request 和 @app.teardown_request flask中又两种 context(上下文),分别是 application context 和 request context. 其中 request 就是 request context.当 HTTP 请求过来的时候,进入这个上下文. 题主的那些方法都是一些 flaks 的 hooks.用于针对 request 做一些操作,比如 before_requ

Flask中的请求钩子

请求勾子在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子. 请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子: before_first_request 在处理第一个请求前执行 before_request 在每次请求前执行 如果在某修饰的函数中返回了一个响应,视图函数将不

flask 中的ORM

1 响应(response) 1 什么是响应 响应就是由服务器端带给客户端的内容,对应着请求,响应可以是普通的字符串,模板 或重定向 return '普通字符串' return render_template('xxx.html') 2 响应对象 响应对象:将响应的内容封装到一个对象中,可以完成更多的响应的行为(如:增加cookies,..) 在Flask中,使用 make_response() 构建响应对象 2 文件上传 1 注意问题 表单中如果有文件上传的话,必须遵循以下两个要求 1 提交方

flask中请求勾子

请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: *在请求开始时,建立数据库连接; *在请求开始时,根据需求进行权限校验; *在请求结束时,指定数据的交互格式; 为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子. 请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子: ①before_first_request 在处理第一个请求前执行 ②before_request 在每次请求前执行 如果在某修饰的函数中返回了一个响应,

flask中的response

1.Response 在flask中你想向前端返回数据,必须是Response的对象,这里和django必须是HttpResponse 对象一样, 主要将返回数据的几种方式 视图函数中return 字符串 from flask import Flask app = Flask(__name__) @app.route("/index") def index(): return "index.html" if __name__ == "__main__&qu

Flask中session实现原理

前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活. flask的session机制 session是用来干什么的呢?由于http协议是一个无状态的协议,也就是说同一个用户第一次请求和第二次请求是完全没有关系的,但是现在的网站基本上有登录使用的功能,这就要求必须实现有状态,而session机制实现的就是这个功能. 实现的原理: 用户第一次请求后,将