<学习笔记: Django之初见>
阅读原文时间:2022年04月07日阅读:1

Django

1. web框架介绍

  具体介绍Django之前,必须先介绍WEB框架等概念。

  web框架: 别人已经设定好的一个web网站模板,你学习它的规则,然后“填空”或“修改”成你自己需要的样子。

  一般web框架的架构是这样的:

  其它基于python的web框架,如tornado、flask、webpy都是在这个范围内进行增删裁剪的。例如tornado用的是自己的异步非阻塞“wsgi”,flask则只提供了最精简和基本的框架。Django则是直接使用了WSGI,并实现了大部分功能。

2. MVC/MTV介绍

  MVC百度百科:全名Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

  通俗解释:一种文件的组织和管理形式!不要被缩写吓到了,这其实就是把不同类型的文件放到不同的目录下的一种方法,然后取了个高大上的名字。当然,它带来的好处有很多,比如前后端分离,松耦合等等,就不详细说明了。       

  模型(model):定义数据库相关的内容,一般放在models.py文件中。

  视图(view):定义HTML等静态网页文件相关,也就是那些html、css、js等前端的东西。

  控制器(controller):定义业务逻辑相关,就是你的主要代码。  

  MTV: 有些WEB框架觉得MVC的字面意思很别扭,就给它改了一下。view不再是HTML相关,而是主业务逻辑了,相当于控制器。html被放在Templates中,称作模板,于是MVC就变成了MTV。这其实就是一个文字游戏,和MVC本质上是一样的,换了个名字和叫法而已,换汤不换药。

3.Django的MTV模型组织

  目录分开,就必须有机制将他们在内里进行耦合。在Django中,urls、orm、static、settings等起着重要的作用。一个典型的业务流程是如下图所示:

4. Django文件结构

projectname/

  manage.py                                          ----项目管理命令行工具,用于主程序的管理

  projectname/                                     ----项目名称

  __init__.py             

    settings.py                                          ----项目配置文件,定义项目组件,名称,导入python包等

    urls.py                                                 ----项目URL路由映射

    wsgi.py                                               ----定义WSGI接口信息,一般无需改动

  app/                                                   ----app应用名称

  __init__.py             

    admin.py                                            ----管理站点声明文件

    apps.py                                              ----定义应用信息,AppConfig类中定义app 数据元Meta

    models.py                                          ----app模型层数据类文件

    views.py                                             ----定义url响应函数

    tests.py                                              ----测试代码文件,一般不会用到

    migrations/                               ----用于定义引用迁移功能

      __init__.py             

  templates/                                      ----html模板文件存放目录

另外一般在项目中还会创建 static目录,用于存放网页静态文件

在每个django项目中可以包含多个APP,相当于一个大型项目中的分系统、子模块、功能部件等等,相互之间比较独立,但也有联系。

每个APP必定是一个python包,其中包含上述诸多py文件

所有的APP共享项目资源。

4.1 urls.py

用于URL路由映射,将浏览器输入的url映射到具体的业务处理逻辑函数,如果没有找到相应的业务处理逻辑函数,页面返回404 NOT FOUND!

# 早些版本的写法:
from django.conf.urls import patterns, url
import myapps
urlpatterns = patterns("",
url(r"^index/$",myapps.views.index),
)

最新版本的写法

from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]

Django2.0里urls.py配置的改变:

1.把url函数换成path

2.不在使用^、$作为路由

需要注意的是:

patterns分开写,通常是“良好的”编码习惯,为了可读性和可维护性,通常会把相同功能或相似url的放到一组里面:比如凡是页面请求(需要返回html页面)都放到一个patterns里;凡是ajax请求都放到另一个patterns里。

patterns里第一个参数是用来指定函数所在文件路径,

patterns(prefix, *args)
比如,项目结构:

--project
--myapps
  views.py
  urls.py
那么patterns里第一个参数就是:'app.views'。
当然,你也可以置空,然后在url里写全路径:myapps.views.fun_name

urls函数中的include方法:

def include(arg, namespace=None):
app_name = None
if isinstance(arg, tuple):
# Callable returning a namespace hint.
try:
urlconf_module, app_name = arg

include() also accepts as an argument either an iterable that returns URL patterns or a 2-tuple containing such iterable plus the names of the application namespaces.

