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 = 302HttpResponse对象: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 responseHttpResponse对象: JsonResponse函数
JsonResponse函数:响应一个JSON对象
示例:
from django.http import JsonResponse 
def test_response(request): 
    res = {'foo': 'bar'} 
    return JsonResponse(res)
