Day4:深入理解Django

101 阅读14分钟

1.大致理解

了解历史:python的web框架有很多:Django,Weppy,Bottle和Flask等等。Django从出现到目前已经有十多年了,它已经成为Python最广泛部署的用于创建Web应用程序的框架之一。 Django配备了你可能需要的大部分组件,因此它倾向于构建大型应用程序而不是小型应用程序。

Django包含了开发普通Web应用程序所需的许多部分。路由,URL解析,数据库连接(包括ORM),表单验证,攻击保护和模板都是内置的。

Django想要理解,首先要明白的就是Django的大致组成,它大致由四部分组成,也就是提到的MTV模型:

Model(模型):负责业务对象与数据库的对象(orm)

Template(模板):负责把数据展示给用户(前端的东西)

View(视图):负责业务逻辑,并在适当的时候会调用Model和Template

URL分发器:通过前台请求的url,来分配调到相应的函数操作,类似于网络中的路由表,控制网络的下一跳的地址。

了解了组成部分,接下来我们需要了解Django请求的生命周期:

one.png

two.png

three.webp

1、浏览器输入url发送访问请求,首先到达django的URL控制器(urls.py)。

2、URL控制器通过URL地址分配跳转到相应的View视图(views.py)中的对应函数。

3、View视图如果需要访问数据库操作数据,需要实例化Model模型中的类(models.py),然后通过对类的操作就是对数据库的操作。

4、

a)如果未创建数据库,Model模型里面是以面向对象的形式将每张数据表以类的方式创建出来,然后通过makemigrations就可以同步到数据库来进行表的创建和表关系的建立。

b)如果已创建数据库,并且已经同步数据库,那么实例化类的对象,就可以操作数据库了。

5、返回数据库请求的数据。

6、上一步请求的数据是在View视图实例化类的地方接收数据。

7、在View模型中,通过对数据的操作或者其他的相应操作、计算等,将数据参数传递到Template模板。

8、将View模板中的数据接收,通过将其嵌入到前端页面的代码中,实现漂亮的可视化展示

Django的核心是同步。但是,添加异步行为的一种方法是通过Django Channels项目。这个项目是官方的Django附加组件,它为Django添加了对连接和套接字的异步处理,同时保留了Django的编程习惯用法。

ok,这个时候我们分对应模块来看(url控制器、视图、模型)

1.url控制器(urls.py文件):这个很简单,就是我们之前学的路由组件

2.视图(views.py文件):因为视图介于模板template、model、控制器之间,所以这就要求了它需要有足够的自由度来处理请求、接收数据、处理数据、返回数据(这里就涉及到之前学习的QuerySet、Instance、Django REST Framework中的(Django Serialization序列化、Django APIView、ModelViewSet、Django-DRF自定义函数))

3.model:这里就涉及连接数据库、操作数据库(创建表、写入数据、检索数据、更新数据、删除数据等操作) 以上三个是入门最主要的,同时可能还会涉及cookie和session、csrf攻击、ajax、事务、中间件、跨域和同源等内容,内容涵盖面向对象、网络、并发、数据库、前端等等,内容多而繁杂,但对于我们全栈工程师来说都是要了解的会的内容。

2.Cookie和Session

先聊聊cookie和session吧:Cookie和Session都是用于在Web应用程序中管理用户身份验证和状态的重要工具。

Cookie: 1.什么是cookie:Cookie是一段文本信息,由服务器发送给用户的浏览器,并存储在用户的计算机上。通常用在用户请求不同页面时保持用户的状态和身份验证信息。 2.工作原理: 当用户首次访问网站时,服务器可以在HTTP响应头中包含一个Set-Cookie标头,以向浏览器发送一个或多个Cookie。浏览器将这些Cookie存储在本地,并在后续请求中将它们包括在Cookie标头中发送给服务器。服务器可以使用这些Cookie来识别用户,并根据需要提供个性化内容。

Session: 1.什么是Session:会话是服务器端的状态管理机制,用于跟踪特定用户的状态信息。每个用户会话都有一个唯一的标识符,通常存储在Cookie中,但实际会话数据存储在服务器上。 2.工作原理: 当用户首次访问网站时,服务器会创建一个唯一的会话ID,将其存储在Cookie中,并在服务器端为该用户创建一个会话对象。这个会话对象用于存储用户的状态信息,例如购物车内容、登录状态等。会话ID在后续请求中被浏览器发送到服务器,以识别用户并检索相关的会话数据。

Django的会话是基于Cookie的,但会话数据实际上存储在服务器上。默认情况下,Django使用数据库存储会话数据,但也可以配置为使用缓存或文件系统。这确保了会话数据的持久性和安全性。

总之,Cookie和Session是Web应用程序中用于管理用户状态和身份验证的重要机制。Django提供了方便的工具来处理它们,使开发人员能够轻松地实现各种用户交互功能。(相关内容可以查看官方文档)

