草庐IT

Python Flask 框架设置响应头,一篇文章学明白

梦想橡皮擦 2023-04-14 原文

flask 响应头设置

📖 导读

本篇博客我们将全面了解 Flask 中关于请求的相关设置,开始前你需要先配置 Flask 的基础框架。

from flask import Flask, make_response

app = Flask(__name__)


@app.route('/')
def index():
    response = make_response("Hello, 梦想橡皮擦")
    response.headers['Content-Type'] = 'text/html; charset=utf-8'
    return response


if __name__ == '__main__':
    app.run()

运行代码,得到下述效果。

📖 Python Flask 设置响应头

🎉 response.headers 属性

response.headers 是 Flask 框架中的一个属性,它是一个字典类型,用于存储响应头信息。这个属性可以在视图函数中直接使用,用于设置响应头的信息。

比如在视图函数中,可以使用下面的代码来设置 Content-Type 响应头:

response.headers['Content-Type'] = 'text/plain'

如果你想要设置其它响应头,可以使用同样的方式,例如:

response.headers['X-My-Header'] = 'Xiang_Pi_Ca'

通过开发者工具,可以查看到自定义的响应头内容。

注意,在设置响应头之前,你需要创建一个响应对象。可以使用 flask.make_response() 函数来创建一个响应对象,例如:

from flask import make_response

response = make_response("Hello, Xiang_Pi_Ca!")
response.headers['Content-Type'] = 'text/plain'

🎉 flask.abort() 函数返回特定状态码

使用 flask.abort() 函数来返回特定状态码的响应,并设置响应头。例如,在请求中包含无效参数时返回 400 Bad Request:

from flask import Flask, abort

app = Flask(__name__)


@app.route('/')
def index():
    # 模拟参数错误
    invalid_parameter = True
    if invalid_parameter:
        abort(400)
    return "Hello, Xiang_Pi_Ca!"

if __name__ == '__main__':
    app.run()

代码运行效果:

📖 Flask 中可设置的响应头参数

在 Flask 中,你可以设置任何 HTTP 协议定义的响应头参数。

  • 常用的响应头包括:
    • Content-Type:用于指定响应体的 MIME 类型。例如,'Content-Type': 'text/html' 表示响应体是 HTML 文档。
    • Content-Length: 用于指定响应体的长度。
    • Location:用于重定向。例如,'Location': 'https://pachong.vip' 会导致浏览器重定向到 https://pachong.vip
    • Cache-Control: 用于控制缓存,例如,'Cache-Control': 'no-cache' 表示浏览器不应缓存响应。
    • Expires: 用于指定缓存过期时间。
    • Etag:用于指定资源的 ETag 值。
    • Server: 用于指定服务器的名称和版本。
    • Access-Control-Allow-Origin: 用于控制跨域资源共享。

📖 其他关于响应头的配置

除了在视图函数中设置响应头之外,Flask 还提供了其他方式来配置响应头。

🎁 使用中间件

中间件可以在请求和响应之间添加额外的处理。你可以使用中间件来设置响应头。

中间件是一种在请求和响应之间添加额外处理的机制,可以使用中间件来设置响应头。

下面的代码实现了一个中间件,在每个请求之前设置 Content-TypeX-My-Ca 响应头。

from flask import Flask, request,make_response

app = Flask(__name__)


@app.before_request
def before_request():
    response = make_response()
    response.headers['Content-Type'] = 'application/json'
    response.headers['X-My-Ca'] = 'xiangpica_demo'
    return response


@app.route('/')
def index():
    return "Hello, 梦想橡皮擦!"

🎁 使用装饰器

装饰器是一种在不改变视图函数本身的情况下添加额外处理的方法。

下面的代码实现了一个装饰器,在每个视图函数执行之前设置 Content-TypeX-My-Ca 响应头。

from flask import Flask, request, make_response
from functools import wraps

app = Flask(__name__)


def set_headers(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        response = make_response(f(*args, **kwargs))
        response.headers['Content-Type'] = 'application/json'
        response.headers['X-My-Header'] = 'xiangpica_demo_'
        return response

    return decorated_function


@app.route('/')
@set_headers
def index():
    return "Hello, 梦想橡皮擦!"


if __name__ == '__main__':
    app.run()

上述代码可以实现每当路由被调用时,装饰器都会在视图函数之前设置 Content-TypeX-My-Ca 响应头。

🎁 使用配置

应用程序配置是一种在不修改应用程序代码的情况下更改应用程序行为的方法。

from flask import Flask,  make_response

app = Flask(__name__)
app.config.update(
    RESPONSE_HEADERS={
        'Content-Type': 'application/json',
        'X-My-Ca': 'xiangpica_demo_'
    }
)


@app.route('/')
def index():
    response = make_response()
    for key, value in app.config['RESPONSE_HEADERS'].items():
        response.headers[key] = value
    return response


if __name__ == '__main__':
    app.run()

上述代码在配置中定义了 'Content-Type''X-My-Ca' 两个响应头,在路由函数中就可以使用 make_response() 函数来创建响应对象,然后遍历配置中的响应头来添加响应头了,该写法的优点是,我们可以在不修改应用程序代码的情况下更改响应头, 也可以根据环境来设置不同的响应头。

🎁 使用第三方扩展

Flask 有许多第三方扩展可以帮助你更简单的配置响应头, 比如 Flask-Cors,Flask-Security 等,这些内容以后用单独的博客进行说明。

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 843 篇原创博客

从订购之日起,案例 5 年内保证更新

有关Python Flask 框架设置响应头,一篇文章学明白的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  3. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  4. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  5. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  6. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  7. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  8. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  9. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

    我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

  10. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

随机推荐