Parameters:

  • module – URLconf module (or module name)
  • namespace (str) – Instance namespace for the URL entries being included
  • pattern_list – Iterable of path() and/or re_path() instances.
  • app_namespace (str) – Application namespace for the URL entries being included

注意include之前的正则表达式没有终止符 $ 而是 /

当调用clude时,把url前边正则表达式匹配到的chop off(砍掉),剩下的string传递到include的urls中进行进一步操作。

4.2 modles.py

用于模型层数据文件,主要声明数据库的各字段,长度,类型等

定义一个class,继承自models.Model,每一个类属性都会在数据库中产生相应的字段,同样views.py对于数据库的操作也必须与modles.py文件中定义的类属性一致

在model中添加字段的格式一般为:field_name =models.field_type(**field_options)

field.type字段都有如下类型:官方参考文档 ---  https://docs.djangoproject.com/en/1.10/ref/models/fields/

4.2.1  field options(所有字段共用) ----用于 field_options

  1  null   默认为False,True则表示可以为null。(空字符串在数据库中可能被存储为'')

  2  blank  默认为False,True表示可以为空。

  3  choice  可选的,限制了该选项的字段值必须是所指定的choice中的一个。

   4  db_column  数据库column名称。默认为本字段的名称。

  5  db_index  如果为True的话,该字段的数据库索引将会被创建

  6  default   设置该字段的默认值,可以是值也可以是对象。

  7  editable   默认为True,若为False,则不会在admin/界面显示

  8  primary_key  若设置为True,则表示将该字段设置为主键。一般情况下django默认会设置一个自增长的id主键。

  9  unique   若设置为True,该字段值不可重复

4.2.2  field type(字段类型,细分的话可以分为普通字段以及关系字段) ---用于 field_type

 1  普通字段

  1  AutoField()  根据已有id自增长的整形唯一字段,一般每个model类不需设置该字段,因为django会为每个model自动设置。

    django默认会为每个model类添加如下语句:id = models.AutoField(primary_key=True)  当其他字段添加了primary_key属性,则不会创建id字段了

    每个model类仅能有一个主键

  2  BooleanField()  布尔型字段,默认的表单窗口部件是CheckBoxInput

  3  CharField()  字符型字段,默认的表单窗口部件是TextInput。该字段类型有一个必需参数:max_length  在数据库水平限定了字符串最大长度

  4  DateField()  日期字段,字段的值是python中datetime.date的实例,默认的表单窗口是TextInput有几个可选的参数:

    auto_now=True/False:当设置为True时,每当该对象使用save()时,该字段的值就会被更新。

    auto_now_add=True/False: 当设置为True时,该字段的值为该对象被创建时的日期

  5  DateTimeField()  日期和时间字段,值为datetime.datetime实例。默认的表单窗口以及可选参数同上。

  6  DecimalField()  混合精度的小数型数字字段。有两个必需的参数:

    max_digits=ingt_number:限定数字的最大位数(包含小数位)

    decimal_places=int_number:存储数字的小数位

   7  EmailField(max_length=254, **options)  邮件字段,使用EmailValidator进行验证

  8  FileField(upload_to=None, max_length=100, **options)  文件上传字段。

  这个字段不能设置primary_key和unique选项.在数据库中存储类型是varchar,默认最大长度为100.

  有两个可选参数:

    upload_to:如果使用默认的FileSystomStorage,文件将会存储到settings文件中配置的MEDIA_ROOT路径中。upload_to的值也可以为可调用对象,通过调用这个对象可以获得上传路径。

    instance=:  定义了FileField的模型实例

    filename='':  文件名称。

    storage  用来设定文件存储仓库  

class MyModel01(models.Model):
# file will be uploaded to MEDIA_ROOT/uploads
upload = models.FileField(upload_to='uploads/')
# or…
# file will be saved to MEDIA_ROOT/uploads/2015/01/30
upload = models.FileField(upload_to='uploads/%Y/%m/%d/')

#upload_to=可调用对象
def user_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/user_/
return 'user_{0}/{1}'.format(instance.user.id, filename)

