二十六、请介绍下 Django 框架的生命周期
Django 是一个高级的 Python Web 框架,它遵循 MVC 设计模式(在 Django 中通常称为 MTV,即模型(Model)、模板 (Template) 和视图(Views)),并且激励疾速开发和洁净、实用的设计。以下是一个简略的 Django 申请 / 响应生命周期:
- 用户发动申请:当用户通过 Web 浏览器拜访一个网站时,会向服务器发送一个 HTTP 申请。
- Django Web 服务器接管申请:申请首先被 Django 的 Web 服务器(如 Gunicorn,Uwsgi 或 Django 自带的开发服务器)接管,而后传递给 Django 框架进行解决。
- URL 解析:Django 框架接管到申请后,会依据 URLconf(URL 配置文件,通常是 urls.py 文件)找到与申请 URL 匹配的函数(称为视图)。
- 中间件解决:在 Django 中,还能够配置一些中间件(Middleware),这些中间件能够在申请被视图解决之前或之后进行一些解决,例如解决会话、验证用户等。
- 视图解决申请:找到匹配的视图函数后,Django 会创立一个 HttpRequest 对象,并将这个对象作为参数传递给视图函数。视图函数会解决这个申请,并返回一个 HttpResponse 对象。
- 模板渲染:如果视图决定渲染一个模板,它会加载模板,而后将一个上下文(蕴含要在模板上显示的数据)传递给模板。模板会依据这个上下文生成 HTML 内容。
-
响应返回给用户:最初,Django 将 HttpResponse 对象返回给 Web 服务器,Web 服务器将响应转换为一个 HTTP 响应,而后发送给用户的 Web 浏览器。
二十七、请介绍下 Django 是怎么操作数据库的
Django 通过它的 ORM(Object-Relational Mapping,对象 - 关系映射)零碎来操作数据库。ORM 容许开发者用 Python 代码来操作数据库,而不须要写 SQL 语句。这样,咱们就能够编写数据库独立的代码,而不必放心底层应用的是哪种数据库系统(MySQL,PostgreSQL,SQLite 等)。
以下是 Django 操作数据库的根本步骤: -
定义模型:在 Django 中,每个数据库表由一个 Python 类来示意,这个类继承自 django.db.models.Model。每个类的属性就示意数据库表的字段。
from django.db import models class Book(models.Model): title = models.CharField(max_length=200) publication_date = models.DateField()
-
迁徙:定义好模型之后,须要通过迁徙来在数据库中创立对应的表。Django 提供了 makemigrations 命令来创立迁徙,而后用 migrate 命令来利用迁徙。
python manage.py makemigrations python manage.py migrate
-
应用模型:当初,咱们能够应用定义的模型来进行数据库操作了。例如,创立一个新的记录:
from datetime import date book = Book(title='The Pragmatic Programmer', publication_date=date(1999, 10, 30)) book.save()
也能够查问现有的记录:
books = Book.objects.filter(title__contains='Django')
-
批改和删除记录:咱们也能够批改或删除数据库中的记录。例如:
# 批改记录 book = Book.objects.get(id=1) book.title = 'New Title' book.save() # 删除记录 book.delete()
二十八、如何应用 Django 中间件
在 Django 中,中间件是一个轻量级、底层的“插件”零碎,用来全局扭转 Django 的输出或输入。每次一个申请被解决,Django 首先会依据你的 MIDDLEWARE 设置来利用每个中间件类的办法。
以下是一个应用中间件的根本步骤: -
创立中间件:中间件是一个 Python 类,须要实现特定的办法。例如,上面是一个简略的中间件,它会在每个申请被解决前打印一条音讯:
class SimpleMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): print('在解决视图前') response = self.get_response(request) print('在解决视图后') return response
下面的代码中,__init__办法接管一个 get_response 参数,并将其存储为实例变量。get_response 是一个回调函数,用来获取视图的响应。
__call__办法是真正解决申请和响应的中央。在调用 get_response 之前的代码会在申请被解决前执行,调用 get_response 之后的代码会在申请被解决后(视图函数被调用后)执行。 -
激活中间件:要启用中间件,须要将其增加到 MIDDLEWARE 设置中。MIDDLEWARE 是一个 Python 列表,蕴含了所有激活的中间件的字符串门路。例如:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'myapp.middleware.SimpleMiddleware', # 你的自定义中间件 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
留神,中间件的程序很重要。在申请阶段,Django 会从上到下利用每个中间件,但在响应阶段,则会从下到上利用中间件。这意味着在申请列表中,越是在下面的中间件,它的响应解决代码会越后执行。
二十九、Django 开发中如何优化数据库
-
优化查问:应用 ORM 时,要留神防止生成不必要的查问。例如,如果你须要拜访一个外键关联的对象的某个属性,最好应用 select_related 或 prefetch_related 办法,这样能够在一次查问中获取所有必要的信息,防止“N+ 1 查问”问题。
# 优化前 books = Book.objects.all() for book in books: print(book.author.name) # 优化后 books = Book.objects.select_related('author').all() for book in books: print(book.author.name)
-
只获取必要的字段:如果你只须要模型的某几个字段,能够应用 values 或 values_list 办法,只获取这些字段的数据,这样能够缩小数据库的 I / O 累赘。
titles = Book.objects.values_list('title', flat=True)
-
应用索引:在常常须要查问的字段上创立索引,能够大大提高查问效率。在 Django 的模型字段中,能够设置 db_index=True 来创立索引。
class Book(models.Model): title = models.CharField(max_length=200, db_index=True) publication_date = models.DateField()
- 分页:如果你须要显示大量的数据,最好应用分页来缩小每次查问的数据量。Django 提供了 Paginator 类来帮忙实现分页。
-
缓存:对于那些不常常变动然而读取频繁的数据,能够应用缓存来进步性能。Django 提供了十分欠缺的缓存零碎,能够缓存视图的后果,也能够手动缓存数据。
三十、什么是 Django 中间件
Django 中间件是一个轻量级、底层的“插件”零碎,用来全局扭转 Django 的输出或输入。在申请被解决的过程中,中间件是第一个解决 HTTP 申请或视图返回的 HTTP 响应的组件。它能够看作是解决申请和响应的钩子。
中间件的次要性能包含:
- 解决全局申请:例如,能够在一个中间件中查看是否有 session 的存在,如果没有就创立一个。
- 解决全局响应:例如,能够在一个中间件中对立增加某个 HTTP 头部。
- 在视图解决之前或之后扭转申请或响应。
- 将某些工作钩子到申请 / 响应的处理过程中,例如数据缓存、数据压缩等。
一个中间件基本上就是一个 Python 类,它定义了以下一个或多个办法:
- __init__(self, get_response):在中间件实例化时调用一次,其中 get_response 是一个用于获取视图响应的回调函数。
- __call__(self, request):解决每个申请时都会调用,你能够在这里扭转申请或响应。
中间件的执行程序在 Django 设置中的 MIDDLEWARE 列表中定义,这个列表的程序十分重要。在解决申请时,Django 会依照 MIDDLEWARE 列表从上到下的程序利用每个中间件,而后在解决响应时,Django 会依照从下到上的程序利用每个中间件。