Django框架

2019年11月17日 阅读数:272
这篇文章主要向大家介绍Django框架,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

Web框架之Django:

请给做者点赞 —> 原文连接

(1)简介:

  
  

(2)Django的处理流程:

blob.png

  • 当用户发出HTTP请求,URLhandler接收用户请求,根据开发人员设置的路由规则匹配相应的处理类 根据请求的类型判断调用的HTTP方法
  • 若是须要链接数据库,Views中的函数将会调用Models的方法,不然直接去Template中取出HTML页面直接返回
  • 调用Models的时候,Models会去数据库读取数据再返回给Views
  • 通过渲染页面一块儿将最终的HTML页面返回给页面

☆MTV与MVC:

MTV和MVC的思想是同样的的,只是思想的体现有所不一样。javascript

MVC:M管理应用程序的状态,并约束改变状态的行为,通常叫作业务规则;V负责把数据格式化后呈现给用户查看;C接收用户操做,根据访问模型获取数据,并调用视图显示这些数据,控制器(处理器)用于将模型与视图隔离并成为两者之间的联系纽带。html

MTV:M表明数据存取层,也就是Model,改为处理与数据相关的全部事务如何存取,如何验证数据的有效性,包含哪些行为与数据相关;T指的是表现层,该层处理与现实相关的行为,如何在页面文档中显示数据,展示内容,也就是Template;V表明业务逻辑层,该层包含存取模型及调取恰当模板的相关逻辑。java

☆Django版的MTV:

Django也是一个MVC框架。可是在Django中,控制器接受用户输入的部分由框架自行处理,因此 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。node

☆Django设计MVC优美哲学:

1.对象关系映射 (ORM,object-relational mapping):python

  
  

2.URL 分派:mysql

  
  

3.模版系统:jquery

  
  

4.表单处理:git

  
  

5.Cache系统:web

  
  

6.会话(session):ajax

  
  

7.国际化:

  
  

8.自动化的管理界面(Model):

  
  

(3)Django的经常使用命令:

  • 建立程序

    • django-admin startproject sitename # 在当前目录下建立一个Django程序
  • 启动服务器

    • python manage.py runserver ip:port # 启动服务器,默认是127.0.0.1:8000
  • 建立APP

    • python manage.py startapp appname # 建立APP
  • 同步数据库

    • python manage.py syncdb# 同步数据库,Django 1.7及以上版本须要用如下的
  • 建立数据配置文件

    • python manage.py makemigrations # 建立数据配置文件,显示并记录全部数据的改动
  • 建立表结构

    • python manage.py migrate #建立表结构,将改动更新到数据库
  • 建立超级管理员

    • python manage.py createsuperuser # 建立超级管理员
  • 启动命令行模式

    • python manage.py dbshell # 数据库命令行
  • 查看命令列表

    • python manage.py # 查看命令列表

 

(4)Django数据库相关:

☆默认使用SQLite3数据库的配置:

  
  

 

☆MySQL的配置:

  
  

导入 PyMySQL模块

因为Python开发经常使用Python3.x,Django链接数据库的时候使用的是MySQL的MySQLdb模块,然而在Python3中尚未此模块,所以须要使用pymysql进行代替,下面的配置代码写入到项目目录的init.py中便可:

  
  

 

☆PostgreSQL数据库的配置:

  
  

 

☆Oracle数据库的配置:

  
  

Django框架对于开发者而言高度透明化,对于不一样数据库的具体使用方法是一致的,改变数据库类型只须要变更上述配置便可。

 

☆Django中的Model数据库操做:

Django提供了一个抽象层(“Model”)来构建和管理Web应用程序的数据。Django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表。关系对象映射(Object Relational Mapping,简称ORM)。

建立Django项目后的目录结构:

  
  

 

★建立基本表结构:

  
  

# file:models.py

  
  

执行命令: python manage.py makemigrations

  
  

执行命令:python manage.py migrate

  
  

可视化以下:

blob.png

