当前位置: 首页 > news >正文

python八股(—) --FBV,CBV

引言

FBV是面向函数的视图。

def FBV(request):
    if request.method == 'GET':
        return HttpResponse("GET")
    elif request.method == 'POST':
        return HttpResponse("POST")

CBV是面向类的视图。

class CBV(View):
    def get(self, request):
        return HttpResponse("GET")

    def post(self, request):
        return HttpResponse("POST")

面向对象的封装

- 对同一类方法封装到类中

class File:
      文件增删改查方法

class DB:
      数据库增删改查方法

- 将数据封装到对象中

class File:
    def __init__(self,a1,a2):
        self.a1 = a1
        self.xxx = a2
    def get:...
    def delete:...

obj1 = File(123,666)
obj2 = File(456,999)

FBV,CBV

CBV,基于反射实现根据请求方式不同,执行不同的方法。
原理:
   url -> view方法 -> dispatcha方法(反射执行其他: GET/POST/DELETE/PUT)
流程:
   class StudentView(View):
    def dispatch(self, request, *args, **kwargs):
        print('before')
        ret = super(StudentView, self).dispatch(request, *args, **kwargs)
        print('after')
        return ret

    def get(self, request, *args, **kwargs):
        return HttpResponse('GET')

    def post(self, request, *args, **kwargs):
        return HttpResponse('POST')

    def put(self, request, *args, **kwargs):
        return HttpResponse('PUT')

    def delete(self, request, *args, **kwargs):
        return HttpResponse('DELETE')

继承(多个类共用的功能,为了避免重复编写):

class MyBaseView(object):
    def dispatch(self, request, *args, **kwargs):
        print('before')
        ret = super(StudentView, self).dispatch(request, *args, **kwargs)
        print('after')
        return ret
class StudentsView(MyBaseView, View):
    def get(self, request, *args, **kwargs):
        print('get方法')
        return HttpResponse('GET')

    def post(self, request, *args, **kwargs):
        return HttpResponse('POST')

    def put(self, request, *args, **kwargs):
        return HttpResponse('PUT')

    def delete(self, request, *args, **kwargs):
        return HttpResponse('DELETE')
class Teachersview(MyBaseView,view):
    def get(self, request, *args, **kwargs):
        return HttpResponse('GET')

    def post(self, request, *args, **kwargs):
        return HttpResponse('POST')

    def put(self, request, *args, **kwargs):
        return HttpResponse('PUT')

    def delete(self, request, *args, **kwargs):
        return HttpResponse('DELETE')

      面试题

1.django中间件

- process_request

- process_view

- process_response

- process_exceptioon

- process_render_template

2.使用中间件做过什么?

- 用户登录验证

- django的csrf是如何实现?

  process_view方法

    - 检查视图是否被@csrf_exempt(免除csrf认证)

    - 去请求体活cookie中获取token

3.中间件全栈使用和部分不使用区别

- 全栈使用

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware', # 全栈使用csrf认证
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

- 部分不使用

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt # 该函数无需认证
def users(request):
    user_list = ['alex', 'oldboy']
    return HttpResponse(json.dumps(user_list))

- 部分使用

from django.views.decorators.csrf import csrf_project

@csrf_project #仅这个函数需要使用认证
def users(request):
    user_list = ['alex', 'oldboy']
    return HttpResponse(json.dumps(user_list))

- CBV小知识,csrf时需要使用

- @method_decorator(csrf_exempt)

- 在dispatch方法中(单独方法无效)

from django.views.decorators.csrf import csrf_exempt,csrf_project
from django.untils.decorators import method_decorator

@method_decorator(csrf_exempt,name='dispatch')
class StudentsView(View):
    def get(self, request, *args, **kwargs):
        print('get方法')
        return HttpResponse('GET')

    def post(self, request, *args, **kwargs):
        return HttpResponse('POST')

    def put(self, request, *args, **kwargs):
        return HttpResponse('PUT')

    def delete(self, request, *args, **kwargs):
        return HttpResponse('DELETE')

- 扩展

    - csrf

        - 基于中间件的process_view方法

        - 装饰器给单独函数进行设置(认证或无需认证)

相关文章:

  • Python元组
  • LeetCode面试经典150题
  • 《网络安全等级测评报告模版(2025版)》
  • 点云分割方法
  • vue3:十一、主页面布局(实现基本左侧菜单+右侧内容效果)
  • 万亿级数据量的OceanBase应用从JVM到协议栈立体化改造实现性能调优
  • 对比学习(Contrastive Learning)初接触
  • 通过仿真确定抗积分饱和策略的最佳系数
  • 《TCP/IP网络编程》学习笔记 | Chapter 20:Windows 中的线程同步
  • JVM垃圾回收笔记01-垃圾回收算法
  • ffmpeg介绍(一)——解封装
  • 如何让低于1B参数的小型语言模型实现 100% 的准确率
  • SQLMesh SCD-2 时间维度实战:餐饮菜单价格演化追踪
  • JAVA 之「优先队列」:大顶堆与小顶堆的实现与应用
  • aws(学习笔记第三十四课) dockerized-app with asg-alb
  • claude-3-7-sonnet-20250219 支持深度思考,流式输出
  • css基础-浮动
  • 诊断过拟合的方法及解决方法
  • 同一个局域网的话 如何访问另一台电脑的ip
  • Transformers x SwanLab:可视化NLP模型训练(2025最新版)
  • 上报集团社长李芸:发挥媒体优势,让中非民心在数字时代更深层互联互通
  • 教育部答澎湃:2025世界数字教育大会将发布系列重磅成果
  • 越怕出错越会出错,“墨菲定律”的魔咒该怎么破?
  • 纪念|古文字学泰斗裘锡圭:“还有很多事情要做”
  • 我驻苏丹使馆建议在苏中国公民尽快撤离
  • 2025上海科技节将于5月17日开幕,拟设6大板块专题活动