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方法
- 装饰器给单独函数进行设置(认证或无需认证)