目录
- 开发框架简介
开发框架简介
一、使用前后端分离开发的好处
- 前后端不分离的状态下后端代码和数据库只能为前端网站开发提供数据支持,但是现在随着app、小程序等多样化的需求,要求后端和数据可以为各种需求提供支持,前后端分离,后端设置接口,通过接口来传递数据,可以适应不同的开发需求,大大减少后端开发的工作量。
- 前后端分离开发可以让程序的维护更加的便捷。
二、FBV和CBV
FBV: function base view 基于函数的视图
'''pythondef api1(request): data_list = ['课程', '班级'] return HttpResponse(json.dumps(data_list))
'''
- CBV: class base view 基于类的视图, 基于反射实现根据请求方式的不同来执行不同的结果
- 原理:
- 路由:每一个路由对应一个自定义的视图类
视图类:当接收到请求后,视图类直接调用封装好的dispatch调度方法(根据反射来执行其他的方法:GET/PUT/PATCH/PUT/DELETE......)
'''pythonclass StudentView(View): def dispath(self, request, *args, **kwargs): method_name = getattr(self, request.method.lower()) # 注意:这里的getattr()函数用于返回一个对象的属性值 # request.method返回的是请求的方式,即大写形式,如果我们 # 直接就把大写方式名作为执行函数的名字,系统会找不到,所有需要把 # 大写全部变成小写才可以找到并运行 result = method_name(request, *args, **kwargs) return result def get(self, reqeust, *args, **kwargs): return HttpResponse('GET') def post(self, reqeust, *args, **kwargs): return HttpResponse('POST') def patch(self, reqeust, *args, **kwargs): return HttpResponse('PATCH') def put(self, request, *args, **kwargs): return HttpResponse('PUT') def delete(self, request, *args, **kwargs): return HttpResponse('DELETE')
- 执行的流程:在视图类模式下,当前端发起请求后,视图类在接收到请求后会直接调用封装好的dispatch方法,并返回结果给前端,当我们自己在视图类中自定义类一个dispatch方法后,自定义函数会覆盖掉封装好的dispatch方法,此时,前端再次发起请求后,视图类调用的将是自定义的dispatch方法,返回结果,默认情况下开发者不需要写dispatch方法。
- 原理:
'''python
# 由于每一个视图类都要调用dispatch方法,我们可以把它抽象出来,封装成一个基类,由视图函数来继承
class BaseView(object):
def dispatch(self, request, *args, **kwargs):
print("before")
result = super(BaseView, self).dispatch(request, *args, **kwargs)
# 基类继承自框架封装好的类并调用类中方法
print("after")
return result
class Student1View(BaseView, View):
'''
当继承多个类的时候,需要用到多继承关系,多继承关系遵循左优先原则,
希望先继承的类写在左边,一次往下写
'''
def get(self, reqeust, *args, **kwargs):
return HttpResponse('GET')
def post(self, reqeust, *args, **kwargs):
return HttpResponse('POST')
def patch(self, request, *args, **kwargs):
return HttpResponse('PATCH')
def put(self, request, *args, **kwargs):
return HttpResponse('PUT')
def delete(self, request, *args, **kwargs):
return HttpResponse('DELETE')
'''
三、面向对象之封装
- 把同一类方法封装到类类中, 例如CBV格式
- 把数据封装到对象中,例如创建类的时候里的init
'''python
class Test(object):
def __init__(self, a1,a2):
self.a1 = a1
self.a2 = a2
def ...
def ...
test1 = Test(111, 3333)
# 类的实例化
'''
四、中间件
中间件五大类别
- process_request
- process_view
- process_response
- process_exception
- process_render_template
csrf_token的使用
csrf_token是中间件中的一个,放置在processs_view中,即视图函数
- settings中设置了csrf全局认证,如果希望少部分视图函数免于csrf认证,可以在form表单中添加{% csrf_token %}或者在视图函数中添加装饰器:@csrf_exempt 'from django.views.dacorators.csrf import csef_exempt',但是在在CBV模式下,免除认证的装饰器必须加在dispatch方法上,单独添加视图函数无效,具体方式三种:
- 方式一:直接在dispatch方法前添加装饰器@csrf_exempt
- 方式二:利用装饰器方法来进行
- 导入from django.utils.decorators import method_decorator
- @method_decorator(csrf_exempt),把这个装饰器添加到dispatch方法前
方式三:@method_decorator(csrf_exempt, name='dispatch'),name是添加装饰器的方法名,把装饰器添加在视图类前。前两种方式都必须找到dispatch方法才能添加,这个不用再找到dispatch方法,这个方法更方便。
"method_decorator格式:@method_decorator(csrf方法, name='视图类中添加csrf的方法名')"
'''python
class BaseView(object):
@csrf_exempt
def dispatch(self, request, *args, **kwargs):
print("before")
result = super(BaseView, self).dispatch(request, *args, **kwargs)
print("after")
return result
'''
- 如果没有设置全局csrf认证,我们希望对少部分视图函数进行csrf认证,则在需要认证的函数前添加装饰器@csrf_protect