Django框架

1、总体结构

Django是MTV结构,即:Model, Template, View

  • Model:定义数据的存储格式,并且提供了数据库访问的API。
  • View:定义那些数据被显示,是业务逻辑处理模块。
  • Template:定义数据如何被显示。

Django工程包含工程的配置、及多个APP,每个APP完成相对独立的功能。在设计中,要尽量保持每个APP的独立性,以做到APP是即插即用。

image-20230708094817905

image-20230717215611382
(1)MVC(MVT)架构的本质

​ 其实本质上就是个目录文件夹的功能划分而已,我们平时写比较复杂的Python程序的时候,也要进行类似的分类,不然的话,我们书写的逻辑,我们要加载的HTML代码,以及与数据库有关的代码,全部写到一个文件里边,就会导致以后很难地去维护,那么这时候MVC就出来了

所以:

  • MVC就是对文件夹的一个分类,对它们职责的一个划分
  • 别人问你什么是MVC啊,你就说我刚好写的Python分类的文件夹就是MVC啊

2、交互关系

image-20230717215637888

(1)用户通过浏览器向我们的服务器发起一个请求(request),这个请求会URL通过URLConf模块映射到View函数,将HttpRequest对象作为参数传入;

(2)a.如果不涉及到数据调用,那么这个时候视图函数直接返回一个模板也就是一个网页给用户。

​ b.如果涉及到数据调用,那么视图函数通过Model访问数据库,进行业务逻辑运算得到输出数据,然后逐级返回。

(3)视图函数把返回的数据填充到模板(Template)中空格,加载Template,根据输出数据生成页面,将HttpResponse对象返回

image-20230723113252398

​ 上图中圆圈代表请求,当客户端向服务端发起请求的时候,请求首先到Django的路由系统,如果我们客户端发过来的URL与Django路由系统里的某个URL相同的话,会匹配到这个URL对应的视图函数,这个对应关系程序运行起来就已经放到我们的服务器内存里面了, 然后视图函数可以去数据库里面拿数据,也可以渲染HTML页面返回给浏览器

3、Model

  • 通常情况,一个Models对应数据库的一张表
  • Django中Models以类的形式表现
  • 我们只需要在类里面进行操作,就可以操作数据库,表,不需要直接使用SQL语句
  • 我们通过创建类来创建数据表,所以对数据库的操作,都是对类与对类的对象进行操作,而不使用sql语句
  • 一个类对应于数据库中的表(Table),类属性对应于表的字段(Field)。
  • 从 django.db.models.Model 派生,支持继承。
  • 要使用一个APP时,需要将该APP的Model添加到工程的 settings.py INSTALLED_APPS 中。
3.1 models的属性与字段(field)
1.field类型
  • AutoField:一个自动递增的整形字段,通常用于主键

  • CharField:字符串字段,用于输入较短的字符,对应与HTML里面

  • TextField:文本字段,用于输入较多的字符,对应html标签

  • EmailField:邮箱字段,用于输入带有Email格式的字符

  • DateFiled

  • TimeFiled

  • DateTimeField:日期字段,支持时间输入

  • ImageField:用于上传图片并验证图片合法性,需定义upload_to参数,使用本字段需安装python pillow等图片库

  • IntegerField:整数字段,用于保持整数信息

2.field属性
  • primary_key:设置True or False,定义此字段是否为主键
  • default:设置默认值,可以设置默认的文本、时间、图片、时间等
  • null:设置True or False,是否允许数据库字段为Null,默认为False
  • blank:设置True or False,定义是否运行用户不输入,默认为False;若为True,则用户可以不输入此字段
  • max_length:设置默认长度,一般在CharField、TextField、EmailField等文本字段设置
  • verbose_name:设置该字段的名称,所有字段都可以设置,在Web页面会显示出来(例如将英文显示为中文)
  • choices:设置该字段的可选值,本字段的值是一个二维元素的元祖;元素的第1个值为实际存储的值,第2个值为HTML页面显示的值
  • upload_to:设置上传路径,ImageField和FileField字段需要设置此参数,如果路径不存在,会自动创建
3.Meta类属性
  • verbose_name:设置对象名称(例如usecms),若没有设置,则默认为该类名的小写分词形式,例如类名为CamelCase会被转换为camel case;
  • verbose_name_plural:设置对象名称复数(例如usercms),一般设置跟verbose_name一样,verbose_name_plural=verbose_name否则会默认加s;
  • db_table:设置映射的数据表名,默认为“应用名_模型名”,即用该模型所在app的名称加本模型类的名称
    proxy:设置True or False,设置本模型及所有继承本模型的子模型是否为代理模型;
  • abstract:设置True or False,设置本模型类是否为抽象基类;如果是抽象基类,那么是不会创建这张表的,这张表用来作为基类被其他的表继承
3.2 model层的命令详解
  • python manage.py makemigrations+名字:# 生成数据库表的初始化文件initial.py文件
  • python manage.py migrate# # 基于数据库表初始化文件initial.py文件,正式生成数据表
  • python manage.py sqlmigrate polls 0001查看数据库的生成语句,因为initial.0001是数据库表的初始化文件

4、View

​ View代表一种应用, 返回被请求的页面。 View要实现两个功能:URL的分发处理,定义View函数。

(1)URL分发处理

​ 使用正则表达式定义 URL pattern,建立到View函数的映射关系。

1)环境配置

  • settings.ROOT_URLCONF:定义URL的配置文件位置;
  • settings.urlpatterns:定义URL patterns 到View函数的映射关系;

2)URLpattern 匹配的范围:

  • 不包含domain
  • 不包含GET, POST参数
  • 匹配后的参数作为字符串传入view function

3)从匹配结果到函数参数

  • 传送给View函数的第一个参数是HttpRequest对象,正则表达式匹配的内容作为第二个参数传入。
  • 可以使用Named groups,将匹配的部分作为keyword参数。
  • 格式:(?Ppattern)

4)避免重复定义的机制

  • view prefix:提取view function的公共前缀
  • Including other URLconf
(2)View函数

​ 接收Web请求,返回Web响应,基本的处理流程是

  1. 收到传入的HttpRequest参数;
  2. 从HttpRequest中获得输入数据;
  3. 进行数据处理,构造Context数据;
  4. 加载Template;
  5. 使用Context数据Render Template;
  6. 返回 HttpResponse;

1)相关的类

  • class HttpRequest:通过POST或GET属性访问传入的参数
  • class HttpResponse:主要派生类有 class HttpResponseRedirect,class HttpResponseNotFound
  • class UploadedFile
  • class QueryDict:multiple values for the same key

2)快捷函数

  • render
  • render_to_response
  • redirect
  • get_object_or_404
  • get_list_or_404

5、Template

​ Template用于描述数据的表现,不包含业务逻辑处理。Django不是简单的将Python语言嵌入到HTML代码中,而是定义了一套标记,用于实现对HTML中数据的控制。通过变量访问数据,通过TAG控制Template的处理逻辑。

(1)变量
  • 格式:{{ variable }}
(2)TAG
  • 格式:
  • 常用的有:for/if/block and extends
(3)过滤器功能
  • 格式:{{ name|lower }}
  • 例:{{ value|default:"nothing" }}
  • 常用内置的过滤器:default, length, striptags
(4)Template继承
  • 使用block/extend实现。
  • 在父模板中,使用block定义扩展点。
  • 在派生模板中,使用extend对扩展点进行重新定义。也可以引用父模板中的定义,使用{{ block.super }} 。
posted @   德琪  阅读(110)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示