3.csrf攻击

也称跨站请求伪造攻击 ,作为一种网络攻击,主要就是以受害者身份执行未经授权的操作。攻击者通常欺骗用户执行一些操作,而用户在登陆状态下访问某个网站时会自动执行这些操作,从而导致不良后果。 好像有点懵:我们来了解了解原理: 1.攻击者创建伪造请求: 攻击者制作一个包含恶意操作的HTTP请求,如改变密码或执行购买操作的请求。 2.用户受到欺骗: 攻击者诱使用户点击了一个链接、访问了一个网站或者打开了一个恶意电子邮件,这个链接或操作执行了攻击者制作的HTTP请求。 3.用户的凭证被滥用: 由于用户已经在目标网站上登录,浏览器会自动发送与用户凭证(如Cookie)相关的请求,这就导致了攻击者的请求被以用户身份执行。

ok,这是不是就很简单明了了呢 Django中的CSRF保护:

Django采用了多层次的安全措施来保护应用免受CSRF攻击。以下是Django中处理CSRF攻击的主要方面:

  1. CSRF令牌: Django为每个用户生成一个唯一的CSRF令牌,并将其嵌入表单或Ajax请求中。在表单提交时,Django会验证令牌的有效性,以确保请求不是伪造的。
  2. 中间件: Django使用CSRF中间件来检查每个POST请求中的CSRF令牌。如果请求中的令牌无效,Django将拒绝请求。
  3. csrf_exempt装饰器: 对于某些视图,您可以使用@csrf_exempt装饰器来禁用CSRF保护,但这通常仅在特殊情况下使用。
  4. csrf_token标签: Django模板系统提供了{% csrf_token %}标签,用于在表单中包括CSRF令牌。
  5. CSRF_COOKIE_SECURE设置: 可以通过配置CSRF_COOKIE_SECURE来强制CSRF令牌仅在安全的连接(HTTPS)下传输。
  6. CSRF_HEADER_NAME设置: 您还可以通过CSRF_HEADER_NAME设置来指定一个自定义的HTTP头字段,用于在AJAX请求中传递CSRF令牌。

如何使用CSRF保护:

  1. 在Django中,要启用CSRF保护,您只需确保Django的CSRF中间件在MIDDLEWARE设置中启用。这通常是默认设置。
  2. 在模板中,在包含表单的地方使用{% csrf_token %}标签,以确保CSRF令牌被包括在POST请求中。
  3. 在视图中,您通常不需要处理CSRF令牌验证,因为Django会自动处理它。

综而言之,Django提供了强大的CSRF保护机制,使您能够轻松地保护应用程序免受CSRF攻击。要正确使用CSRF保护,只需确保Django中间件配置正确,使用{% csrf_token %}标签,并了解Django在后台自动处理CSRF验证。这有助于确保应用程序的安全性和用户数据的完整性。

既然上面谈到了中间件,那我们接下来就看看中间件吧

4.中间件

这是一个在web应用程序中处理请求和响应时位于应用核心逻辑之前或之后执行的组件。简单的说就是在请求到达应用程序之前或离开应用程序之后执行一些处理。 中间件的工作原理:

  1. 请求中间件(Request Middleware): 请求进入应用程序之前,请求中间件会执行一些处理。这包括身份验证、跟踪用户会话、解析请求数据等。请求中间件可以修改请求对象或执行其他操作。
  2. 应用程序核心逻辑: 请求进入应用程序核心逻辑,执行相应的视图函数或类,生成响应数据。
  3. 响应中间件(Response Middleware): 在应用程序生成响应之后,响应中间件可以执行一些处理。这包括添加响应头、缓存响应、Gzip压缩、日志记录等。响应中间件可以修改响应对象或执行其他操作。

再来了解在Django的中间件的应用 :

  1. AuthenticationMiddleware: 处理用户身份验证信息,将用户信息添加到请求对象中,以便在视图中访问。这允许您识别用户身份并管理登录状态。
  2. SessionMiddleware: 处理用户会话,包括创建和维护会话ID以及将会话数据存储在数据库或其他后端中。
  3. CsrfViewMiddleware: 处理CSRF保护,验证表单提交中的CSRF令牌。这有助于防止CSRF攻击。
  4. SecurityMiddleware: 提供各种安全性功能,如点击劫持防护、XSS防护、Content Security Policy(CSP)等。
  5. Middleware for Compression and Caching: 这些中间件可用于启用响应内容的Gzip压缩以提高性能,以及设置缓存策略以降低服务器负载。
  6. LoggingMiddleware: 用于记录请求和响应信息,以进行应用程序监控和故障排除。
  7. CorsMiddleware: 处理跨域资源共享(CORS),允许或拒绝来自不同域的请求。
  8. Custom Middleware: 您还可以编写自定义中间件来执行特定于应用程序的任务,例如在每个请求中添加自定义标头、进行特定日志记录或执行其他自定义逻辑。

