Flask 更改服务器标头

问题描述 投票:0回答:8

我做了一个简单的烧瓶应用程序:

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
host:google.be

HTTP/1.0 404 NOT FOUND
Content-Type: text/html
Content-Length: 233
Server: Werkzeug/0.9.6 Python/2.7.6
Date: Mon, 08 Dec 2014 19:15:43 GMT

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>404 Not Found</title>
<h1>Not Found</h1>
<p>The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.</p>
Connection closed by foreign host.

我想要更改的一件事是服务器标头,目前它被设置为

Werkzeug/0.9.6 Python/2.7.6
我自己选择的东西。但我似乎在文档中找不到有关如何执行此操作的任何内容。

python flask werkzeug
8个回答
13
投票

您可以使用 Flask 的 make_response 方法来添加或修改 headers。

from flask import make_response

@app.route('/index')
def index():
    resp = make_response("Hello, World!")
    resp.headers['server'] = 'ASD'
    return resp

8
投票

@bcarroll 的答案有效,但它将绕过原始 process_response 方法中定义的其他进程,例如设置会话 cookie。 为了避免上述情况:

class localFlask(Flask):
    def process_response(self, response):
        #Every response will be processed here first
        response.headers['server'] = SERVER_NAME
        super(localFlask, self).process_response(response)
        return(response)

5
投票

您可以通过重写 Flask.process_response() 方法来更改每个响应的服务器标头。

    from flask import Flask
    from flask import Response

    SERVER_NAME = 'Custom Flask Web Server v0.1.0'

    class localFlask(Flask):
        def process_response(self, response):
            #Every response will be processed here first
            response.headers['server'] = SERVER_NAME
            return(response)

    app = localFlask(__name__)


    @app.route('/')
    def index():
        return('<h2>INDEX</h2>')

    @app.route('/test')
    def test():
        return('<h2>This is a test</h2>')

http://flask.pocoo.org/docs/0.12/api/#flask.Flask.process_response


3
投票

如果您使用像gunicorn这样的生产服务器,则覆盖代码中的服务器标头不起作用。更好的方法是在gunicorn后面使用代理服务器并更改服务器标头。


3
投票

TL;DR - 覆盖

/python3.8/http/server.py
send_response 方法。注释服务器标头添加行。

为什么? 在 Flask 中添加/操作标头(以上述任何方式)将使用已配置的标头从 Flask 触发到 Web 服务器的响应,但 WSGI 逻辑(在 Flask 逻辑之后和之前独立发生)将是最后一个修改的逻辑这些值(如果有)。

在你的情况(Werkzeug)中,一些标头被硬编码在 python http 模块中,werkzeug 依赖于此。服务器标头就是其中之一。


0
投票

简单方法:

@app.after_request
def changeserver(response):
    response.headers['server'] = SERVER_NAME
    return response

0
投票
@app.after_request
def changeserver(response):
    response.headers['server'] = SERVER_NAME
    return response

这只是添加了新的服务器头,但原来的仍然在这里......


0
投票

其他答案都没有真正起作用,他们只是添加了第二个“服务器”标头,但没有删除原来的标头。

如果你真的想覆盖现有的标头,你可以这样:

import http
http.server.BaseHTTPRequestHandler.version_string= lambda x: "SERVER_NAME"
© www.soinside.com 2019 - 2024. All rights reserved.