美文网首页
Django基础概念和MVT架构

Django基础概念和MVT架构

作者: Peter杰 | 来源:发表于2019-12-03 15:47 被阅读0次

    Django简介

    • Django : 发音为 [ `dʒæŋɡəʊ ]. 名称来源于比利时爵士音乐家 Django Reinhardt
    • Python 语言写的开源web开发框架, 发布于2005年7月.
    • Django 的主要目的是简便、快速的开发数据库驱动的网站.
    • Django 强调代码复用, 多个组件可以很方便的以 “插件”形式服务于整个框架. 有许多功能强大的第三方插件.
    • Django 遵循MVC设计模式. 但是有一个专有名词 :MVT
    • Django官方网站
    • Django源码-GitHub
    • Django中文文档

    MVC介绍

    • MVC 全拼为Model-View-Controller
    • MVC 核心思想 : 解耦
      • 让不同的模块之间降低耦合, 增强代码的可扩展性和可移植性, 实现更好的向后续版本的兼容
      • 开发原则 : 高内聚, 低耦合
    • MVC 解析
      • M全拼为Model, 主要封装对数据库层的访问, 内嵌ORM框架, 实现面向对象的编程来操作数据库.
      • V全拼为View, 用于封装结果, 内嵌了模板引擎, 实现动态展示数据.
      • C全拼为Controller, 用于接收GET或POST请求, 处理业务逻辑, 与Model和View交互, 返回结果.
    • 当前主流的开发语言如 Java、PHP、Python、... 中都有MVC设计模式.
    mvc

    MVT介绍

    • MVT 全拼为Model-View-Template
    • MVT 核心思想 : 解耦
    • MVT 解析
      • M (模型)全拼为Model, 与MVC中的M功能相同, 负责数据处理, 内嵌了ORM框架.
      • V (视图)全拼为View, 与MVC中的C功能相同, 接收HttpRequest, 业务处理,返回HttpResponse.
      • T (模板)全拼为Template, 与MVC中的V功能相同, 负责封装构造要返回的html, 内嵌了模板引擎.
    • MVT和MVC 差异就在于黑箭头标识出来的部分.
    mvt

    总结

    学习 Django, 重点就是研究 Model-View-Template 三个模块间如何协同工作及各自模块的代码如何编写。

    补充

    设计模式

    • 设计模式:是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
    • 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。
    • 设计模式使代码编写真正工程化。
    • 设计模式是软件工程的基石脉络,如同大厦的结构一样。

    高内聚,低耦合

    • 耦合性:指软件系统结构中各模块间相互联系紧密程度的一种度量。

      • 模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。
      • 模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息
    • 内聚性:指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。

      • 若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。

    虚拟环境

    为什么要搭建虚拟环境?

    • 在开发过程中, 当需要使用python的某些工具包/框架时需要联网安装

      • 比如联网安装Django框架django1.8.2版本
    • 提示:使用如上命令, 会将django1.8.2安装到/usr/local/lib/python版本/dist-packages路径下

    • 问题 : 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新版本会覆盖以前的版本, 其它的项目就无法运行了.

    • 解决方案 : 虚拟环境

      • 作用 : 虚拟环境可以搭建独立的python运行环境, 使得单个项目的运行环境与其它项目互不影响.
      • 所有的虚拟环境都位于/home/下的隐藏目录.virtualenvs

    如何搭建虚拟环境?

    • 安装虚拟环境的命令 :

      sudo pip install virtualenv
      sudo pip install virtualenvwrapper
      
    • 创建虚拟环境的命令 :

      • 提示:如果不指定python版本,默认安装的是python2的虚拟环境
      • 在python2中,创建虚拟环境
        mkvirtualenv 虚拟环境名称
        例 :
        mkvirtualenv py_django
        
      • 在python3中,创建虚拟环境
        mkvirtualenv -p python3 虚拟环境名称
        例 :
        mkvirtualenv -p python3 py3_django
        
      创建虚拟环境py3
    • 提示 :

      • 创建虚拟环境需要联网
      • 创建成功后, 会自动工作在这个虚拟环境上
      • 工作在虚拟环境上, 提示符最前面会出现 “虚拟环境名称”

    如何使用虚拟环境?

    • 查看虚拟环境的命令 :

       workon 两次tab键
      
      查看虚拟环境
    • 使用虚拟环境的命令 :
       workon 虚拟环境名称
      
        例 :使用python2的虚拟环境
        workon py_django
      
        例 :使用python3的虚拟环境
        workon py3_django
      
      使用虚拟环境py3
    • 退出虚拟环境的命令 :
      deactivate
      
    退出虚拟环境py3.png
    • 删除虚拟环境的命令 :
       rmvirtualenv 虚拟环境名称
      
      例 :删除虚拟环境py3_django
      
      先退出:deactivate
      再删除:rmvirtualenv py3_django
      
    删除虚拟环境py3

    如何在虚拟环境中安装工具包?

    • python3版本下安装django1.8.2的包 :
        pip install 包名称
      
        例 : 安装django1.8.2的包
      pip install django==1.8.2
      
      安装django在py3
    • 工具包安装的位置 :

      • python2版本下:
        • ~/.virtualenvs/py_django/lib/python2.7/site-packages/
      • python3版本下:
        • ~/.virtualenvs/py3_django/lib/python3.5/site-packages
    • 查看虚拟环境中安装的包 :

      pip freeze
      
      查看虚拟环境下安装的包

    创建Django项目

    • 在Django项目中,项目的组织结构为:一个项目包含多个应用,一个应用对应一个业务模块。
    • 示例:创建项目的名称为BookManager,创建应用名称为Book,完成图书信息的维护。
    • 提示:在当前用户的某个目录下创建项目,这样不会发生权限问题。

    创建项目

    • ~/Desktop/.../目录下创建项目BookManager

      例 : 在桌面创建项目
      cd ~/Desktop/
      
    • 创建项目的命令:

      • 创建好项目就可以使用PyCharm打开。
        django-admin startproject 项目名称
        例 :创建项目BookManager
        django-admin startproject BookManager
        
    • 项目结构

      项目结构.png
      • BookManager :是与项目同名的文件,内部包含如下项目的配置文件。
        • init.py:是表示文件BookManager可以被视为包使用。
        • settings.py :是项目的整体配置文件。
        • urls.py:是项目的URL配置文件。
        • wsgi.py:是项目与WSGI兼容的Web服务器入口。
      • manage.py :是项目运行的入口,指定配置文件路径。

    创建应用

    • BookManager项目中,创建应用Book

       cd BookManager/
      python manage.py startapp Book
      
    • 项目结构

      创建应用
      • admin.py :是后台的站点管理注册文件。
      • init.py:是表示文件Book可以被视为包使用。
      • migrations :是做模型迁移的。
      • models.py:是处理数据的。MVT中的M
      • tests.py :是做测试用的。
      • views.py:是处理业务逻辑的。MVT中的V

    选择并添加对应虚拟环境下的python

    • 虚拟环境py_django下的python
      which python
      
      结果:
      /home/python/.virtualenvs/py_django/bin/python
      
    • 虚拟环境py3_django下的python
      which python
      
      结果:
      /home/python/.virtualenvs/py3_django/bin/python
      
    ![选取并添加python3](https://img.haomeiwen.com/i2760539/ca06df99e8eaaf42.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    

    安装应用

    • 安装应用前

      安装应用前
    • 安装应用后


      安装应用后.png

    测试服务器

    • 在开发阶段,为了能够快速预览到开发的效果,Django提供一个纯Python编写的轻量级web服务器

      • 仅在开发阶段使用,非正式服务器
    • 运行测试服务器的命令:

      python manage.py runserver ip:端口
      
      python manage.py runserver 172.16.21.25:8001
      对应:
      http://172.16.21.25:8001/
      
    • ip和端口号可以不写,默认ip为127.0.0.1;端口号为8000

      python manage.py runserver
      对应:
      http://127.0.0.1:8000/
      
      终端开启测试服务器
    • 提示:如果项目的虚拟环境由py3_django切换到py_django时,需要同时切换测试服务器的虚拟环境到py_django

    • 输入http://127.0.0.1:8000/即可访问。

      • 刷新网页就可以查看每次代码执行效果
      • 如果增加代码、修改代码、删除代码服务器会自动重启。
      • ctrl+c停止服务器
      浏览器访问服务器.png

    模型

    • 当前项目的开发, 都是数据驱动的。
    • 以下为书籍信息管理的数据关系:书籍和人物是 :一对多关系
    • 要先分析出项目中所需要的数据, 然后设计数据库表.

    书籍信息表

    字段名 字段类型 字段说明
    id AutoField 主键
    name CharField 书名
    id name
    1 西游记
    2 三国演义

    人物信息表

    字段名 字段类型 字段说明
    id AutoField 主键
    name CharField 人名
    gender BooleanField 性别
    book ForeignKey 外键
    id name gender book
    1 孙悟空 False 1
    2 白骨精 True 1
    3 曹操 False 2
    4 貂蝉 True 2

    使用Django进行数据库开发的提示 :

    • MVT设计模式中的Model, 专门负责和数据库交互.对应(models.py)
    • 由于Model中内嵌了ORM框架, 所以不需要直接面向数据库编程.
    • 而是定义模型类, 通过模型类和对象完成数据库表的增删改查.
    • ORM框架就是把数据库表的行与相应的对象建立关联, 互相转换.使得数据库的操作面向对象.

    使用Django进行数据库开发的步骤 :

    1. 定义模型类
    2. 模型迁移
    3. 操作数据库

    1. 定义模型类

    • 根据书籍表结构设计模型类:

      • 模型类:BookInfo
      • 书籍名称字段:name
    • 根据人物表结构设计模型类:

      • 模型类:PeopleInfo
      • 人物姓名字段:name
      • 人物性别字段:gender
      • 外键约束:book
        • 外键要指定所属的模型类 book = models.ForeignKey(BookInfo)
    • 说明 :

      • 书籍-人物的关系为一对多. 一本书中可以有多个英雄.
      • 不需要定义主键字段, 在生成表时会自动添加, 并且值为自增长.
    • 根据数据库表的设计

      • models.py中定义模型类,继承自models.Model
      from django.db import models
      
      # 准备书籍列表信息的模型类
      class BookInfo(models.Model):
        # 创建字段,字段类型...
       name = models.CharField(max_length=10)
      
      # 准备人物列表信息的模型类
      class PeopleInfo(models.Model):
      name = models.CharField(max_length=10)
      gender = models.BooleanField()
       # 外键约束:人物属于哪本书
      book = models.ForeignKey(BookInfo)
      
      # 模型类准备好之后,需要创建和执行迁移==建表
      

    2. 模型迁移 (建表)

    • 迁移由两步完成 :

      • 生成迁移文件:根据模型类生成创建表的语句
        python manage.py makemigrations
      • 执行迁移:根据第一步生成的语句在数据库中创建表
        python manage.py migrate
    • 迁移前

      迁移前.png
    • 迁移后


      迁移后.png
    • 提示:默认采用sqlite3数据库来存储数据

    3. 操作数据库

    • 通过模型类和对象完成数据库表的增删改查.
    • 进入项目的shell, 进行简单的增删改查 API操作.
      • ctrl+d或输入quit()可以退出shell.
        python manage.py shell
        
    • 测试增删改查 API操作
      # 引入应用中的模型类
      from Book.models import *
      
      # 创建书籍模型对象
      book = BookInfo()
      # 新增记录
      book.name = 'xiyouji'
      # 保存记录
      book.save()
      # 查询记录
      BookInfo.objects.all()
      # 删除记录 : 再查询时,表里数据为空
      book.delete()
      
      # 创建人物模型对象
      people = PeopleInfo()
      people.name = 'sunwukong'
      people.gender = True
      people.book = book
      people.save()
      # 外键查询 : 查询书里面保存的人物信息(peopleinfo_set是隐式生成的)
      book.peopleinfo_set.all()
      
      # 退出shell
      quit()
      

    4 站点管理

    • 站点 : 分为内容发布公共访问两部分
    • 内容发布 的部分由网站的管理员负责查看、添加、修改、删除数据
    • Django能够根据定义的模型类自动地生成管理模块
    • 使用Django的管理模块, 需要按照如下步骤操作 :
      • 1.管理界面本地化
      • 2.创建管理员
      • 3.注册模型类
      • 4.发布内容到数据库
      • 5.自定义站点管理页面

    1.管理界面本地化

    • 本地化是将显示的语言、时间等使用本地的习惯,这里的本地化就是进行中国化.
    • 中国大陆地区使用简体中文, 时区使用亚洲/上海时区, 注意这里不使用北京时区.
    • 本地化前

    [图片上传中...(image.png-4058e4-1594127813226-0)]


    • 本地化后

    2.创建管理员

    • 创建管理员的命令 :

        python manage.py createsuperuser
      
      
    • 按提示输入用户名、邮箱、密码

      image.png
    • 登陆站点 : http://127.0.0.1:8000/admin

      • 需要服务器是启动状态
    • 登陆站点成功

      • 站点界面中没有书籍和人物管理入口,因为没有注册模型类

    3.注册模型类

    • 应用admin.py文件中注册模型类

      • 需要导入模型模块 : from models import *
    • 注册模型后

    注册模型成功后, 就可以在站点管理界面方便快速的管理数据.

    4.发布内容到数据库

    • 发布内容后,优化模型类展示

      class BookInfo(models.Model):
        """定义书籍信息模型类"""
      
        name = models.CharField(max_length=10)
      
        def __str__(self):
            """将模型类以字符串的方式输出"""
            return self.name
      
      

    5.自定义站点管理页面

    • 自定义站点管理界面前
    • 如果想在站点界面中展示详细的字段信息,需要自定义管理页面

    • 即 在应用admin.py文件中需要重新注册模型类

      • 新建类继承自admin.ModelAdmin

      • 重写list_display,指定需要展示的字段

      • PeopleAdmin注册到站点

        # 自定义站点管理界面的类 : 重写list_display属性
        class PeopleAdmin(admin.ModelAdmin):
          list_display = ['id','name','gender','book']
        
        # 注册人物模型
        admin.site.register(PeopleInfo,PeopleAdmin)
        
        
    • 自定义站点管理界面后


    视图和URL

    • 站点管理页面做好了, 接下来就要做公共访问的页面了.
    • 对于Django的设计框架MVT.
      • 用户在URL中请求的是视图.
      • 视图接收请求后进行处理.
      • 并将处理的结果返回给请求者.
    • 使用视图时需要进行两步操作
      • 1.定义视图
      • 2.配置URLconf

    1. 定义视图

    • 视图就是一个Python函数,被定义在应用views.py中.

    • 视图的第一个参数是HttpRequest类型的对象reqeust,包含了所有请求信息.

    • 视图必须返回HttpResponse对象,包含返回给请求者的响应信息.

    • 需要导入HttpResponse模块 : from django.http import HttpResponse

    • 定义视图函数 : 响应字符串OK!给客户端

    思考 : 如何才能让请求找到视图?

    2. 配置URLconf

    • 查找视图的过程 :

      • 1.请求者在浏览器地址栏中输入URL, 请求到网站.
      • 2.网站获取URL信息.
      • 3.然后与编写好的URLconf逐条匹配.
      • 4.如果匹配成功则调用对应的视图.
      • 5.如果所有的URLconf都没有匹配成功.则返回404错误.
    image.png
    • URLconf入口
    • 需要两步完成URLconf配置

      • 1.在项目中定义URLconf
      • 2.在应用中定义URLconf
    • 项目中定义URLconf

    • 应用中定义URLconf

      • 提示:一条URLconf包括URL规则、视图两部分

        • URL规则使用正则表达式定义.
        • 视图就是在views.py中定义的视图函数.

    3. 测试:请求访问

    • http://127.0.0.1:8000/

    总结View和URL匹配流程

    模板

    思考 : 网站如何向客户端返回一个漂亮的页面呢?

    • 提示 :

      • 漂亮的页面需要htmlcssjs.
      • 可以把这一堆字段串全都写到视图中, 作为HttpResponse()的参数,响应给客户端.
    • 问题 :

      • 视图部分代码臃肿, 耦合度高.
      • 这样定义的字符串是不会出任何效果和错误的.
      • 效果无法及时查看.有错也不容易及时发现.
    • 设想 :

      • 是否可以有一个专门定义前端页面的地方, 效果可以及时展示,错误可以及时发现,并且可以降低模块间耦合度!
    • 解决问题 : 模板

      • MVT设计模式中的T, Template
    • Django中, 将前端的内容定义在模板中, 然后再把模板交给视图调用, 各种漂亮、炫酷的效果就出现了.

    模板使用步骤

    • 1.创建模板
    • 2.设置模板查找路径
    • 3.模板接收视图传入的数据
    • 4.模板处理数据

    1.创建模板

    • 应用同级目录下创建模板文件夹templates. 文件夹名称固定写法.
    • templates文件夹下, 创建应用同名文件夹. 例, Book
    • 应用同名文件夹下创建网页模板文件. 例 : index.html

    2.设置模板查找路径

    3.模板接收视图传入的数据

    • 模板查找全路径 : os.path.join(BASE_DIR,'templates'+'Book/index.html'

    4.模板处理数据

    5. 查看模板处理数据成果

    总结View-Templates流程

    相关文章

      网友评论

          本文标题:Django基础概念和MVT架构

          本文链接:https://www.haomeiwen.com/subject/hmuiwctx.html