Django基础概念和MVT架构

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://upload-images.jianshu.io/upload_images/2760539-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流程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • Django 准备 “虚拟环境为什么需要虚拟环境:到目前位置,我们所有的第三方包安装都是直接通过 pip inst...
    33jubi阅读 1,315评论 0 5
  • 一、Django介绍 1.简介 Django,发音为[`dʒæŋɡəʊ],是用python语言写的开源web开发框...
    阿孝不会飞阅读 749评论 0 2
  • PythonWeb框架要点、Django介绍、工程搭建、配置、静态文件与路由 1.Python Web 框架要点 ...
    Cestine阅读 1,431评论 0 6
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,956评论 1 3
  • 上面这两个图片是ORM对象关系映射的关系理解。 django框架 一、简介 web框架 具体介绍django之前,...
    AAA年华阅读 2,336评论 0 2