Django框架

Web框架之Django:

请给作者点赞 —> 原文链接

(1)简介:

(2)Django的处理流程:

blob.png

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

☆MTV与MVC:

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

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

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

☆Django版的MTV:

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

☆Django设计MVC优美哲学:

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

2.URL 分派:

3.模版系统:

4.表单处理:

5.Cache系统:

6.会话(session):

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、ipv4、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文件中设置:

 

(8)Django文件上传和Form验证:

☆自定义文件上传:

☆Form上传:

示例代码:

# HTML

# Form

# Models

# Views

☆Ajax上传文件:

# HTML:

# Form:

# Models:

# Views:

 

(9)Django的Auth认证系统:

auth模块是Django提供的标准权限管理系统,可以提供用户的身份认证,用户组管理,并且和admin模块配合使用。

启用auth模块:

# Application definition

# model:

# 数据库中该表名为auth_user.

新建用户:

# 不存储用户密码明文而是存储一个Hash值

认证用户:

 

修改密码:

# 以下实例为先认证通过后才可以修改密码

登录:

# 实例:

退出登录:

# logout会移除request中的user信息, 并刷新session

设置只允许登录的用户访问:

@login_required装饰器的view函数会先通过session key检查登录信息,已经登录的用户允许正常执行操作,未登录的用户会重定向到login_url指定的位置,这个参数在项目目录中的settings.py中进行设置。

# settings 配置

# views

 

(11)跨站请求伪造CSRF:

Django 为了用户实现放置跨站请求伪造,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于 Django 中设置防跨站请求伪造功能分为全局设置和局部设置。

全局使用就是直接使用django.middleware.csrf.CsrfViewMiddleware,在项目目录中的settings.py中进行配置。使用装饰器可以进行局部的设置:

  • @csrf_exempt取消当前函数的防跨站请求伪造功能
  • @csrf_protect仅启用当前函数的防跨站请求伪造功能

使用时要进行导入:

在Django1.10中,为了防止BREACH攻击,对cookie-form类型的csrf做了一点改进,即在cookie和form中的token值是不相同的。

应用方式也分为两种:

☆普通表单使用CSRF:

  1. HTML文件中设置令牌:{% csrf_token %}
  2. 在View函数中设置返回值:return render(request, 'xxx.html', data)

☆Ajax使用CSRF:

对于传统的form,可以通过表单的方式将token再次发送到服务端,而对于ajax的话,使用如下方式:

 

(12)Django中的Cookie和Session:

☆获取cookie:

☆设置cookie:

☆使用jQuery操作cookie:

 

☆Session类型:

  • Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

★数据库:

配置 settings.py:

# 引擎(默认)

# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)

# Session的cookie保存的路径(默认)

SESSION_COOKIE_DOMAIN = None         

# Session的cookie保存的域名(默认)

SESSION_COOKIE_SECURE = False     

# 是否Https传输cookie(默认)

SESSION_COOKIE_HTTPONLY = True    

# 是否Session的cookie只支持http传输(默认)

SESSION_COOKIE_AGE = 1209600           

# Session的cookie失效日期(2周)(默认)

SESSION_EXPIRE_AT_BROWSER_CLOSE = False         

# 是否关闭浏览器使得Session过期(默认)

SESSION_SAVE_EVERY_REQUEST = False   

# 是否每次请求都保存Session,默认修改之后才保存(默认)

 

★缓存:

配置 settings.py:

★文件:

配置 settings.py:

★缓存+数据库:

数据库用于做持久化,缓存用于提高效率。

配置 settings.py:

★加密cookieSession:

配置 settings.py:

 

(13)Django的缓存:

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。如果出现多个url匹配同一个view函数的情况,缓存机制会根据每一个不同的url做单独的缓存.Django中提供了6种缓存方式:

☆1.开发调试:

配置:

自定义key:

 

☆2.内存:

配置:

 

☆3.文件:

配置:

 

☆4.数据库:

配置:

执行创建表命令 python manage.py createcachetable

☆5.Memcache缓存(python-memcached模块):

配置:

 

☆6.Memcache缓存(pylibmc模块):

配置:

 

☆使用缓存:

1.全站使用缓存:

2.单独视图缓存:

2.1方式一:

2.2方式二:

3.局部视图使用:

使用缓存:

 

(14)Django信号:

Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

☆内置信号:

1.Model signals

2.Management signals

3.Request/response signals

4.Test signals

5.Database Wrappers

使用信号:

# 定义接收到信号时执行的回调函数

#注册信号

或:

☆自定义信号:

1.定义信号:

2.注册信号:

3.触发信号:

 

(16)Django中的Admin:

Django admin是一个Django提供的后台管理页面,这个管理页面提供完善的HTML和CSS,是的在model中创建表结构后,在admin中就可以增删改查,配置Django的Admin需要以下步骤:

1.创建后台管理员

2.配置URL

3.注册和配置Django Admin后台管理页面admin.py:

admin中的配置:

设置数据表名称:

在model中还要:

为数据表添加搜索功能:

添加快速过滤:

 

(17)Django中的Form:

Django中的Form一般用来输入HTML或者验证用户输入。

# Form:

# View:

 

在使用Model和Form时,都需要对字段进行定义并指定类型,通过ModelForm则可以省去Form中字段的定义:

 


posted @ 2018-09-01 18:59  阿谋  阅读(163)  评论(0)    收藏  举报