Django 面试题

Python七号

共 3440字,需浏览 7分钟

 · 2021-02-10

过完年后,就是春招了,是找工作的好时机,找工作或换工作的同学需要好好准备一下面试了,最近我精选了 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 中

path('articles//', 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 相关面试题目,请在公众号后台回复「面试」获取。

如果觉得有所帮助,请点赞、关注、转发支持,感谢!

PS:留言板是我自己创建的,干净,无广告。欢迎留言讨论

浏览 13
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报