likes
comments
collection
share

Django视图函数响应“三剑客”

作者站长头像
站长
· 阅读数 13

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

Django视图对请求做出响应经常用到Http Response()、render()、redirect() 3个函数,它们被称为视图函数的“三剑客”

Http Response()函数

render()函数

render()函数由django.shortcuts模块提供,其功能是根据模板文件和传给模板文件的字典类型的变量,生成一个Http Response对象并返回。

函数格式为

render(request, template_name, context=None,content_type=None, status=None)
  • request:位置参数,代表传给视图函数的Web请求,封装了请求头的所有数据,其实就是视图参数request。

  • template_name:必选位置参数,指的是要使用的模板文件的名称,一般是放在templates目录下的HTML文件。

  • context:可选参数,数据是字典类型,默认是一个空字典,保存要传到HTML文件中的变量。

  • content_type:可选命名参数,用于设置生成的文档的MIME(MultipurposeInternet Mail Extension,多用途互联网邮件扩展)类型。默认为DEFAULT_CONTENT_TYPE的值text/html。

  • status:可选参数,表示响应的状态代码,默认为200。

    例子:

    from django.shortcuts import renderdef test_view(request):
    # 视图的代码写在这里
    def xxx(request):
    	xxxxxxx
    	return render(request, 'index.html', {'welcome': 'hello world!'} ,content_type='text/html')
    
    # 传递变量名为welcome值为'hello world!'的变量
    

redirect()函数

redirect()函数接收一个参数,表示让浏览器跳转到指定的 URL;这个参数可以是数据模型(Model)对象、视图函数名称或URL。

参数是一个数据模型(Model)对象时

redirect()函数将调用数据模型中定义的get_absolute_url()函数,并取得该函数返回的URL值,然后跳转到该URL。

例子

urls.py:

.....
path('dep/<int:dep_id>/',views.depdetail,name='depdetail'),
path('test_redirect/',views.test_redirect),
....

models.py:

#导入数据模块
from django.db import models
# 导入反向解析函数
from django.urls import reverse
# 部门数据模型(部门数据表)
class department(models.Model):
    # 部门名称,为字符类型
    dep_name=models.Char Field(max_length=32,verbose_name='部门名称',unique=True, blank=False)
    # 部门备注说明
    dep_script=models.Char Field(max_length=60,verbose_name='备注',null=True)
    # 数据模型的get_absolute_url()方法
    def get_absolute_url(self):
# 反向解析URL,解析成/dep/ self.pk /
		return reverse('depdetail',kwargs={'dep_id':self.pk})
# 在数据模型department中定义了一个函数get_absolute_url(),该函数返回一个URL。

reverse()是URL反向解析函数,它的第一个参数的值是'depdetail',它是名字为depdetail的URL配置项。reverse的解析过程是:找到当前应用test_view下urls.py中名字为depdetail的配置项,reverse()函数会找到对应的URL,根据传给它的字典类型参数(kwargs={'dep_id':self.pk})进行组合,最终解析生成完整的URL。

views.py:

from django.shortcuts 
import render,Http Response,redirect
from . import models
def depdetail(request,dep_id):
    # 根据传入的参数值取出一条记录
    obj=models.department.objects.get(id=dep_id)
    # 返回Http Response对象
    return Http Response('部门:'+obj.dep_name+',备注:'+obj.dep_script)
def test_redirect(request):
    obj=models.department.objects.get(id=1)
    # 用redirect()重定向,参数是数据模型对象,所以重定向到数据模型get_absolute_url生成的URL
    # 这个URL对应视图函数views.depdetail(),实际上调用这个函数
    return redirect(obj)

视图函数test_redirect()中有一个redirect()函数,这里的redirect()函数运行流程分为以下3步。

  • 由于传入redirect()函数的参数obj是一个数据模型实例对象(数据记录),这个对象的数据模型类是department,因此调用该对象的get_absolute_url()方法。
  • get_absolute_url()通过reverse()函数把URL配置项名字和obj的id当作参数反向解析出一个URL并返回给redirect()函数,这个URL形如“/dep/1/”。
  • reverse()函数得到URL后去urls.py文件中找匹配关系,找到对应视图函数为depdetail(),最后执行这个函数。

参数是视图函数名称时

redirect()函数通过视图函数名称和视图函数参数反向解析出URL并重定向到这个URL。下面的代码传入了一个视图函数名称depdetail和参数

def test_redirect(request):
# 视图函数depdetail()有参数dep_id
	return redirect('depdetail',dep_id=2)

这里的redirect()函数的执行过程是首先反向解析出URL,到urls.py文件中找到URL对应的视图函数,执行视图函数depdetail()。在外部看可以这样理解,通过redirect()直接调用了视图函数depdetail()。

参数是完整的URL时

redirect()函数直接打开这个URL指向的网页。参数有http://作前缀,才算完整的URL,如:return redirect('http://127.0.0.1:8000/dep/2/')和return redirect('http://网址/')。

参数是URL

但不带http://和https://时,redirect()函数会到urls.py文件中寻找匹配,如果有匹配就定向到这个URL并执行对应的视图函数,如果没有匹配则直接重定向到这个地址。

return redirect('/dep/66/')