django视图
727字约2分钟
2024-09-29
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)