Django框架架构模式及视图编码方式(FBV,CBV)

MVC架构模式

1、定义:MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点。

2、原理:

  

3、MVC

  M:模型(model),程序需要操作的数据或信息。

  V:视图(view),提供给用户的操作界面

  C:控制器(controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。

Django架构模式——MTV

1、与MVC之间的区别:Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。

2、原理

 3、MTV

  M:模型(model),负责业务对象与数据库的对象(ORM)。

  T:模板(html),负责为用户提供操作界面。

  V:视图(view),负责业务逻辑,并在适当的时候调用Model和Template

FBV与CBV

1、定义

  FBV:function based view,即基于函数的视图函数。

  CBV:class based view,即基于类的视图函数。

2、使用

以登录函数为例:

FBV

urls.py

urlpatterns = [
    url(r'^login/', views.login, name='login'),
]

views.py

def login(request):
    if request.method == 'POST': # POST请求逻辑代码
        username = request.POST.get('username')
        password = request.POST.get('password')
        code = request.POST.get('code')
        user = User.objects.filter(username=username, password=password)
        if user and code.upper() == request.session.get('code').upper():
            request.session['login'] = 1
            request.session['username'] = user.first().name
            return HttpResponse('登录成功!')
    return render(request, 'login.html') # get请求逻辑代码

CBV

urls.py

urlpatterns = [
    url(r'^login/',views.Login.as_view(),name='login')
]

view.py

from django.views import View

class Login(View): def get(self, request): # get请求 return render(request, 'login.html') def post(self, request): # post请求 username = request.POST.get('username') password = request.POST.get('password') code = request.POST.get('code') user = User.objects.filter(username=username, password=password) if user and code.upper() == request.session.get('code').upper(): request.session['login'] = 1 request.session['username'] = user.first().name return HttpResponse('登录成功!')

CBV中的as_views流程

 

 

 总结:

1. 程序加载的时候,执行urls.py文件中的类名.as_view():
  定义了as_view()中view函数,并且返回了view函数变量

2. 请求到来时,执行view函数:
  1. 实例化对象 ——> self
  2. self.request = request
  3. 执行self.dispatch(request, *args, **kwargs)
    1. 判断请求方式是否被允许:
      1. 允许: 通过反射获取请求方式对应的方法(get/post) ——> handler
      2. 不允许:self.http_method_not_allowed ——> handler
    2. 执行handler,将它的结果返回

CBV上加装饰器的三种方法

from django.utils.decorators import method_decorator # 给CBV添加装饰器
#① 加在方法上
@method_decorator(login_required)
def get(self, request, *args, **kwargs):

#② 加在dispatch方法上
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
    ret = super().dispatch(request, *args, **kwargs)
    return ret

#③ 加在类上
@method_decorator(login_required,name='dispatch')  # 推荐这种
class Addpublisher(View)


@method_decorator(login_required,name='post')
@method_decorator(login_required,name='get')
class Addpublisher(View)

猜你喜欢

转载自www.cnblogs.com/kindvampire/p/12301881.html