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)