Django内置函数

HTTP请求流程

HttpRequest对象

HttpRequest对象:常用属性

Django会建立一个包含请求源数据的HttpRequest对象,当Django加载对应的视图时,HttpRequest 对象将作为函数视图的第一个参数(request),每个视图负责返回一个HttpResponse对象。

例如:

def index(request):
return HttpResponse("首页")

HttpRequest对象:常用方法

HttpRequest对象:接收URL参数

URL参数形式:http://www.baidu.cn/demo/?id=1&value=100

def url_args(request): 
args1 = request.GET['a']
args2 = request.GET['b']
return HttpResponse(int(args1) + int(args2))

HttpRequest对象:QueryDict对象

request.GET和request.POST返回的都是一个QueryDict对象,类似于字典。

def index(request): 
req = request.GET
print(type(req))
return HttpResponse("首页")

HttpRequest对象:小结

request对象应用场景:

  • 获取客户端信息、请求页面情况

  • 接收客户端上传的数据,例如文件

  • 根据客户端特定信息做相应的处理,例如根据请求方法

HttpResponse对象

HttpResponse对象:HttpResponse函数

HttpResponse函数:给浏览器返回数据。

语法:HTTPResponse(content=响应体,content_type=响应体数据类型,status=状态码)

示例:返回HTML内容

from django.http import HttpResponse
def hello(request):
return HttpResponse("<h1>Hello Django!<h1>")

示例:设置响应头

from django.http import HttpResponse
def hello(request):
res = HttpResponse("Hello APP!")
res['name'] = "amei"
res.status_code = 302

HttpResponse对象:render函数

render指定模板,返回一个渲染后的HttpResponse对象。

语法:render(request, template_name, context=None, content_type=None, status=None, using=None)

  • request:固定参数,django封装的请求

  • template_name:返回html模板

  • context:传入模板中的内容,用于渲染模板,默认空字典

示例:

from django.shortcuts import render
from datetime import datetime
def current_datetime(request):
now = datetime.now()
return render(request, 'demo.html', {'datetime': now})

HttpResponse对象:redirect函数

redirect函数:重定向,发起第二次请求

语法:redirect(to, *args, **kwargs)

参数可以是:

  • 一个视图

  • 一个绝对的或者相对的URL

  • 一个模型,对象是重定向的URL

示例:

from django.shortcuts import redirect
def test_redirect(request):
return redirect('https://www.baidu.com')

HttpResponse对象:StreamingHttpResponse函数

StreamingHttpResponse函数:流式响应可迭代对象,一般用于响应大数据内容

示例:下载文件

URL路由:

re_path('^download/$', views.download), 
re_path(r'^down_file/(?P<filename>.*)$', views.down_file, name="down_file")

视图:

from django.http import StreamingHttpResponse
import os
def download(request):
file_list = os.listdir('upload')
return render(request, "download.html", {'file_list': file_list})
def down_file(request, filename):
file_path = os.path.join('upload', 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

模板:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件列表</title>
</head>
<body>
{% for i in file_list %}
<p><a href="{% url 'down_file' i %}">{{ i }}</a></p>
{% endfor %}
</body>
</html>

HttpResponse对象: FileResponse函数

FileResponse函数: StreamingHttpResponse的子类,针对文件提供响应

示例:下载文件

def down_file(request, filename): 
file_path = os.path.join('upload', filename)
response = FileResponse(open(file_path, 'rb'))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment; filename=%s' %(os.path.basename(file_path))
return response

HttpResponse对象: JsonResponse函数

JsonResponse函数:响应一个JSON对象

示例:

from django.http import JsonResponse 
def test_response(request):
res = {'foo': 'bar'}
return JsonResponse(res)