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/")