Django中的视图函数相关知识点介绍

1、视图函数介绍

1.1、什么是视图函数

        Django中的视图是MTV模式中的view层,用户处理客户端的请求并生成响应数据。在视图中使用函数处理请求的方式,被称为视图函数。

        视图函数,本质就是Python函数,其的主要功能是接收请求、返回响应。在建立应用程序后,先在URL配置文件中加一条配置项指明URL与视图函数的对应关系。然后按照实际需求在视图函数中编写逻辑代码来实现相应的功能,返回一个HTTP响应,该响应必须是一个HttpResponse。

1.2、视图函数的底层原理

        视图函数主要使用HttpRequest对象(请求对象)和HttpResponse响应对象(响应对象)。当浏览器向服务端请求一个界面时,Django先创建一个HttpRequest对象(该对象中包含请求的元数据);然后加载相应的视图,将这个HttpRequest对象作为作为第一个参数传递给视图函数。

        经过视图函数内部一系列的处理后,返回一个HttpResponse对象。

2、视图函数位置

        所有的视图函数都应该放到views.py文件中,在项目文件夹中,没有这个文件需要用户自行创建,在应用文件夹中,该Python文件已创建好了。

3、视图函数的入参

        视图函数必须以HttpRequest对象作为第一个参数,参数建议使用request来命名。除了request外,视图函数还可以是,路由中通过路径转换器传过来的值,但参数值必须相同。

4、视图函数的返回值

        视图函数的返回值必须是一个HttpResponse对象。形式主要有三种:HttpResponse()函数;render函数通过调用模板实现内容的返回;视图重定向;错误视图。

4.1、HttpResponse()函数

        HttpResponse()函数直接返回一个HttpResponse对象,把传给它的文本解析成HTML格式发送给网页。如下面代码(需要手动导入from django.http import HttpResponse)。

def test(request):
    str ="<h1>测试成功</h1>"
    return HttpResponse(str)

4.2、用render()函数实现页面渲染

        在Django的模板系统中,可通过render()函数来完成渲染模板的功能。 能够根据模板文件和传递给模板文件的字典类型的变量,生成一个HttpResponse对象并返回,其语法结构是:

from django.shortcuts import render render(request,template_name,content=None,content_type=None,statu s=None)

request代表用于生成此响应的请求对象

template_name代表要渲染的模板文件的名称,一般放在templates目录下,需要自行创建

content代表要传递到模板的数据形成的数据字典

content_type代表模板文件的MIME类型,默认为text/html

status代表响应的状态码,默认为200

        render()函数返回HttpResponse对象,是更加简洁的输出。

ps:模板渲染还需在settings.py中完成响应配置,在TEMPLATES中的配置如下

# 指定模板文件存储的位置
'DIRS': [ BASE_DIR , 'templates'],
# 自动搜索应用目录
'APP_DIRS': True,

4.3、页面重定向

在Django中,重定向函数redirect()实现页面重定向,该函数的参数包含以下三种情况:

(1)调用模型的get_absolute_url()函数进行重定向

首先,在User模型中定义get_absolute_url()函数

class User(models.Model):
    id = models.AutoField(verbose_name="编号",primary_key=True)
    username = models.CharField(verbose_name="用户名称",max_length=30)
    password = models.CharField(verbose_name="密码",max_length=20)
    status = models.CharField(verbose_name="状态",max_length=1)
    createdate = models.DateTimeField(verbose_name="创建日期",db_comment="createDate")

    def __repr__(self):
        return str(self.id)

    def get_absolute_url(self):
        return reverse("app2_user",kwargs={"id":self.pk})

    class Meta:
        verbose_name = "人员基本信息"
        db_table = "User"

完成之后,执行数据迁移操作,命令如下:

python manage.py makemigrateions

python manage.py migrate

然后,定义视图函数

def test_redirect_model(request,id):
    try:
        user=User.objects.get(id=id)
    except:
        return HttpResponse("用户ID不存在")
    return redirect(user)

def userinfo(request,id):
    user = User.objects.get(id=id)
    return HttpResponse(f"编号:{user.id},姓名:{user.username}")

添加路由:

urlpatterns = [
path('test_redirect_model/<int:id>',views.test_redirect_model,name='app2_test_redirect_model'),
    path('userinfo/<int:id>', views.userinfo,name='app2_userinfo'),
]

        还需要再User表中插入一条id=1的数据。这样就可以正常访问了。

        在访问“app2/test_redirect_model/1”时,执行视图函数test_redirect_model(),此函数的返回值中,redirect()函数包含一个模型实例user,故会调用模型实例中的get_absolute_url()方法。而此方法通过reverse()函数做反向解析,组装出“app2/userinfo/id/1”这样的路由规则;根据这个规则,找到对应视图函数userinfo(),执行并得到结果。

(2)通过路由反向解析进行重定向

增加视图函数:

def test_redirect_views(request,id):
    return redirect('app2_userinfo',id)

        上面视图函数返回值中,redirect()函数返回的是路由名app2_userinfo(已在前面定义好了)和id

添加路由规则:

urlpatterns = [
    path('test_redirect_views/<int:id>', views.test_redirect_views, name='app2_test_redirect_views'),
]

(3)通过一个绝对的或相对的URL,让浏览器跳转到指定的URL进行重定向

        就是直接在redirect函数中,返回一个URL。

def test_redirect(request):
    return redirect("https://www.baidu.com/")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值