您的位置:首页 > 理论基础 > 计算机网络

Django学习——视图层HttpResponse、render、redirect本质、JsonResponse

2022-04-30 21:03 856 查看 https://www.cnblogs.com/qiaope

HttpResponse、render、redirect本质

django视图函数必须要返回一个HttpResponse对象

def render(request, template_name, context=None, content_type=None, status=None, using=None):
"""
Return a HttpResponse whose content is filled with the result of calling
django.template.loader.render_to_string() with the passed arguments.
"""
content = loader.render_to_string(template_name, context, request, using=using)
return HttpResponse(content, content_type, status)

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]

def __iter__(self):
return iter(self._container)

def write(self, content):
self._container.append(self.make_bytes(content))

def tell(self):
return len(self.content)

def getvalue(self):
return self.content

def writable(self):
return True

def writelines(self, lines):
for line in lines:
self.write(line)

redirect内部是继承了HttpResponse类

JsonResponse

需求:给前端返回json格式数据
方式1:自己序列化
# res = json.dumps(d,ensure_ascii=False)
# return HttpResponse(res)
方式2:JsonResponse
import json
from django.http import JsonResponse
def func2(request):
d = {'user':'jason好帅','password':123}
return JsonResponse(d)

ps:额外参数补充

json_dumps_params={'ensure_ascii':False}  # 看源码
safe=False  # 看报错信息

# JsonResponse返回的也是HttpResponse对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: