【问题标题】:Append a new Http header using django request.META使用 django request.META 附加一个新的 Http 标头
【发布时间】:2019-10-03 13:13:52
【问题描述】:

我正在使用 django-rest 框架,我可以使用以下 META 信息获取和设置自定义标头,

class log_middleware:
def __init__(self, get_response):
    self.get_response = get_response
    # One-time configuration and initialization.

def __call__(self,request):
    # set thread local values
    # This will execute before every request
    correlation_id = request.META['HTTP_X_REQUEST_ID'] if 'HTTP_X_REQUEST_ID' in request.META else str(uuid.uuid4())
    request.META['HTTP_X_REQUEST_ID'] = correlation_id

    #logger.debug("Entered service")

    response = self.get_response(request)

    response['HTTP_X_REQUEST_ID'] = correlation_id

    #logger.debug("Processed response")
    return response

现在在我的views.py 中,我可以将此标头作为request.META['HTTP_X_REQUEST_ID'] 获取。它在响应头中可用

但是当我尝试使用以下配置在 uwsgi 中记录 http 标头值时,它有“-”空值字段。因为 uwsgi 在 %var.XXX 变量中只有实际的请求标头,而响应标头转到 %headers ,它只显示计数和实际值。 问题:https://github.com/unbit/uwsgi/issues/1407

那么在 django 中是否有任何方法可以将数据附加到实际请求标头而不是响应标头中?

[uwsgi]
master = 1
memory-report = true
module = my_service.wsgi
http = 0.0.0.0:8080
max-requests = 50
processes = 16
log-format = { "ctime": "%(ctime)", "addr": "%(addr)", "method": "%(method)", "uri": "%(uri)", "correlation_id": "%(var.HTTP_X_REQUEST_ID)" }

但是,如果我在从其余客户端实用程序发送请求本身时设置标头 HTTP_X_REQUEST,则同样的事情。

【问题讨论】:

    标签: django django-rest-framework uwsgi django-request


    【解决方案1】:

    如果需要中间件,可以使用这个:

    中间件.py:

    def add_header_middleware(get_response):
        def middleware(request):
            request.META['hello'] = 'world'
            response = get_response(request)
            response['world'] = 'hello'
            return response
        return middleware
    

    views.py:

    @api_view(['GET'])
    def sample_view(request):
        return Response(request.META['hello'])
    

    settings.py:

    MIDDLEWARE = [
        # ...
        'your_app.middlewares.add_header_middleware'
    ]
    

    【讨论】:

    • 好的,我使用了 MiddlewareMixin,但是这个接缝在更新版本中。所以我需要在 2 次执行此操作,一次是在 process_request(上面会起作用),另一次是在 process_response(因为我还需要发送这些标头作为响应),以便 uwsgi 将数据记录在标头中。跨度>
    • @NaggappanRamukannan 不,您不必制作 2 个中间件。我添加了 cmets,您可以在其中修改响应。只需阅读official docs on middlewares
    • 谢谢,这没关系,但这仅存在于 django 请求中。当它发出时它是不可用的。当我使用 runserver 它工作。但是当我使用 uwsgi 时,它在捕获响应并记录该标头时没有新标头。但是当标头从客户端本身发送时,它在 uwsgi 日志中可用
    • 提供您的代码 - 视图、中间件和整个 MIDDLEWARE 堆栈。
    • 至少我的 gunicorn + nginx 返回自定义标头就好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2011-02-21
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多