Django如何定义视图函数?FBV-CBV的使用场景

目录

[1. 前言](#1. 前言)

[2. FBV与CBV](#2. FBV与CBV)

[2.1 FBV](#2.1 FBV)

[2.2 CBV](#2.2 CBV)

[2.3 两种区别](#2.3 两种区别)

[3. request参数](#3. request参数)

[4. 返回值](#4. 返回值)

[5. 结尾](#5. 结尾)


1. 前言

在Django中,我们通过浏览器URL发送了请求,请求通过路由层,最后匹配到相应的视图函数

在视图函数中,也分两种编写形式:FBV、CBV

接下来,我们来看看CBV和FBV两种范式

2. FBV与CBV

2.1 FBV

所谓FBV就是function based views ,函数式编写视图,也就是通过函数的形式,来编写视图:

python 复制代码
def test(request):
    print(request.resolver_match)
    return HttpResponse('code')

这就是最简单的FBV编写视图的形式。

但是我们请求是分为很多种的,我们需要额外进行判断:

python 复制代码
def test(request):
    if request.method == 'GET':
        print(request.resolver_match)
        return HttpResponse('get')
    else:
        return HttpResponse('这是post')

2.2 CBV

所谓CBV就是clss based views ,类编写视图,也就是通过类的形式,来编写视图:

python 复制代码
class User(View):
    def get(self , request):
        print('hello')
        return HttpResponse('我是get')

    def post(self , request):
        return HttpResponse('我是post')

在CBV中,一种函数代表一种请求方式

2.3 两种区别

  • 定义路由的形式不同

FBV:

复制代码
path('test/', views.test)

CBV:

复制代码
path('user/' , views.User.as_view())
  • 应用范围一般不同

FBV:

一般用于前后端不分离

CBV:

一般用于前后端分离(小程序API ,DRF)

3. request参数

request封装了HTTP请求对象,本质上是一个WSGIRequest对象,源码如下:

我们大致可以看看request里面都有什么,这肯定少不了源码啦(这个时候,研究源码的好处就来咯)

python 复制代码
    def __init__(self, environ):
        script_name = get_script_name(environ)
        # If PATH_INFO is empty (e.g. accessing the SCRIPT_NAME URL without a
        # trailing slash), operate as if '/' was requested.
        path_info = get_path_info(environ) or "/"
        self.environ = environ
        self.path_info = path_info
        # be careful to only replace the first slash in the path because of
        # http://test/something and http://test//something being different as
        # stated in RFC 3986.
        self.path = "%s/%s" % (script_name.rstrip("/"), path_info.replace("/", "", 1))
        self.META = environ
        self.META["PATH_INFO"] = path_info
        self.META["SCRIPT_NAME"] = script_name
        self.method = environ["REQUEST_METHOD"].upper()
        # Set content_type, content_params, and encoding.
        self._set_content_type_params(environ)
        try:
            content_length = int(environ.get("CONTENT_LENGTH"))
        except (ValueError, TypeError):
            content_length = 0
        self._stream = LimitedStream(self.environ["wsgi.input"], content_length)
        self._read_started = False
        self.resolver_match = None

我们大概可以梳理一下:

当然,下面还有很多方法可以使用,常用的就这几个:

python 复制代码
request.method    # 请求方法
request.GET        # get请求参数,也就是url的?后面的
reqeust.POST      # post请求参数
request.FILES     # 文件参数
request.path_info   # 路径
request.body   # 原始请求数据

4. 返回值

python 复制代码
from Django.http import JsonResponse
from django.shortcuts import render, HttpResponse,redirect
  • HttpResponse:构建响应体和响应头,返回字符串
  • JsonResponse:json格式

一般JsonResponse返回的数据中文是乱码的 , 这个时候就要加上后面的参数.

python 复制代码
中文显示:
JsonResponse({"吊毛": 1}, json_dumps_params={'ensure_ascii': False})
  • render:返回html页面
  • redirect:重定向 301/ 302
python 复制代码
301和302
301:永久重定向,相当于直接替换掉,一般用于域名跳转
302:临时重定向,相当于保留原地址,一般用作临时的跳转

5. 结尾

Django业务开发离不开视图层,熟练掌握视图层,能让我们更好的开发业务需求。

我们经常都会用到requets封装的参数,例如获取请求方法、请求体等

最后就是返回值问题,HttpResponse一般用于返回字符串内容,而JsonResponse一般返回json数据等等,采用合适的返回值能让业务走的更流通。

相关推荐
烛阴8 分钟前
一文搞懂 Python 闭包:让你的代码瞬间“高级”起来!
前端·python
JosieBook18 分钟前
【Java编程动手学】Java中的数组与集合
java·开发语言·python
Gyoku Mint1 小时前
深度学习×第4卷:Pytorch实战——她第一次用张量去拟合你的轨迹
人工智能·pytorch·python·深度学习·神经网络·算法·聚类
paopaokaka_luck2 小时前
基于SpringBoot+Vue的电影售票系统(协同过滤算法)
vue.js·spring boot·后端
郭庆汝7 小时前
pytorch、torchvision与python版本对应关系
人工智能·pytorch·python
IT_10248 小时前
Spring Boot项目开发实战销售管理系统——系统设计!
大数据·spring boot·后端
ai小鬼头9 小时前
AIStarter最新版怎么卸载AI项目?一键删除操作指南(附路径设置技巧)
前端·后端·github
Touper.10 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端
思则变10 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
一只叫煤球的猫10 小时前
普通程序员,从开发到管理岗,为什么我越升职越痛苦?
前端·后端·全栈