class MyModel02(models.Model):
upload = models.FileField(upload_to=user_directory_path)

  9  FilePathField(path=None, match=None, recursive=False, max_length=100, **options)

    这个字段的值被限制在系统上某个目录中的所有文件名集合中。有三个参数

    path='':  该参数必需。上行所说的‘某个目录’的绝对路径。Example: "/home/images".

    match='pattern':  可选参数。格式是正则表达式。用来拣选符合匹配正则表达式的文件

    recursive=True/False: 可选参数,默认为False。设定是否递归该目录下所有子目录的所有文件。    

  10  FloatField()  浮点字段,默认的表单窗口部件是NumberInput。和DecimalField经常混淆不清,

    FloatField在内部使用Python中的float对象,而DecimalField在内部使用Python中的decimal对象。

  11  ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)

    图像字段。继承了FileField的所有属性和方法。而且还能自动验证上传的对象是否为合法的图像。

  12  IntegerField  整形字段

  13  GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)  ip地址字段

    protocol='both/ipv4/ipv6'  默认为both

    unpack_ipv4   用处不大。

  14  NullBooleanField  类似于BooleanField,不同的是其允许值为null

  15  TextField()   与CharField类似,但一般用来存储体积较大的文本。

  16  TimeField(auto_now=False, auto_now_add=False, **options)   时间字段,其值为datetime.time实例

  17  URLField(max_length=200, **options)    URL字段

    类似于CharField的子类,默认最大长度为200.

  18  UUIDField(**options)  通用唯一标识字段,当不想用django默认设置的AutoField字段时,可以用该字段代替。

  2  关系字段

  关系字段:一对一,多对一,多对多

  1  ForeignKey(othermodel, on_delete, **options)  多对一或者一对多或者外键字段。

    othermodel:  所关联的模型,'多' model使用外键关联  '一'model。

           当所关联的模型为他自己时,使用'self'

           当引用的模型为其他app中的模型时,要加上app名称标签:  'app_name.model_name'

           数据库会自动在外键字段上创建索引,可以使用de_index=False关闭该功能。

    on_delete: 当删除 "一" 模型对象时,django会根据该参数的值对与该对象相关联的其他对象(也就是 ‘多’)进行操作。在django1.9以及之前的版本中,on_delete作为一个关键字参数。而在1.10则可以作为第二个参数

    models.CASCADE:   默认为models.CASCADE   级联删除。当删除'一'时,‘多’会被删除。比如:

    modles.PROTECT :    当删除一个具有外键关系的对象时,会引发一个异常,阻止删除该对象

    models.SET_NULL:   设置删除对象所关联的外键字段为null。但字段的null属性必需为True

    models.SET_DEFAULT :    设置删除对象所关联的外键字段为默认的值。

    models.SET(value)  :设置删除对象所关联的对象的外键字段为value,value也可以是一个可调用函数。

    models.DO_NOTHING :  不做任何操作

    limit_choices_to  限制该字段为选项形。格式:limit_choices_to={'is_staff': True}。值也可以为可调用函数。

    related_name  设置从关联对象到自身的关系的名称,若值为'+'  则关联对象与自身无逆向关系。

    to_field  设置所关联对象的关联字段。默认为关联对象的主键字段。

  2  ManyToManyField(othermodel, **options)  多对多字段。

    othermodel:  所关联的model名称

    db_table:  多对多关系会在两个模型所对应的表中间创建一个‘中间表’ ,将多对多转换为两个多对一,该选项为这个中间表设置名称。一般来说django会默认为中间表创建名称,但人们读起来可能搞不清楚究竟中间表关联到了哪里。

    related_name:  同多对一字段中的related_name

    limite_choices_to:  同….

    symmetrical:  当多对多关联对象为自身时可能会用到的参数。默认为True。a,b同属于person模型,person中的friends字段与自身设置了多对多关系,当该值设置为True时,django假定关系为对称,即:a是b的朋友,那么b也是a的朋友。设置为False时,django会强制为逆向关系创建描述信息。

    though:  不想让django自动创建中间表,手动创建中间表所对应的model,通过though指定对应的model名称。

    though_field:  当though参数被使用时,该参数才会有效。指定使用哪些中间模型字段来确立两个模型的多对多关系。

4.3 views.py

用于业务处理逻辑,urls.py将从浏览器上获取url映射到views.py中具体的处理函数中,个人觉得views.py相当于一个调度器,连接前端,调度后端。