过完年后,就是春招了,是找工作的好时机,找工作或换工作的同学需要好好准备一下面试了,最近我精选了 10 个关于 Django 的面试题,如果要看更多面试题目,请在公众号后台回复「面试」获取。祝你新的一年,祝你找工作顺利、工作也顺利。
1. Django 这个名字的起源及它代表的含义?
2003 年的秋天,两位 Django 的主创人员在开始使用 Python 来满足新闻网站快速迭代开发的需求,在此过程中发现大量的代码可以复用从而减少工作量提高效率,于是就开发出一个可以填空的 Web 框架,于 2005 年开源,一度成为非常流行的框架。它的名字来源于比利时的吉普赛爵士吉他手 Django Reinhardt。Django 一词也是罗马语术语,含义是「我醒了」。Django 的主要目标是简化数据库驱动的网站的开发。Django 注重组件的重用性和“可插拔性”,敏捷开发和 DRY 法则(Don't Repeat Yourself)。
2. Django 的有哪些优点和缺点/Django的哪些特征是你喜欢的?
Django 是一个安全、快速、敏捷的 web 应用开发框架。
优点:
- 大规模、丰富、活跃的开源社区支撑。有大量的第三方应用可以集成,用于满足项目的需求。
- 成熟。Django 已经持续更新迭代十多年,增加了不少新功能并持续加固。
- 集成后台管理。只需要轻松配置即可自动生成强大的后台管理页面,便于管理 web 应用。
- 插件支持。允许工程师为应用增加不同的特性,留下足够多的空间来实现自定义功能。
- 丰富的类库。丰富的类库可以很轻松地为应用增加新功能。
- ORM。Django 的 ORM 让应用与数据的交互易如反掌。
- 模板语法及表单类。
- 国际化。
- 会话、用户、权限管理。
- 集成测试框架
每枚硬币都有两面,Django 也不例外。
缺点:
- 大包大揽: 对于一些轻量级应用不需要的功能模块 Django 也包括了,不如 Flask 轻量。
- 过度封装: 很多类和方法都封装了,直接使用比较简单,但改动起来就相对麻烦。
- 性能劣势: 与 C, C 性能上相比,Django 性能稍低,这是 Python 的锅,其他基于 Python 的框架也会有这个问题。
3. 什么是 MTV 架构?
它是一种设计模式,包含三个元素:模型(Model 即 M),模板(Template 即 T)和视图(Views 即 V)。该模型可以访问数据并负责处理数据库。模板是管理界面的另一层(表示形式)。至于 View,它负责业务逻辑。它还与模型和模板交互。
4. Django 中 OneToOneField 和 ForeignKey 的差异?
ForeignKey 和 OneToOneField 是 Django fields 最常用的两个类型,在数据库中,ForeignKey 代表一种多对一的关系,映射为 Model 类时需要提供 on_delete 参数,表示删除一条记录时如何处理依赖这该记录的 Models 类。而 OneToOneField 代表一对一的关系,映射为 Models 类时只需要提供依赖的类即可。
5. 什么是 slug,怎么使用它?
slug 的目的是为了 url 更易读(易于 SEO),使用方法也简单,比如 urls.py 中
代码语言:javascript复制path('articles/<slug:slug>/', views.article_detail),
那么访问 url articles/building-a-django-site
便会执行视图函数 views.article_detail(request, slug="building-a-django-site").
6. 什么是 mixin?
它是在需要时添加到类中的功能包。实际使用中通过类的继承将功能添加到所需要的类中。在 Django 中,这些软件包用于基于类的视图中。当开发人员不需要大量功能或仅希望使用某些功能时,他们可以使用 mixin 将功能所需的部分注入到类中。
7. 什么是 views,怎么编写 views?
Views 是视图函数,存放主要的业务逻辑代码,是 urls 与 models 交互的桥梁,即用户请求与数据库交互的中间层,是 MVT 架构的 V。
Django 中有两种方法来编写 views,一是基于函数的视图,另一种是基于类的视图。函数类的视图会更简单一些,但可能需要写更多的视图函数,但是基于类的视图会更加灵活和复用,但是稍微复杂些。
8. 说一说 Django 中模型的继承?
类同于 Python 的类继承,Django 也有完善的继承机制。Django 中所有的模型都必须继承 django.db.models.Model 模型,不管是直接继承也好,还是间接继承也罢。你唯一需要决定的是,父模型是否是一个独立自主的,同样在数据库中创建数据表的模型,还是一个只用来保存子模型共有内容,并不实际创建数据表的抽象模型。
Django有三种继承的方式:
抽象基类:被用来继承的模型被称为 Abstract base classes,将子类共同的数据抽离出来,供子类继承重用,它不会创建实际的数据表;多表继承:Multi-table inheritance,每一个模型都有自己的数据库表,父子之间独立存在;代理模型:如果你只想修改模型的 Python 层面的行为,并不想改动模型的字段,可以使用代理模型。
9. 解释一下 django 的 session 框架?
Django 的会话框架能够在网站请求时存储和检索任意数据。session 数据保存在服务器端,将发送和接收 cookies 的过程抽象化,session 通过配置中间件来实现。
Django 默认的配置是激活 session 的,确保 settings.py 文件的配置项:MIDDLEWARE 中包含 django.contrib.sessions.middleware.SessionMiddleware
,INSTALLED_APPS 中包含:django.contrib.sessions
session 的数据可以保存在
- 数据库
- 缓存
- 文件
- cookie
默认情况下,Django 将 session 数据保存在数据库中,如果要提升性能,可以将 session 保存在缓存中,设置好 CACHE 后,设置 SESSION_ENGINE 为 "django.contrib.sessions.backends.cache"。
10. django-admin.py makemessages 或 manage.py makemessages 做何用?
如果你的网站需要国际化,那么会用到这个命令,执行该命令后,Django 会在当前路径生成一个 message file,里面保存了该 web 项目需要被翻译的字符串。
为了使 Django 项目可以翻译,你需要在 Python 代码和模板中添加少量钩子。这些钩子被成为 translation strings 。它们告知 Django:如果在终端用户语言里,这个文本有对应的翻译,那么应该使用翻译。标记字符串是你的职责,系统只会翻译它知道的字符串。
然后 Django 提供工具将翻译字符串提取到 message file 中。这个文件让翻译者方便地提供翻译字符串。一旦翻译者填写了 message file ,就必须编译它。这个过程依赖 GNU gettext 工具集。
完成后,Django 会根据用户的语言偏好,使用每种可用语言对网页进行即时翻译。
Django 的国际化钩子默认是开启的,这意味着在框架的某些位置存在一些 i18n 相关的开销。如果你不使用国际化,你应该在配置文件里设置 USE_I18N = False 。然后 Django 将进行优化,以免加载国际化机制。
最后的话
以上 10 个问题是我认为比较有代表性的几个问题,如果需要更多的 Django 或 Python 相关面试题目,请在公众号后台回复「面试」获取。