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)