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,并查看响应头

py_response_header

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,鼠标移动到超链上,左下角会显示下载地址

py_down_file

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

py_test_json

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0