django.http 源代码中的内容函数

content function in django.http source code

我正在研究 Django Official Docs

中的以下代码
from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

然后深入django.http

的源码
class HttpResponse(HttpResponseBase):
    """
    An HTTP response class with a string as content.
    This content can be read, appended to, or replaced.
    """

    streaming = False

    def __init__(self, content=b'', *args, **kwargs):
        super().__init__(*args, **kwargs)
        # Content is a bytestring. See the `content` property methods.
        self.content = content

    def __repr__(self):
        return '<%(cls)s status_code=%(status_code)d%(content_type)s>' % {
            'cls': self.__class__.__name__,
            'status_code': self.status_code,
            'content_type': self._content_type_for_repr,
        }

    def serialize(self):
        """Full HTTP message, including headers, as a bytestring."""
        return self.serialize_headers() + b'\r\n\r\n' + self.content

    __bytes__ = serialize

    @property
    def content(self):
        return b''.join(self._container)

    @content.setter
    def content(self, value):
        # Consume iterators upon assignment to allow repeated iteration.
        if (
            hasattr(value, '__iter__') and
            not isinstance(value, (bytes, memoryview, str))
        ):
            content = b''.join(self.make_bytes(chunk) for chunk in value)
            if hasattr(value, 'close'):
                try:
                    value.close()
                except Exception:
                    pass
        else:
            content = self.make_bytes(value)
        # Create a list of properly encoded bytestrings to support write().
        self._container = [content]

Q1: 我们不应该使用 return HttpResponse(content=html) 因为 contentdef __init__(self, content=b'', *args, **kwargs): 中定义的关键字参数吗?

Q2:装饰器@content.setter在哪里定义的?

Q3:属性self._container定义的时间和地点?

Q4:命令return HttpResponse(html)的一切如何运作?

找到了类似的问题,但我完全没看懂答案。

Q1: python 关键字参数同时接受 ordered arguments without keywordunordered arguments with keyword。并且关键字参数总是带有默认值 values.I 会给你一个例子。

def f(a=0,b=0,c=0):
    pass

f(1,2,3)
f(a=1,b=2,c=3)
f(1,b=2,c=3)
#they call funciton f with same arguments

Q2:@content.setter是属性decorator.it与@property.
一起生效 如果你不熟悉 settergetter。我给你一个 brief:We 可以直接给对象的 属性 一个值,但是如果我们想做一些转换或检查,然后我们可以使用 属性 装饰器。
这是Python doc about property decorator。你可以阅读它。


Q3:我不确定this.maybe有些可以提供更好的answer.but我想self._container不需要定义。_container将由[=13=初始化],如果 _container 在 init 之前被调用,它会抛出一个错误,这可能是作者的意图,因为你不能 return 一个不好的 init HttpResponse。


Q4:如果你真的对return HttpResonse(html)如何感兴趣work.I建议你在visual studio中使用调试mode.it的easy to 运行调试模式代码或 pycharm 或任何其他流行的 IDE.
然后你可以 运行 代码一步 step.at 你可以调查 context.trust 中的每个变量 我非常 helpful.I 总是使用调试来研究框架。