HttpRequest对象是用户请求服务端时的一些客户端信息,而HttpResponse对象则是服务器接受到客户端请求时,要给客户端返回内容的信息
HttpResponse对象:HttpResponse函数
HttpResponse函数:给浏览器返回数据
语法:HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
看下如何自定义响应头,使用之前的 index 做示例:
# myapp/views.py
def index(request):
res = HttpResponse("Hello, Django!")
res["name"] = 'FeiYi'
return res
访问 http://localhost:8000
,并查看响应头
HttpResponse对象:render函数
render指定模板,返回一个渲染后的 HttpResponse 对象。前面的文章示例中就是使用 render 函数来返回 html 模板的。
语法:render(request, 模板名字, context=None, content_type=None, status=None, using=None)
从语法上来看就是一个升级版的 HttpResponse 函数。
- request:固定参数,django封装的请求
- 模板名字:指定html模板,会自动读取项目根目录下的 templates 文件夹中指定的模板
- context:传入模板中的内容,用于渲染模板,字典格式。
这个就不做示例了,可以参考前面的内容
HttpResponse对象:redirect函数
redirect 函数其实前面也用到了,在做登录示例的时候,进行页面跳转
redirect 函数:重定向,发起二次请求
语法:redirect(to, *args, **kwargs)
参数可以是一个视图,一个绝对或相对的URL,一个模型,对象是重定向的URL
这个也很简单,不做示例了
HttpResponse对象:StreamingHttpResponse函数
StreamingHttpResponse函数:流失响应可迭代对象,当响应的数据较大时,可将数据进行流式传输,减少内存占用
以下载文件为示例:
创建url
# devops/urls.py
urlpatterns = [
...
path('download/', devops_views.download, name='download'),
re_path('down_file/(.*)$', devops_views.down_file, name='down_file')
]
创建视图中的函数
# devops/views.py
def download(request): # 展示文件列表
file_list = os.listdir('uploads')
return render(request, 'download.html', {'file_list': file_list})
def down_file(request, filename): # 文件下载url的拼接
file_path = os.path.join('uploads', filename)
response = StreamingHttpResponse(open(file_path, 'rb'))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment; filename=%s' % (os.path.basename(file_path)) # 指定下载的文件名
return response
创建一个 html 模板
# templates/download.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<h1>文件下载</h1>
<h2>文件列表:</h2>
{% for i in file_list %} # html的for循环展示文件列表
{{ i }}
# 超链的完整拼接
{% endfor %}
</body>
</html>
访问 http://localhost:8000/download
,鼠标移动到超链上,左下角会显示下载地址
HttpResponse对象:FileResponse函数
FileResponse更适用于文件下载,会一次性读取整个文件内容到内存中(如果文件足够小),然后发送给客户端。对于大型文件,为了避免内存溢出,FileResponse 会使用适当的缓冲策略,分块读取文件并发送。
以上例子中的StreamingHttpResponse,可以直接替换为FileResponse进行使用
def down_file(request, filename):
file_path = os.path.join('uploads', filename)
response = FileResponse(open(file_path, 'rb')) # 此处替换即可
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment; filename=%s' % (os.path.basename(file_path)) # 指定下载的文件名
print(response)
return response
HttpResponse对象:JsonResponse函数
JsonResponse函数:响应一个json对象
创建url
urlpatterns = [
...
path('test_json', devops_views.test_json, name='test_json'),
]
创建视图
def test_json(request):
res = {'a': '123', 'b': '456'}
return JsonResponse(res)
访问 http://localhost:8000/test_json