其余的字段参数:

  1. null = True # 数据库字段是否能够为空
  2. blank = True # django的 Admin 中添加数据时是否可容许空值
  3. primary_key = False # 主键,对AutoField设置主键后,就会代替原来的自增 id 列
  4. auto_now # 自动建立,不管添加或修改,都是当前操做的时间
  5. auto_now_add # 自动建立永远是建立时的时间
  6. 选择:
  
  

 

  1. max_length # 长度,是CharField必须属性
  2. default # 默认值
  3. verbose_name # Admin中字段的显示名称
  4. name|db_column # 数据库中的字段名称
  5. unique = True # 不容许重复
  6. db_index = True # 数据库索引
  7. editable = True # 在Admin中是否能够编辑
  8. error_messages = None # 错误提示
  9. auto_created = False # 自动建立

16.help_text # 在Admin中提示帮助信息

  1. validators = []
  2. *upload-to**

其余的字段:

1. models.AutoField

  • 自增列,int类型,若是没有设置,默认会生成一个名称为id的列,若是要显示一个自定义的自增列,必须将其设置为主键

2. models.CharField

  • 字符串字段,必须设置max_length属性

3. models.BooleanField

  • 布尔类型,在数据库中的类型使用tinyint类型构造实现,不能为空

4. models.ComaSeparatedIntegerField

  • 用逗号分割的数字,在数据库中是varchar类型,继承自CharField,因此必须 max_lenght 属性

5. models.DateField

  • 日期类型,在数据库中对应date类型,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次建立添加,以后的更新再也不改变。

6. models.DateTimeField

  • 日期类型,在数据库中对应datetime,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次建立添加,以后的更新再也不改变。

7. models.Decimal

  • 十进制小数类型,在数据库中对应decimal类型,必须指定整数位max_digits和小数位decimal_places

8. models.EmailField

  • 字符串类型(正则表达式邮箱),在数据库中对应varchar类型

9. models.FloatField

  • 浮点类型,在数据库中对应double类型

10. models.IntegerField 

  • 整型,在数据库中对应int类型

11. models.BigIntegerField 

  • 长整形
  1.  

        
        
  1. models.IPAddressField  
  • 字符串类型(ip4正则表达式)
  1. models.GenericIPAddressField  
  • 字符串类型(ip4和ip6是可选的),参数protocol能够是:both、ipv四、ipv6,验证时,会根据设置报错
  1. models.NullBooleanField  
  • 容许为空的布尔类型
  1. models.PositiveIntegerFiel  
  • 正数范围的Integer
  1. models.PositiveSmallIntegerField  
  • 正数范围的smallInteger
  1. models.SlugField  
  • 减号、下划线、字母、数字
  1. models.SmallIntegerField  
  • 数字,数据库中的字段有:tinyint、smallint、int、bigint
  1. models.TextField  
  • 字符串,在数据库中对应longtext
  1. models.TimeField  
  • 时间 HH:MM[:ss[.uuuuuu]]
  1. models.URLField  
  • 字符串,地址正则表达式
  1. models.BinaryField  
  • 二进制

24.models.ImageField

  • 图片
  1. models.FilePathField
  • 文件

 

元数据:

 

  • db_table = ‘TableName’ # 数据库中生成的名称,使用app名称+下划线+类名
  • index_tohether = [(‘pub_date’,’deadline’)] # 联合索引
  • unique_together = ((‘drive’,’ restaurant’)) # 联合惟一索引
  • verbose_name admin中显示的名称

 

触发Model中的验证和错误提示有两种方式:

  1. DjangoAdmin中的错误信息会优先根据Admin内部的ModelForm错误信息提示,若是都成功,才会再验证Model的字段并显示指定的错误信息。

更改Admin中的错误提示:

  
  
  1. 调用Model对象的clean_fields方法:
  
  

 

★连表操做:

一对多:models.ForeignKey(其余表)

多对多:models.ManyToManyField(其余表)

一对一:models.OneToOneField(其余表)

1. 一对多:

  
  

