二十六、请介绍下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 modelsclass Book(models.Model): title = models.CharField(max_length=200) publication_date = models.DateField()
迁徙:定义好模型之后,须要通过迁徙来在数据库中创立对应的表。Django提供了makemigrations命令来创立迁徙,而后用migrate命令来利用迁徙。
python manage.py makemigrationspython manage.py migrate
应用模型:当初,咱们能够应用定义的模型来进行数据库操作了。例如,创立一个新的记录:
from datetime import datebook = 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会依照从下到上的程序利用每个中间件。