Django(以 Django Reinhardt 命名)是一个基于 Python 的高级免费开源 Web 框架,遵循模型-视图-模板(MVT)架构模式。截至目前,该框架由 Django 软件基金会 (DSF) 维护,该基金会是一家位于美国的独立组织,并作为 501(c)(3) 非福利机构成立。
它于 2003 年秋季由 Lawrence Journal-World 报纸的 Web 程序员 Adrian Holovaty 和 Simon Willson 创建。开始使用 python 构建应用程序。两年后,即 2005 年 7 月,它在 BSD 许可下向公众发布。后来,在 2008 年 6 月,刚刚起步的 Django 软件基金会(DSF)接管了 Django 的开发。
使用Django的公司
- PBS
- Mozilla
- The Washington Times
- Disqus, Bitbucket
- NextDoor
使用 Django 的优点:
- 丰富的生态系统:它带有众多第三方应用程序,可以根据项目的要求轻松集成。
- 成熟度:Django 已经使用了十多年。在时间范围内,添加和增强了许多功能,使其成为一个健壮的框架。除此之外,还有大量的开发人员在使用 Django。
- 管理面板:Django 提供了一个管理仪表板,我们可以使用它对模型进行基本的 CRUD 操作。
- 插件:允许程序员为应用程序添加各种功能,并留有足够的自定义空间。
- 库:由于庞大的开发社区,每个任务都有大量的库。
- ORM:它帮助我们以更加面向对象的方式处理数据。
基本的Django面试题和答案合集
1. 解释 Django 架构?
Django面试题解析:Django 遵循基于模型视图控制器架构的 MVT(模型视图模板)模式。它与 MVC 模式略有不同,因为它维护自己的约定,因此,控制器由框架本身处理。模板是一个表示层。它是一个混合了 Django 模板语言 (DTL) 的 HTML 文件。开发人员提供模型、视图和模板,然后将其映射到 URL,最后,Django 将其提供给用户。
2.Django常见面试题有哪些:解释django项目目录结构?
- manage.py - 一个命令行实用程序,允许你与 Django 项目进行交互
- __init__.py - 一个空文件,告诉 Python 当前目录应该被视为一个 Python 包
- settings.py - 包含当前项目的配置,如 DB 连接。
- urls.py - 项目的所有 URL 都在这里
- wsgi.py - 这是你的应用程序的入口点,Web 服务器使用它来为你创建的项目提供服务。
3. Django 中的模型是什么?
Django 中的模型是指映射到数据库表或数据库集合的类。Django 模型类的每个属性代表一个数据库字段。它们在 app/models.py 中定义
例子:
from django.db import models
class SampleModel(models.Model):
field1 = models.CharField(max_length = 50)
field2 = models.IntegerField()
class Meta:
db_table = “sample_model”
每个模型都继承自 django.db.models.Model
我们的示例有 2 个属性(1 个字符和 1 个整数字段),它们将在表字段中。
元类可以帮助你设置诸如可用权限、名称的单复数版本、关联的数据库表名称、模型是否抽象等内容。
要获取有关模型的更多信息,你可以参考:https://docs. djangoproject.com/en/3.1/topics/db/models/。
4.什么是Django中的模板或Django模板语言?
模板是 Django MVT 架构的一个组成部分。它们通常包括 HTML、CSS 和 js,其中在视图的帮助下嵌入了动态变量和信息。一些结构被模板引擎识别和解释。主要是变量和标签。
模板与上下文一起呈现。渲染只是用它们的值替换变量,出现在上下文中,并处理标签。其他一切都保持原样。
Django 模板语言的语法包括以下四种结构:
- 变量
- 标签
- 过滤器
- 注释
要阅读有关模板的更多信息,你可以参考:https://docs.djangoproject.com/en/3.1/topics/templates/
5. Django 中的视图是什么?
视图函数,或简称“视图”,只是一个接受网络请求并返回网络响应的 Python 函数。此响应可以是网页的 HTML 内容、重定向、404 错误、XML 文档或图像等。
例子:
from django.http import HttpResponse
def sample_function(request):
return HttpResponse(“Welcome to Django”)
有两种类型的视图:
- 基于函数的视图:在这里,我们将视图作为函数导入。
- 基于类的视图:这是一种面向对象的方法。
6. 什么是 Django ORM?
这个 ORM(Object Relational Mapper 的首字母缩写词)使我们能够以更 Python 化的方式与数据库交互,就像我们可以避免编写原始查询一样,可以在数据库上检索、保存、删除和执行其他操作,而无需编写任何 SQL询问。它充当模型和数据库之间的抽象层。
7.定义静态文件并说明其用途?
网站通常需要提供附加文件,例如图像。Javascript 或 CSS。在 Django 中,这些文件被称为“静态文件”,除此之外,Django 还提供django.contrib.staticfiles
管理这些静态文件的功能。
8. 什么是 Django Rest 框架(DRF)?
Django Rest Framework 是一个基于 Django 的开源框架,可让你快速创建 RESTful API。
9. Django面试题和答案合集:django-admin 和 manage.py 是什么并解释其命令?
django-admin 是 Django 用于管理任务的命令行实用程序。除此之外,还会在每个 Django 项目中自动创建一个 manage.py 文件。它不仅执行与 django-admin 相同的目的,而且还将DJANGO_SETTINGS_MODULE
环境变量设置为指向项目的 settings.py 文件。
- django-admin help - 用于显示使用信息和每个应用程序提供的命令列表。
- django-admin 版本- 用于检查你的 Django 版本。
- django-admin check - 用于检查整个 Django 项目的常见问题。
- django-admin compilemessages - 将makemessages创建的 .po 文件编译为 .mo 文件,以便在内置 gettext 支持的帮助下使用。
- django-admin createcachetable - 创建用于数据库缓存后端的缓存表。
- django-admin dbshell - 使用连接参数(USER、PASSWORD、DB_NAME、USER 等)指定的设置文件为 ENGINE 设置中指定的数据库引擎运行命令行客户端。
- django-admin diffsettings - 显示现有设置文件和 Django 的默认设置之间的差异。
- django-admin dumpdata - 用于从数据库中转储数据。
- django-admin flush - 从数据库中刷新所有值,并重新执行代码中指定的任何同步后处理程序。
- django-admin inspectdb - 它从现有的数据库表中生成 django 模型。
- django-admin loaddata - 将数据从夹具文件加载到数据库中。
- django-admin makemessages - 用于翻译目的,它也生成一个消息文件。
- django-admin makemigrations - 根据检测到的模型更改生成新的迁移。
- django-admin migrate - 执行 SQL 命令,之后数据库状态与当前模型集和迁移同步。
- django-admin runserver - 在本地机器上启动一个轻量级的 Web 服务器以进行开发。默认服务器在 IP 地址 127.0.0.1 上的端口 8000 上运行。如果需要,你可以明确传递自定义 IP 地址和端口号。
- django-admin sendtestemail - 这用于通过向指定的收件人发送测试电子邮件来确认通过 Django 发送的电子邮件是否正常工作。
- django-admin shell - 启动 Python 交互式解释器。
- django-admin showmigrations - 显示项目中存在的所有迁移。
- django-admin sqlflush - 打印将为上述刷新命令执行的 SQL 语句。
- django-admin sqlmigrate - 打印指定迁移的 SQL 语句。
- django-admin sqlsequencereset - 输出用于重置给定应用程序名称序列的 SQL 查询。
- django-admin squashmigrations - 压缩特定 app_label 的一系列迁移。
- django-admin startapp - 在当前目录或给定目的地为给定的应用程序名称创建一个新的 Django 应用程序。
- django-admin startproject - 在当前目录或给定目的地为给定的项目名称创建一个新的 Django 项目目录结构。
- django-admin test - 为所有已安装的应用程序运行测试。
- django-admin testserver - 使用来自给定装置的数据运行 Django 开发服务器(也通过 runserver 命令执行)。
- django-admin changepassword - 提供了一种更改用户密码的方法。
- django-admin createsuperuser - 创建一个具有所有权限的用户帐户(也称为超级用户帐户)。
- django-admin remove_stale_contenttypes - 删除数据库中过时的内容类型(从已删除的模型中)。
- django-admin clearsessions - 可用于清除过期的会话或作为 cron 作业。
10. Jinja 模板是什么?
Jinja Templating 是一个非常流行的 Python 模板引擎,最新版本是 Jinja2。
它的一些特点是:
- 沙箱执行 - 这是一个沙箱(或受保护的)框架,用于自动化测试过程
- HTML 转义 - 它提供自动 HTML 转义,因为 <、> 和字符在模板中具有特殊值,如果使用常规文本,这些符号会导致 Jinja 自动处理的 XSS 攻击。
- 模板继承
- 比默认引擎更快地生成 HTML 模板
- 与默认引擎相比更易于调试。
11. 什么是 Django URL?
Django面试题解析:URL 是 Web 应用程序中最重要的部分之一,Django 为你提供了一种优雅的方式来设计你自己的自定义 URL,借助其称为 URLconf(URL 配置)的模块。这个python模块的基本功能是
你可以在Django中按照你喜欢的方式设计你自己的URL,然后将它们映射到python函数(查看函数)。这些 URL 可以是静态的,也可以是动态的。这些 URL 存在于 urls.py 中,它们与等效的视图函数匹配。
基本语法:
from django.urls import path
from . import views
urlpatterns = [
path('data/2020/', views.data_2020),
path('data/<int:year>/', views.data_year)
]
12. Django常见面试题有哪些:Django 中的项目和应用有什么区别?
简而言之,Project 是整个 Django 应用程序,应用程序是项目中处理一个特定用例的模块。
例如,电子商务应用程序(项目)中的支付系统(应用程序)。
13. Django 中有哪些不同的模型继承风格?
- 抽象基类继承:当你只需要父类保存不想为每个子模型编写的信息时使用。
- 多表模型继承: 当你对现有模型进行子类化并且需要每个模型在数据库中有自己的表时使用。
- 代理模型继承: 当你希望在更改模型的 Python 级别功能的同时保留模型的字段时使用。
中级Django面试题和答案合集
14. 什么是 Django 信号?
每当模型发生修改时,我们可能需要触发一些操作。
Django 以信号的形式提供了一种优雅的方式来处理这些。信号是允许我们将事件与动作相关联的实用程序。我们可以通过开发一个在信号调用时运行的函数来实现这些。
模型中的内置信号列表:
信号 | 描述 |
---|---|
django.db.models.pre_init & django.db.models.post_init | 在调用模型的 _init_() 方法之前或之后发送 |
django.db.models.signals.pre_save & django.db.models.signals.post_save | 在调用模型的 save() 方法之前或之后发送 |
django.db.models.signals.pre_delete & django.db.models.signals.post_delete | 在调用模型的 delete() 方法或 queryset delete() 方法之前或之后发送 |
django.db.models.signals.m2m_changed | 当 ManyToManyField 改变时发送 |
django.core.signals.request_started & django.core.signals.request_finished | 在 HTTP 请求开始或完成时发送 |
15. 解释一下Django中的缓存策略?
缓存是指在初始处理时存储输出结果的技术,以便下次再次获取相同的结果时,可以使用那些已经存储的结果,而不是再次处理,从而导致更快的访问以及更少的资源利用率. Django 为我们提供了一个强大的缓存系统,能够存储动态网页,这样这些页面就不需要为每个请求再次评估。
下面列出了 Django 中的一些缓存策略:
策略 | 描述 |
---|---|
内存缓存 | 基于内存的缓存服务器是最快和最有效的 |
文件系统缓存 | 缓存的值以序列化顺序存储为单独的文件 |
本地内存缓存 | 如果你没有设置任何内容,这将被 Django 用作默认缓存策略。它是每个进程的,也是线程安全的。 |
数据库缓存 | 如果你有一个快速且索引良好的数据库服务器,缓存数据将存储在数据库中并且运行良好。 |
16. 解释Django中的用户认证?
Django 带有一个内置的用户身份验证系统,它处理用户、组、用户权限和少数基于 cookie 的用户会话等对象。Django 用户身份验证不仅对用户进行身份验证,还对其进行授权。
系统由以下对象组成并对其进行操作:
- 用户
- 权限
- 团体
- 密码散列系统
- 表单验证
- 可插拔的后端系统
17.如何配置静态文件?
确保django.contrib.staticfiles
添加到你的INSTALLED_APPS
在你的设置文件中。定义 STATIC_URL 例如。
STATIC_URL = '/static/'
在你的 Django 模板中,使用静态模板标记通过配置的 STATICFILES_STORAGE 为给定的相对路径创建 URL。
{% load static %}
<img src="{%%20static%20'my_sample/abcxy.jpg'%20%}" alt="ABC image">
将你的静态文件存储static
在你的应用程序中调用的文件夹中。例如my_sample/static/my_sample/abcxy.jpg
18. 解释 Django Response 生命周期?
每当对网页发出请求时,Django 都会创建一个 HttpRequest 对象,其中包含有关请求的元数据。之后 Django 加载特定视图,将 HttpRequest 作为第一个参数传递给视图函数。每个视图都将返回一个 HttpResponse 对象。
当 Django 收到请求时,大体上会发生以下步骤:
- 首先加载 Django settings.py 文件,其中还包含各种中间件类 (
MIDDLEWARES
) - 中间件也按照它们在
MIDDLEWAREST
- 从这里开始,请求现在被移动到 URL 路由器,它只是从请求中获取 URL 路径并尝试与我们在 urls.py 中给定的 URL 路径进行映射。
- 一旦映射,它就会调用等效的视图函数,从那里生成等效的响应
- 响应还通过响应中间件并发送回客户端/浏览器。
19. Django 支持哪些数据库?
PostgreSQL 和 MySQL、SQLite 和 Oracle。除此之外,Django 还支持使用第三方软件包的数据库,例如 ODBC、Microsoft SQL Server、IBM DB2、SAP SQL Anywhere 和 Firebird。注意:官方 Django 不支持任何非 SQL 数据库。
20.会话框架有什么用?
使用会话框架,你可以轻松地存储和检索基于前站点访问者的任意数据。它在服务器端存储数据并负责发送和接收 cookie 的过程。这些 cookie 仅包含会话 ID,而不是实际数据本身,除非你明确使用基于 cookie 的后端。
21.中间件在Django中有什么用?
中间件是在请求和响应之间执行的东西。简单来说,你可以说它充当了请求和响应之间的桥梁。类似地,在 Django 中,当发出请求时,它会通过中间件移动到视图,并且数据通过中间件作为响应传递。
22. Django 中的上下文是什么?
Context 是一个字典映射模板变量名,给 Django 中的 Python 对象。这是通用名称,但你可以根据需要指定任何其他名称。
23.什么是django.shortcuts.render函数?
当视图函数返回网页作为 HttpResponse 而不是简单的字符串时,我们使用 render()。Render 函数是一个快捷函数,可以让开发者轻松地通过模板传递数据字典。这个函数然后通过模板引擎将模板与数据字典结合起来。最后,这个 render() 返回为带有渲染文本的 HttpResponse,这是模型返回的数据。因此,Django render() 绕过了开发人员的大部分工作,让他使用不同的模板引擎。
基本语法:render(request, template_name, context=None, content_type=None, status=None, using=None)
请求是生成响应的参数。模板名称是使用的 HTML 模板,而上下文是从 python 传递到页面上的数据的字典。你还可以指定内容类型、你传递的数据的状态以及你返回的渲染。
24.settings.py文件有什么意义?
Django面试题解析:顾名思义,这个文件存储了我们 Django 项目的配置或设置,如数据库配置、后端引擎、中间件、安装的应用程序、主 URL 配置、静态文件地址、模板引擎、主 URL 配置、安全密钥、允许的主机和多得多。
25. 如何查看模型中的所有项目?
ModelName.objects.all()
26. 如何过滤模型中的项目?
ModelName.objects.filter(field_name=”term”)
高级Django面试题和答案合集
27. 如何使用基于文件的会话?
要使用相同的,你需要将设置SESSION_ENGINE
设置为"django.contrib.sessions.backends.file"
28.什么是mixin?
Mixin 是一种多重继承,你可以在其中组合多个父类的行为和属性。它为我们提供了一种很好的方法来重用来自多个类的代码。使用这些 mixin 的一个缺点是很难分析一个类在做什么以及在它的代码在多个类之间过于分散的情况下要覆盖哪些方法。
29. 什么是 Django 字段类?
“字段”是指代表数据库表中一列的抽象类。
Field 类只是 RegisterLookupMixin 的子类。在 Django 中,这些字段用于创建数据库表 (db_types()),这些表用于使用 get_prep_value() 将 Python 类型映射到数据库,反之亦然使用 from_db_value() 方法。因此,字段是不同 Django API 中的基本部分,例如模型和查询集。
30. Django常见面试题有哪些:为什么永久重定向不是一个好的选择?
仅当你不想将访问者引导至旧 URL 时才使用永久重定向。永久重定向的响应由浏览器缓存,因此当你尝试重定向到其他内容时,它会导致问题。由于这是浏览器端操作,如果你的用户想要移动到新页面,它将加载相同的页面。
31. Django OneToOneField 和 ForeignKey 字段的区别?
它们都是 Django 中最常见的字段类型。这两者之间的唯一区别是 ForeignKey 字段由 on_delete 选项以及模型的类组成,因为它用于多对一关系,而另一方面,OneToOneField 仅执行一对一关系并且需要只有模型的类。
32. 如何在一个视图中组合多个 QuerySet?
最初,将 QuerySets 连接到列表中被认为是最简单的方法。这是一个如何做到这一点的例子:
from itertools import chainresult_list = list(chain(model1_list, model2_list, model3_list))
33.如何获得模型中的特定项目?
ModelName.objects.get(id=”term”)
注意:如果没有与查询匹配的结果,get() 将引发一个DoesNotExist异常。如果不止一项与给定的 get() 查询匹配。在这种情况下,它将引发MultipleObjectsReturned,这也是模型类本身的一个属性。
34.如何从查询集中获取SQL查询?
print(queryset.query)
35.自定义Django管理界面的功能有哪些方式?
有多种方法可以自定义 Django 管理界面的功能。你可以搭载在 Django 自动生成的添加/更改表单之上,你可以使用 js 参数添加 JavaScript 模块。此参数基本上是一个 URL 列表,这些 URL 指向要包含在你的项目中的 <script> 标记内的 JavaScript 模块。如果需要,你还可以为管理员编写视图。
36. select_related 和 prefetch_related 的区别?
虽然这两个函数都用于获取模型上的相关字段,但它们的功能彼此略有不同。简单来说,select_related 使用外键关系,即在查询本身上使用连接,而在 prefetch_related 上有一个单独的查找和 python 端的连接。让我们试着通过一个例子来说明这一点:
from django.db import models
class Country(models.Model):
country_name = models.CharField(max_length=5)
class State(models.Model):
state_name = models.CharField(max_length=5)
country = model.ForeignKey(Country)
>> states = State.objects.select_related(‘country’).all()
>> for state in states:
… print(state.state_name)
```Query Executed
SELECT state_id, state_name, country_name FROM State INNER JOIN Country ON (State.country_id = Country.id)
```
>> country = Country.objects.prefetch_related(‘state’).get(id=1)
>> for state in country.state.all():
… print(state.state_name)
```Query Executed
SELECT id, country_name FROM country WHERE id=1;
SELECT state_id, state_name WHERE State WHERE country_id IN (1);
```
37.解释Django ORM中的Q对象?
Django面试题解析:Q 对象用于编写复杂的查询,如在 filter() 函数中只是对条件进行“与”运算,而如果你想对条件进行“或”运算,则可以使用 Q 对象。让我们看一个例子:
from django.db import models
from django.db.models import Q
>> objects = Models.objects.get(
Q(tag__startswith='Human'),
Q(category=’Eyes’) | Q(category=’Nose’)
)
```Query Executed
SELECT * FROM Model WHERE tag LIKE ‘Human%’ AND (category=’Eyes’ OR category=’Nose’)
```
38. Django常见面试题有哪些:什么是 Django 异常?
除了标准的 Python 异常之外,Django 还提出了自己的异常。 Django 的异常列表 (https://docs.djangoproject.com/en/3.1/ref/exceptions/)