由此可知:在身份验证和授权、CSRF保护、session管理、安全性控制、性能优化、日志记录、请求处理和转换、url重定向、自定义逻辑等等方面发挥着重要作用。

配置中间件:

在Django中,中间件的配置是通过MIDDLEWARE设置完成的。您可以在Django项目的设置文件中定义中间件的顺序。通常,Django的内置中间件已经配置好,但您可以根据需要进行自定义配置。

5.事务

这是一个科班比较讨厌的数据库的学习内容,我们先来看看事务在django中的应用Django中事务的处理情况:

事务处理情况:

  1. 自动事务处理: Django默认情况下使用自动事务处理。这意味着每个视图函数(或Django管理命令)在执行时都会启动一个数据库事务。如果视图执行成功(没有抛出异常),Django会提交事务;否则,它会回滚事务。
  2. 事务的嵌套: 在Django中,事务可以嵌套。如果一个视图函数内部调用了另一个视图函数,每个视图函数都会拥有自己的事务。如果内部视图的事务失败,则外部事务会回滚,以确保嵌套事务的原子性。
  3. 事务管理: 您可以使用@transaction.atomic装饰器来明确指定某个视图函数应该使用事务。这可以用于自定义事务管理,以确保在特定视图中的数据库操作是一个原子操作。
from django.db import transaction

@transaction.atomic
def my_view(request):
    # 在此函数内执行的数据库操作将在一个事务中
	# 如果抛出异常,事务会回滚;否则,事务会提交
  1. 事务回滚: 如果在视图函数中抛出异常,Django会自动回滚事务,以确保数据的一致性和完整性。
  2. 手动事务处理: 如果需要更细粒度的事务控制,您可以使用transaction.commit()来手动提交事务,或transaction.rollback()来手动回滚事务。
from django.db import transaction

def my_view(request):
    try:
        with transaction.atomic():
            # 在这里执行数据库操作
        # 事务成功提交
    except:
        # 事务回滚
        transaction.rollback()

在Django中,默认情况下使用自动事务处理,但您也可以明确指定事务或手动控制事务以满足特定需求。这种灵活性使得在开发应用程序时能够确保数据库操作的可靠性和一致性。 事务都了解了,我们看看django中的“锁”吧

Django本身并没有直接提供用于管理低级锁(如互斥锁或信号量)的功能。Django主要是一个Web应用程序框架,用于开发Web应用,而不是专注于底层并发控制。

然而,在开发Web应用程序时,你可能会遇到需要处理并发问题的情况,但这些问题通常涉及到数据库和Web请求的并发管理,而不是底层的锁。

一些在Django中处理并发问题的示例包括:

  1. 数据库事务: Django提供了数据库事务的支持,允许您使用transaction.atomic装饰器来管理数据库事务。这有助于确保数据库操作是原子的,以满足ACID属性。
  2. 数据库锁定: Django的数据库抽象层通常会处理数据库锁定,以确保多个请求不会同时尝试更新相同的数据库记录,从而避免数据损坏或冲突。
  3. 并发请求处理: Django的Web服务器(如Gunicorn、uWSGI等)通常会处理并发请求的分发,以确保每个请求都由不同的线程或进程处理。
  4. 缓存控制: 使用缓存(例如Django的缓存框架)来减轻数据库访问并提高性能,但需要小心处理缓存过期和并发读写问题。

尽管Django本身没有提供底层锁的管理,但它提供了一些高级工具和机制,用于处理并发问题。在大多数情况下,您可以通过使用事务、数据库锁定、缓存和其他高级技术来解决并发问题,而无需直接处理底层锁。

如果您遇到需要底层锁管理的情况,通常需要考虑使用Python的标准库中的threading模块或multiprocessing模块,这些模块提供了对锁的支持。然而,对于一般的Web应用程序开发,使用Django提供的高级工具通常足够了。

6.跨域和同源

可以从同源策略的基础、同源的定义、跨域的需求、跨域请求类型、CORS、jsonp、其他跨域技术、跨域安全问题、浏览器行为、跨域与前端开发、后端开发和安全、实际应用、调试和排错等方面来全面了解跨域和同源 在django中,反正刚入门,就当了解就好了。

7.Django-DRF

序列化---->视图集---->权限管理 其中序列化和视图集对数据的处理是最重要的一个内容 下面这张图就概括了

four.webp

学习路劲大概为:序列化、请求和响应、基于类的视图、认证和权限、视图集和路由器 相关的内容前面几篇文章都提到了,可以结合网上的资料一起查阅。 Django-DRF - 随笔分类 - 赵刚、 - 博客园 (cnblogs.com) 这几篇文章刚好对应相应的内容,大家可以仔细查看,我就不另解释了,另外实际开发中的编码习惯,还需接触真实开发从而形成编码习惯。