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)
因为 content
是 def __init__(self, content=b'', *args, **kwargs):
中定义的关键字参数吗?
Q2:装饰器@content.setter
在哪里定义的?
Q3:属性self._container
定义的时间和地点?
Q4:命令return HttpResponse(html)
的一切如何运作?
找到了类似的问题,但我完全没看懂答案。
Q1: python 关键字参数同时接受 ordered arguments without keyword
和 unordered 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
.
一起生效
如果你不熟悉 setter
和 getter
。我给你一个 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 总是使用调试来研究框架。
我正在研究 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)
因为 content
是 def __init__(self, content=b'', *args, **kwargs):
中定义的关键字参数吗?
Q2:装饰器@content.setter
在哪里定义的?
Q3:属性self._container
定义的时间和地点?
Q4:命令return HttpResponse(html)
的一切如何运作?
找到了类似的问题
Q1: python 关键字参数同时接受 ordered arguments without keyword
和 unordered 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
.
一起生效
如果你不熟悉 setter
和 getter
。我给你一个 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 总是使用调试来研究框架。