zoukankan      html  css  js  c++  java
  • 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)

     大佬博客:https://www.cnblogs.com/maple-shaw/p/9285269.html

  • 相关阅读:
    电脑使用优化工具方法
    算法练习的网站
    golang 实现链表反转打印
    刷过的算法题
    Symfony2框架实战教程——第六天#Alt:验证码
    Symfony2框架实战教程——第六天:模板重载与翻译
    [Symfony2] 在命令或控制器里跑另一个命令的N种方法
    Symfony2框架实战教程——第五天:KnpMenuBundle创建菜单项+结合Twitter Boostrap3
    Symfony2框架实战教程——第四天#Alt:用FOSUserBundle实现用户注册和登录
    Symfony2框架实战教程——第四天:用HWIOAuthBundle实现第三方登录
  • 原文地址:https://www.cnblogs.com/kindvampire/p/12301881.html
Copyright © 2011-2022 走看看