2. 一对一:

  
  

3. 多对多:

  
  

 

★表的增删改查:

1.对数据进行增长数据:

  
  

 

1.1也能够直接传入字典建立:

  
  

2. 删除数据:

  
  

3.修改数据:

  
  

4.查询数据:

  
  

 

★使用双下划线链接操做:

1.获取个数:

  
  

2.比较大小:

  
  

3.是否包含:

  
  

4.是否为空:

  
  

5.contains:

  
  

6. range范围:

  
  

7.其余的操做:

  
  

8. order by:

  
  

9. group by:

  
  

10. limit 、offset:

  
  

11. regex正则匹配,iregex 不区分大小写:

  
  

12.日期:

  
  

13.年月日周时分秒:

  
  

14.extra:

extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None),有些状况下,Django的查询语法难以简单的表达复杂的 WHERE 子句,对于这种状况, Django 提供了 extra() QuerySet 修改机制,它能在 QuerySet生成的SQL从句中注入新子句。不管什么时候你都须要很是当心的使用extra(). 每次使用它时,您都应该转义用户可使用params控制的任何参数,以防止SQL注入攻击。因为产品差别的缘由,这些自定义的查询难以保障在不一样的数据库之间兼容(由于你手写 SQL 代码的缘由),并且违背了 DRY 原则,因此如非必要,仍是尽可能避免写 extra。

  
  

 

★F和Q:

from django.db.models import F

models.Tb1.objects.update(num=F('num')+1) #F用于拿到原始数据

# ##方式一:

  
  

# ##方式二:

  
  

 

★执行原生SQL:

  
  

 

★利用双下划线和 _set 将表之间的操做链接起来:

  
  

2.一对一操做:

  
  

3.一对多操做:

  
  

# 正向查找一对多

  
  

# 反向查找一对多

  
  

4.多对多操做:

  
  

# 添加数据

#group_obj.user_info.add(user_info_obj)

\#group_obj.user_info.add(*user_info_objs)

# 删除数据

  
  

# 添加数据

  
  

# 删除数据

  
  

# 获取数据

  
  

# 获取数据

  
  

# 添加多对多

  
  

 

(5)Django路由系统:

Django的路由系统本质就是URL正则与调用的视图函数之间的映射表,URL的加载是从配置中开始的。

这样Django也就很好的支持了静态路由,基于正则的动态路由,以及二级路由,一样开发人员也能够自行使用基于请求方法的路由。

  
  

参数是可选的要传递给视图函数的默认参数(字典形式)

别名也是可选的

例如:

  
  

其余使用正则的例子:

  
  

说明:

  1. 要捕获从URL中的值,用括号括起来,会当参数传入 views 视图。
  2. 没有必要添加一个斜线,由于每一个URL都有。例如,它articles不是/articles。
  3. 在'r'前面的每一个正则表达式字符串中是可选的,但建议。它告诉Python字符串是“原始” -没有什么字符串中应该进行转义。

使用正则分组:

  
  

Django的二级路由示例:

  
  

须要注意的是,当你加上参数时,对应函数views.year_archive必须加上一个参数,参数名也必须命名为 foo,这样就实现了参数名的静态绑定,放置参数顺序出错。

(6)Django的View视图函数:

HTTP中产生的两大对象:

  1. HTTP请求:HttpRequest
  2. HTTP应答:HttpResponse

☆HttpRequest对象:

当请求一个HTML页面的时候,Django将会建立一个HttpRequest对象包含原数据的请求,而后Django加载适合的视图,经过HTTPRequest做为视图函数的一地个参数。每一个视图负责返回一个HttpResponse响应。

HttpRequest对象的属性:

  1. path:请求页面的全路径,不包括域名
  2. method:请求中使用的HTTP方法的字符串表示。全大写表示。例如
  
  

GET: 包含全部HTTP GET参数的类字典对象

POST:包含全部HTTP POST参数的类字典对象

