1.什么是视图函数
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。
响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片;无论视图本身包含什么逻辑,都需要返回响应。
一般大家约定俗成的放在django项目或应用程序app中名为views.py文件中。
视图函数实例
from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
当浏览器向服务端请求一个页面时,Django封装了一个HttpRequest请求对象,该对象包含关于请求的元数据。然后,Django加载相应的视图,将这个HttpRequest请求对象作为第一个参数传递给视图函数,供视图函数使用相关的请求数据。
每个视图负责根据不同的访问请求,执行不同的业务逻辑,最后返回一个HttpResponse响应对象,通过模板渲染后发送给前端页面。
2.HttpRequest对象
当一个页面被请求时,Django就会创建一个包含本次请求元信息(请求报文中的请求行、首部信息、内容主体等)的HttpRequest请求对象。
Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。
httprequest对象的常用属性和方法
-
path_info:返回用户访问url,不包括域,如:/home/
-
method:请求中使用的HTTP方法的字符串表示,全大写表示。e如:POST
-
GET:包含所有HTTP GET参数的类字典对象,可以通过键取值
-
POST:包含所有HTTP POST参数的类字典对象,可以通过键取值
-
body:请求体,byte类型 request.POST的数据就是从body里面提取到的
其他属性(了解)
1.HttpRequest.META:包含所有HTTP请求头信息的python字典。 2.HttpRequest.COOKIES:一个标准的Python 字典,包含所有的cookie。键和值都为字符串。 3.HttpRequest.FILES:一个类似于字典的对象,包含所有的上传文件信息。 # FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会包含数据。否则,FILES 将为一个空的类似于字典的对象。 4.HttpRequest.user:一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。 5.HttpRequest.session:一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django,启用会话的支持时才可用。
其他方法
1.HttpRequest.get_full_path() # 返回带查询字符串或get请求数据的路径path,这里的请求数据就是(query_params),如:/home/?name=ryxiong
3.HttpResponse对象
HttpRequest对象是由django自动创建封装的,而HttpResponse对象是我们需要处理返回的,每一个视图函数都需要实例化,填充和返回一个HttpResponse对象
HttpResponse类位于django.http模块中。
HttpResponse使用
HttpResponse对象可以传递字符串给前端页面
from django.http import HttpResponse def index(): response = HttpResponse("Here's the text of the Web page.") response = HttpResponse("Text only, please.", content_type="text/plain")
HttpResponse对象属性
-
HttpResponse.content:响应内容
-
HttpResponse.charset:响应内容的编码
-
HttpResponse.status_code:响应的状态码
HttpResponse响应对象的三种形式
在视图函数中需要先导入使用的类,才能使用
from django.http import HttpResponse,render,redirect,JsonResponse # JsonResponse是HttpResponse的子集
1.HttpResponse方法
语法:HttpResponse("字符串文本")
直接跟一个具体的字符串作为响应体,不多概述。
2.render方法
语法:render(request,"模板",替换参数);
将模板文件根据一个给定的上下文字典,渲染后(字符串替换)返回给前端页面。
参数介绍
-
request: 用于生成响应的请求对象
-
template_name:要使用的模板的完整名称,可选的参数
-
context:添加到模板上下文的一个字典。默认是一个空字典
-
-
status:响应的状态码。默认为200
-
useing: 用于加载模板的模板引擎的名称
扩展:render_to_response("模板",替换参数)效果一直,不需要传递request对象。推荐使用render方法。
from django.shortcuts import render def my_view(request): # 视图的代码写在这里 return render(request, 'myapp/index.html', {'foo': 'bar'})
3.redirect方法
语法:redirect(路径)跳转页面
给浏览器返回一个3xx状态码,告诉浏览器重新请求一个指定的页面。
参数可以是如下:
-
一个模型:将调用模型的get_absolute_url() 函数
-
一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
-
一个绝对的或相对的URL,将原封不动的作为重定向的位置。
def my_view(request): 具体逻辑代码 return redirect('/url/')
render和redirect的区别
使用render返回页面,如果页面需要模板语言渲染,那么所有要渲染的这部分数据,除了要写在开始的输入函数中,还需要写在后面提交的函数中,代码重复,没有解耦。
而且使用render,url连接并没有发生变化,还是停在原url上。
JsonResponse对象
JsonResponse是HttpResponse的子类,用来生成JSON编码格式的响应数据。
from django.http import JsonResponse response = JsonResponse({'name': 'ryxiong'}) # 处理成JSON编码格式的bytes数据 print(response.content) # b'{"name": "ryxiong"}'
JsonResponse类详细参数:class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)
和父类HttpResponse的区别:
- 默认Content-Type为:application/json
- data应该是一个字典类型
- safe:为False时,data可以为任意可转换为Json格式的对象,如list,dict等;为True时,data只能为字典类型,否则会报错。
- json_dumps_params参数是一个字典,它将调用json.dumps()方法并将字典中的参数传入给该方法。
JsonResponse返回实例
#views.py return HttpResponse(json.dumps({"msg":"ok!"})) # 方式一 return JsonResponse({"msg":"ok!"}) # 方式二 #index.html var data=json.parse(data) # 前端拿到需要通过JSON.parse来解析 console.log(data.msg);
4.CBV和FBV模式
FBV模式
FBV(function base views)在视图文件中使用函数来处理请求返回响应数据。
CBV模式
CBV(class base views)在视图文件中使用类来处理请求,返回响应数据。
Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了Class-Based-View。可以让我们用类写View。
使用视图函数的好处
-
提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
-
可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
CBV模式使用
使用class base view实现返回响应的视图类,在类中可以重写请求方法,来响应不同请求。
视图函数定义视图类示例
# views.py from django.http import HttpResponse from django.views import View class MyView(View): #重写dispatch方法的写法 def dispatch(self,request,*args,**kwargs) # 因为响应对象是通过父类的dispatch调用不同的方法获得响应对象返回,所以重写dispatch方法时要执行父类的dispatch方法,并拿到返回值返回 ret = super().dispatch(request,*args,**kwargs) return ret #别忘了return值 # 重写get方法,处理get请求 def get(self, request): return HttpResponse('OK')