Python中Django框架的HttpResponse头部设置问题

刚刚去看了 DJango http 的 Response 的源码,但是好像没看到头部内容组装的部分,那有大神能够解答它 Response 头部的参数是那里来的吗?感谢万分
Python中Django框架的HttpResponse头部设置问题

11 回复

在Django里设置HttpResponse的头部,直接用HttpResponse对象的headers属性就行,这是个类似字典的东西。比如你想加个自定义的X-Custom-Header

from django.http import HttpResponse

def my_view(request):
    response = HttpResponse("Hello, world!")
    response.headers['X-Custom-Header'] = 'MyValue'
    # 或者用 response['X-Custom-Header'] = 'MyValue' 也行,老式写法
    return response

检查返回的响应,X-Custom-Header: MyValue肯定在头里了。

几个关键点:

  1. headers属性:Django 3.2+ 推荐用这个,它就是个字典。Django 2.2 之前可能得用__setitem__(就是response['Header'] = value)。
  2. 内容类型:通过content_type参数设置,比如HttpResponse("data", content_type="application/json")。别在headers里手动写Content-Type,容易冲突。
  3. 状态码:构造函数里设,HttpResponse("...", status=201)
  4. 删除头部del response.headers['Header-Name']
  5. 批量设置:直接给headers赋个字典:response.headers = {'Header1': 'val1', 'Header2': 'val2'}

如果你想在中间件里统一加头部,可以这样:

class CustomHeaderMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        response.headers['X-Processed-By'] = 'MyDjangoApp'
        return response

然后去settings.pyMIDDLEWARE里加上这个中间件。

总之,操作response.headers字典就是标准做法。

总结建议:用response.headers这个字典来管理头部最直接。

请问用的什么软件?

谢谢。
😅😅😅表示没有 mac,只能看着眼馋😍😍😍

windows 也有类似的,你可以试试这个 https://zealdocs.org/

我的意思是你 Header 这里不是空的吗?但是最后 response 出来 header 有东西的,那些是在哪里填写的

这部分你可以看源码,是后面设置了__setitem__函数加上去的,参数包括 header,value,先把 header 和 value 用内建的函数重新编码,然后一次性加入_header 字典中,接着是 serialize_headers 函数获取 header 以 bytestring 的格式传给__bytes__或者__str__,然后通过 setdefault 函数设置默认 header 如果预先没有设置 header。

以上就是我从 Django 的源码得到的部分,如果有误请指正

非常感谢



其实在这个地方还是没有写

def _convert_to_charset(self, value, charset, mime_encode=False):
“”"
Convert headers key/value to ascii/latin-1 native strings.
charset must be ‘ascii’ or ‘latin-1’. If mime_encode is True and
value can’t be represented in the given charset, apply MIME-encoding.
“”"
if not isinstance(value, (bytes, str)):
value = str(value)
if ((isinstance(value, bytes) and (b’\n’ in value or b’\r’ in value)) or
isinstance(value, str) and (’\n’ in value or ‘\r’ in value)):
raise BadHeaderError(“Header values can’t contain newlines (got %r)” % value)
try:
if isinstance(value, str):
# Ensure string is valid in given charset
value.encode(charset)
else:
# Convert bytestring using given charset
value = value.decode(charset)
except UnicodeError as e:
if mime_encode:
value = Header(value, ‘utf-8’, maxlinelen=sys.maxsize).encode()
else:
e.reason += ‘, HTTP response headers must be in %s format’ % charset
raise
return value

def setitem(self, header, value):
header = self._convert_to_charset(header, ‘ascii’)
value = self._convert_to_charset(value, ‘latin-1’, mime_encode=True)
self._headers[header.lower()] = (header, value)

所以他默认 header 还是空的,只要你不创建 response 实例时候没有初始化 header,所以还是没有解答我的问题,因为一般都是使用 render_to_response 或者 response 直接创建相应的,但是 header 我们一般都没有填充,那到底是哪里填充的(就是在哪里实例化的时候框架帮我们填了 header 我还是没有找到)

这个是 Django 的中间件自动来帮我们填充的 header,比如说你在 settings 文件没有添加了 DEFAULT_CONTENT_TYPE,也没用在其它地方配置,那么中间件自动就填充。

回到顶部