服务器收到空的POST请求的状况也是可能发生的,也就是说,表单form经过HTTP POST方法提交请求,可是表单中可能没有数据,所以不能使用if req.POST来判断是否使用了HTTP POST 方法;应该使用if req.method=="POST"。

  1. COOKIES:

    • *包含全部cookies的标准Python字典对象;keys和values都是字符串。**
  2. FILES:

    • 包含全部上传文件的类字典对象;FILES中的每个Key都是标签中 name属性的值,FILES中的每个value同时也是一个标准的python字典对象,包含下面三个Keys:
    • filename:上传文件名,用字符串表示
    • content_type:上传文件的Content Type
    • content:上传文件的原始内容

5. user:

是一个django.contrib.auth.models.User对象,表明当前登录的用户。若是访问用户当前没有登录,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。能够经过user的is_authenticated()方法来辨别用户是否登录:
  
  

6. session:

  • 惟一可读写的属性,表明当前会话的字典对象;本身有激活Django中session支持时该属性才可用。

7. META:

一个标准的Python字典包含全部可用的HTTP头。可用标题取决于客户端和服务器,一些例子:

  
  

☆HttpResponse对象属性:

对于HtppResponse对象来讲,是由Django自动建立的牡丹石HTTPResponse对象必须开发人员手动建立,每一个View请求处理方法必须返回一个HTTPResponse对象。

HTTPResponse对象经常使用的方法:

  1. 页面渲染,render,render_to_response,推荐使用render,由于render功能更为强大。
  2. 页面跳转,redirect
  3. 页面传参,locals,能够直接将对应视图中的全部变量所有传递给模板。
  • 示例代码:
  
  

对于render的:

  
  

结合给定的模板与一个给定的上下文,返回一个字典HttpResponse在渲染文本对象。

  • request和template_name是必须参数,request指的是传来的resquest,template_name指的是HTML模板或模板序列的名称,若是给定的是序列,那么序列中的第一个模板将被引用。
  • context 一组字典的值添加到模板中。默认状况下,这是一个空的字典。
  • content_type MIME类型用于生成文档。
  • status 为响应状态代码。默认值为200
  • using 这个名字一个模板引擎的使用将模板。

(7)Django模板和模板语言:

要使用模板,必然会牵扯到静态文件的配置,好比CSS,Js等,在Django的项目目录中的settings.py中追加:

 

  
  

其中static是存放静态文件的目录,这样就能在HTML页面中引用特效或者图片了。对于模板,其实就是读取模板,模板中嵌套着标签,而后渲染数据的时候,从Model中取出数据插入到模板中,最后用户接收到请求的响应。

模板语言:

  
  

继承:

  
  

其余经常使用方法:

  
  

在字典中取出数据使用dict.some的形式

自定义标签:

由于在模板语言中不能进行逻辑运算,因此在Django中提供两种自定义的标签,

  • 一种是simple_tag,
  • 另外一种是filter。

simple_tag能够传递任意参数,可是不能用做布尔判断,filter最多只能传递2个参数,能够用作布尔判断,一样的,simple_tag和filter的实现是相似的。

示例代码:

  
  

在HTML文件中导入以前建立的Python文件,使用load命令:

  
  

使用simple_tag:

  
  

须要在项目目录中的settings.py中配置当前的APP:

  
  

(8)Django的中间件:

中间件示意图:

blob.png

每一次用户的请求都会一层一层穿过中间件,当不符合中间件的业务逻辑的时候就会直接返回,用户请求到达不了最里层的业务逻辑处理函数,这样能够自定义中间件,在不使用Nginx等第三方工具的时候统计每次用户的访问次数。

中间件其实就是一个Python文件,可是其中的类须要继承自

from django.utils.deprecation import MiddlewareMixin

在这个文件中能够建立以下5中函数:

# 请求到来以前执行

  
  

# 数据返回以前执行

  
  

# 执行view中的方法以前执行

  
  

# 程序出错时执行

  
  

# 渲染模板数据时执行

  
  

须要在项目目录中的settings.py文件中设置: