Django框架

本文将对Django的框架做简要介绍,希望对大家学习Django,用好Django起到积极作用。
Django采用了MTV框架结构。M指model(模型),T指Template(模板),V指View(视图)。典型的访问流程如下图所示。

image.png

用户提交HTTP请求,Django的路由(urls.py)解析HTTP请求,将请求转发给指定的View。View通过Model读取数据或者编辑数据,视图的显示样式是利用Template完成的。最终将Http响应返回给用户。
例子1,比如当前是一个图书馆的网站,我要查看所有的图书列表,发送HTTP请求如viewAll给网站。网站的urls.py根据该路由将请求转发给相应的View。View利用模型从数据库中获取数据,同时View利用Template将获取到的数据以特定的模样展示出来。最终将请求返回。
题外话,我觉得这个与MVC特别类似。MVC网站中,用户发送请求,也有路由解析将请求转发给Controller,Controller利用Model获取数据,利用View将数据显示。套路极其相似。为什么这里称为MTV而不是MVC,我看不出什么太本质的区别。很大的原因,我想,是在于老外弄出一个新东西来,就想着看能不能和之前的有什么不一样,炒作一个新的概念。这样,大家能够更自然的追捧——牛逼!总的来讲,这些架构大同小异。只要心里清楚,面向对象设计中要将职责划分清楚,通过不同的类之间进行配合完成任务。
下面我们就着源代码看一下Django如何具体实现MTV的。这段代码来源于https://github.com/sibtc/bootstrap-forms-example,建议大家将这段代码下载到本地,与我一起查看。如果您安装了git,最简单下载方式莫过于运行

git clone https://github.com/sibtc/bootstrap-forms-example.git

如果您没装git,也可以去那个网站下载zip格式的代码。
我们顺着http访问的顺序来看,首先是simpleproject/urls.py

urlpatterns = [
    path('', PersonListView.as_view(), name='person_list'),
    path('add/', PersonCreateView.as_view(), name='person_add'),
    path('/edit/', PersonUpdateView.as_view(), name='person_edit'),
]

这里负责解析http请求。采用一个列表urlpatterns记录所有的路由。请看其中的三个元素。三个元素均采用path生成路由规则。path的第一个参数匹配的是路由的参数表。如第一个所示,为空时,是默认的路由。比如我们网站是www.example.com。当我们仅在浏览器中输入www.example.com时,就会触发第一个path。www.example.com/add/会触发第二个路由。第三个路由中有一个可变的id字符,用于匹配www.example.com/1/edit/或者www.example.com/2/edit/等等路由。path中的第二个参数就是所谓的View。待会,我们顺藤摸瓜,看看PersonListView。最后一个参数是这个路由的一个名字,这个在后续路由跳转中会用到,暂且不表。
PersonListView.这个视图的位置可以从文件头部from people.views import PersonListView看出,是在people模块下的views.py文件中people/views.py

class PersonListView(ListView):
    model = Person
    context_object_name = 'people'

非常简单。虽然看起来非常简单,但是实则完成了很多事情。
我认为这是Django非常厉害的地方。如果我们对他所能干的事情非常了解的话,那么我们能够write less,do more。但是,我认为这也造成了初学者对Django的学习成本的提高。如果对于python不是很了解的话,要读懂这段代码还真是挺难的。
PersonListView继承了ListView。ListView主要用于展示列表,比如我们刚才讲的图书列表,或者这里的人员列表。网站中很多地方都能够用到列表这个视图。
刚才我们讲,要对django足够了解,这其实是很难评价到底是多了解算是足够了解。所以,并不是要你在开发前完全了解Django。我觉得在你每次想开发一个功能的时候,仔细看看django有没有内置的,足以让你避免浪费很多时间了。所以,不需要足够了解django也可以开始我们的开发伟业。我们要在游泳中学会游泳!
言归正传,PersonListView到底完成了个什么?ListView又是个什么?我们需要去看看文档。根据文档中的介绍,ListView中的model代表的是所采用的Model,即前文所述的MTV中的M。我们知道M会去和数据库打交道。V的话自然是PersonListView本身。那么T呢?通常会在View中有一个template_name字段。在没有提供T的情况下,ListView会自动去寻找一个名叫person_list.html的模板。我们可以在templates\people\person_list.html那里找到这个模板。
这个类里边还有一个字段context_object_name。这个字段又是什么意思?字面意思是上下文对象的名称。也就是这个模型获取到列表时的对象名称。如果不提供context_object_name的话,ListView的默认字段时object_list。这个会在Template渲染的时候使用。如下,在templates\people\person_list.html

      {% for person in people %}
        
          {{ person.name }}
          {{ person.email }}
          {{ person.job_title }}
        
      {% empty %}
        
          No data
        
      {% endfor %}

模板在绘制列表视图时,列表就是context_object_name(这里是people)。
我们看完了T和V,最后剩下M。M在people\models.py中,从头部导入语句中可以推测出。

from django.db import models
class Person(models.Model):
    name = models.CharField(max_length=130)
    email = models.EmailField(blank=True)
    job_title = models.CharField(max_length=30, blank=True)
    bio = models.TextField(blank=True)

整个模型也非常简洁。共有四个字段。每个字段都定义了类型。此外,由于没有指定primary_key。Django在数据库中生成表单的时候,Django会自动添加一个主键。

id = models.AutoField(primary_key=True)

因此,这个模型共有5个字段。这五个字段在视图中是可以使用的。比如刚才在模板中

{{ person.name }}
{{ person.email }}
{{ person.job_title }}

请注意,在生成路由的时候采用了person.pk。这是主键的别称,等同于采用person.id
对于Django而言,我们定义好了模型,我们就能够自动在数据库中创建对应的表单。方法为执行python manage.py migrate,亲自建立网站的时候你就会知道。这是我感觉用得非常爽的一个地方。之前用PHP的一个框架,数据库表单和模型不一致是常有的事,调整起来非常麻烦。最开始,我们连数据库都不需要配置,因为Django默认采用sqllit数据库,它就是一个文件。对于小网站足够了。
对于django开发来讲,我认为清楚django的mtv框架是十分重要的。对mtv理解的越是深刻,就越能够用好django。本文是在我一边学习的过程中写完的,难免会有不当之处。如您看出,还望指出。此外,对于不理解的地方,也恳请指出。那一定是我讲得不清楚,而不是您理解的问题。我会做相应的调整。
最后,感谢阅读本文。

你可能感兴趣的:(Django框架)