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:添加到模板上下文的一个字典。默认是一个空字典

  • content_type:生成的文档要使用的MIME类型

  • 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状态码,告诉浏览器重新请求一个指定的页面。

Django框架—视图函数和模板系统

参数可以是如下:

  • 一个模型:将调用模型的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的区别:

  1. 默认Content-Type为:application/json
  2. data应该是一个字典类型
  3. safe:为False时,data可以为任意可转换为Json格式的对象,如list,dict等;为True时,data只能为字典类型,否则会报错。
  4. 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。

使用视图函数的好处

  1. 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)

  2. 可以用不同的函数针对不同的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')
views.py文件

相关文章:

  • 2022-03-05
  • 2022-02-05
  • 2022-12-23
  • 2022-01-09
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-06-04
  • 2022-01-07
  • 2021-09-27
  • 2018-10-06
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案