附答案 | 最强Python面试题之Python开发第四弹

写在之前

大家好呀,我是帅蛋。

好久没更新帅蛋的【最强Python面试题】系列,好多小伙伴都在催更,这不赶紧上来更一下。

今天加餐,更新 13 道,依然是 Python 后台开发面试题之Django 专题,大家一定要记得点赞收藏呀!!!

欢迎和帅蛋聊一聊~扣扣2群:609771600,获取最新秋招信息 & 内推进度,日常聊聊迷茫吹吹牛皮,抱团取暖

顺便提一句,我所有和面试相关的内容都会放在#帅蛋的面试空间# 中,大家可以关注下这个话题~

我会尽我最大的努力帮助到大家哒!!!

主要内容

这些面试题是我结合自己的经验整理的,主要就是下面这 5 个专题:

  • Python 基础面试题
  • Python 进阶
  • Python 后台开发
  • 爬虫
  • 机器学习

已完成

Python 基础题

Python 进阶题

更新中

Python 后台开发

对每道面试题我都会附带详细的答案,有些我觉得重要的内容会详细讲解,虽然是面试八股文,我还是希望大家不是只“知其然”,更得“知其所以然”

关于更新频率,每天我会更新 10 道题左右,总共会有差不多 200 道。

无论是准备面试还是自己学习,这份面试题绝对值得你去看,去学习。

大家可以关注我,再关注我,使劲关注我,不要错过每天的更新~

以下是正文

Python 后台开发面试题第四弹,大家一定要记得点赞收藏,一起加油!

1、ngnix 的正向代理与反向代理?

web 开发中,部署方式大致类似。简单来说,使用 Nginx 主要是为了实现分流、转发、负载均衡,以及分担服务器的压力。Nginx 部署简单,内存消耗少,成本低。Nginx 既可以做正向代理,也可以做反向代理。

正向代理:请求经过代理服务器从局域网发出,然后到达互联网上的服务器。

特点:服务端并不知道真正的客户端是谁。

反向代理:请求从互联网发出,先进入代理服务器,再转发给局域网内的服务器。

特点:客户端并不知道真正的服务端是谁。

区别:正向代理的对象是客户端。反向代理的对象是服务端。

2、简述 Django 下的(内建的)缓存机制?

一个***站的基本权衡点就是,它是动态的。每次用户请求页面,服务器会重新计算。从开销处理的角度来看,这比你读取一个现成的标准文件的代价要昂贵的多。

这就是需要缓存的地方。

Django 自带了一个健壮的缓存系统来保存动态页面这样避免对于每次请求都重新计算。方便起见,Django 提供了不同级别的缓存粒度:可以缓存特定视图的输出、可以仅仅缓存那些很难生产出来的部分、或者可以缓存整个网站 Django 也能很好的配合那些“下游”缓存, 比如 Squid 和基于浏览器的缓存。这里有一些缓存不必要直接去控制但是可以提供线索, (via HTTPheaders)关于网站哪些部分需要缓存和如何缓存。

设置缓存:

缓存系统需要一些设置才能使用。 也就是说,你必须告诉他你要把数据缓存在哪里- 是数据库中,文件系统或者直接在内存中。这个决定很重要,因为它会影响你的缓存性能,是的,一些缓存类型要比其他的缓存类型更快速。

你的缓存配置是通过 setting 文件的 CACHES 配置来实现的。这里有 CACHES 所有可配置的变量值。

3、Django HTTP 请求的处理流程?

Django 和其他 Web 框架的 HTTP 处理的流程大致相同,Django 处理一个 Request 的过程是首先通过中间件,然后再通过默认的 URL 方式进行的。我们可以在 Middleware 这个地方把所有 Request 拦截住,用我们自己的方式完成处理以后直接返回 Response。

(1) 加载配置

Django 的配置都在 “Project/settings.py” 中定义,可以是 Django 的配置,也可以是自定义的配置,并且都通过 django.conf.settings 访问,非常方便。

(2) 启动

最核心动作的是通过 django.core.management.commands.runfcgi 的 Command 来启动,它运行 django.core.servers.fastcgi 中的 runfastcgi,runfastcgi 使用了 flup 的 WSGIServer 来启动 fastcgi 。而 WSGIServer 中携带了 django.core.handlers.wsgi 的 WSGIHandler 类的一个实例,通过 WSGIHandler 来处理由 Web 服务器(比如 Apache,Lighttpd 等)传过来的请求,此时才是真正进入 Django 的世界。

(3) 处理 Request

当有 HTTP 请求来时,WSGIHandler 就开始工作了,它从 BaseHandler 继承而来。WSGIHandler 为每个请求创建一个 WSGIRequest 实例,而 WSGIRequest 是从 http.HttpRequest 继承而来。接下来就开始创建 Response 了。

(4) 创建 Response

BaseHandler 的 get_response 方法就是根据 request 创建 response,而具体生成 response 的动作就是执行 urls.py 中对应的 view 函数了,这也是 Django 可以处理“友好 URL ”的关键步骤,每个这样的函数都要返回一个 Response 实例。此时一般的做法是通过 loader 加载 template 并生成页面内容,其中重要的就是通过 ORM 技术从数据库中取出数据,并渲染到 Template 中,从而生成具体的页面了。

(5) 处理 Response

Django 返回 Response 给 flup,flup 就取出 Response 的内容返回给 Web 服务器,由后者返回给浏览器。

总之,Django 在 fastcgi 中主要做了两件事:处理 Request 和创建 Response,而它们对应的核心就是“ urls 分析”、“模板技术”和“ ORM 技术”。

4、Django 里 QuerySet 的 get 和 filter 方法的区别?

(1) 输入参数

get 的参数只能是 model 中定义的那些字段,只支持严格匹配。filter 的参数可以是字段,也可以是扩展的 where 查询关键字,如 in,like 等。

(2) 返回值

get 返回值是一个定义的 model 对象。filter 返回值是一个新的 QuerySet 对象,然后可以对 QuerySet 在进行查询返回新的 QuerySet 对象,支持链式操作,QuerySet 一个集合对象,可使用迭代或者遍历,切片等,但是不等于 list 类型(使用一定要注意)。

(3) 异常

get 只有一条记录返回的时候才正常,也就说明 get 的查询字段必须是主键或者唯一约束的字段。当返回多条记录或者是没有找到记录的时候都会抛出异常 filter 有没有匹配的记录都可以

5、跨域请求问题 django 怎么解决的?

  • 启用中间件

  • post 请求

  • 验证码

  • 表单中添加 csrf_token 标签

6、Django 对数据查询结果排序怎么做,降序怎么做,查询大于某个字段怎么做?

  • 排序使用 order_by()

  • 降序需要在排序字段名前加-

  • 查询字段大于某个值:使用 filter(字段名_gt=值)

7、Django 重定向你是如何实现的?用的什么状态码?

  • 使用 HttpResponseRedirect

  • redirect 和 reverse

  • 状态码:302,301

8、生成迁移文件和执行迁移文件的命令是什么?

python manage.py makemigrations

python manage.py migrate

9、关系型数据库的关系包括哪些类型?

  • ForeignKey:一对多,将字段定义在多的一端中。

  • ManyToManyField:多对对:将字段定义在两端中。

  • OneToOneField:一对一,将字段定义在任意一端中。

0、查询集返回列表的过滤器有哪些?

  • all() :返回所有的数据

  • filter():返回满足条件的数据

  • exclude():返回满足条件之外的数据,相当于 sql 语句中 where 部分的 not 关键字

  • order_by():排序

31、Django 本身提供了 runserver,为什么不能用来部署?

runserver 方法是调试 Django 时经常用到的运行方式,它使用 Django 自带的 WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程 。

uWSGI 是一个 Web 服务器,它实现了 WSGI 协议、uwsgi、http 等协议。注意 uwsgi 是一种通信协议,而 uWSGI 是实现 uwsgi 协议和 WSGI 协议的 Web 服务器。uWSGI 具有超快的性能、低内存占用和多 app 管理等优点,并且搭配着 Nginx 就是一个生产环境了,能够将用户访问请求与应用 app 隔离开,实现真正的部署。相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。

32、HttpRequest 和 HttpResponse 是什么?干嘛用的?

HttpRequest 是 django 接受用户发送多来的请求报文后,将报文封装到 HttpRequest 对象中去。

HttpResponse 返回的是一个应答的数据报文。render 内部已经封装好了 HttpResponse 类。

视图的第一个参数必须是 HttpRequest 对象,两点原因:表面上说,他是处理 web 请求的,所以必须是请求对象,根本上说,他是基于请求的一种 web 框架,所以,必须是请求对象。

因为 view 处理的是一个 request 对象,请求的所有属性我们都可以根据对象属性的查看方法来获取具体的信息:格式:request.属性

request.path 请求页面的路径,不包含域名
request.get_full_path 获取带参数的路径
request.method 页面的请求方式
request.GET GET 请求方式的数据
request.POST POST 请求方式的数据
request.COOKIES 获取 cookie
request.session 获取 session
request.FILES 上传图片(请求页面有 enctype="multipart/form-data"属性时 FILES 才有数据。?a=10 的键和值时怎么产生的,键是开发人员在编写代码时确定下来的,值时根据数据生成或者用户填写的,总之是不确定的。

403 错误:表示资源不可用,服务器理解客户的请求,但是拒绝处理它,通常由于服务器上文件和目录的权限设置导致的 web 访问错误。如何解决:

(1) 把中间件注释。

(2) 在表单内部添加{% scrf_token %}

request.GET.get()取值时如果一键多值情况,get 是覆盖的方式获取的。getlist()可以获取多值。

在一个有键无值的情况下,该键名 c 的值返回空。有键无值:c: getlist 返回的是列表,空列表在无键无值也没有默认值的情况下,返回的是 None 无键无值:e:None

HttpResponse 常见属性:
content: 表示返回的内容
charset: 表示 response 采用的编码字符集,默认是 utf-8
status_code:返回的 HTTP 响应状态码 3XX 是对请求继续进一步处理,常见的是重定向。

常见方法:

init:创建 httpResponse 对象完成返回内容的初始化
set_cookie:设置 Cookie 信息:格式:set_cookies('key','value',max_age=None,expires=None)
max_age 是一个整数,表示指定秒数后过期,expires 指定过期时间,默认两个星期后过期。
write 向响应体中写数据

应答对象:

方式一:render(request,"index.html") 返回一个模板

render(request,"index.html", context) 返回一个携带动态数据的页面

方式二:render_to_response("index.html") 返回一个模板页面

方式三:redirect("/") 重定向

方式四:HttpResponseRdeirect("/") 实现页面跳转功能

方式五:HttpResponse("itcast1.0")在返回到额页面中添加字符串内容

方式六:HttpResponseJson() 返回的页面中添加字符串内容。

JsonResponse 创建对象时候接收字典作为参数,返回的对象是一个 json 对象。

能接收 Json 格式数据的场景,都需要使用 view 的 JsonResponse 对象返回一个 json 格式数据

ajax 的使用场景,页面局部刷新功能。ajax 接收 Json 格式的数据。

在返回的应答报文中,可以看到 JsonResponse 应答的 content-Type 内容是 application/json

ajax 实现网页局部刷新功能:ajax 的 get()方法获取请求数据 ajax 的 each()方法遍历输出这些数据

33、Django 日志管理

配置好之后:

import logging
logger=logging.getLogger(__name__) # 为 loggers 中定义的名称
logger.info("some info ...)

可用函数有:logger.debug() logger.info() logger.warning() logger.error()

Django 文件管理:对于 jdango 老说,项目中的 css,js,图片都属于静态文件,我们一般会将静态文件放到一个单独的目录中,以方便管理,在 html 页面调用时,也需要指定静态文件的路径。静态文件可以放在项目根目录下,也可以放在应用的目录下,由于这些静态文件在项目中是通用的,所以推荐放在项目的根目录下。

在生产中,只要和静态文件相关的,所有访问,基本上没有 django 什么事,一般都是由 nignx 软件代劳了,为什么?因为 nginx 就是干这个的。


以上就是今天的内容,我是帅蛋,我们明天见~

❤️ 欢迎关注我,有问题,找帅蛋,我最看不得别人迷茫!

❤️ 如果你觉得有帮助,希望爱学习的你不要吝啬三连击哟[点赞 + 收藏 + 评论]~

还有小小公众号 【编程文青李狗蛋】,聊聊迷茫吹吹牛皮~

#帅蛋的面试空间##面试八股文##23届秋招##Python#
全部评论
Python八股文来啦!!顶起来!!!
1 回复 分享
发布于 2022-08-22 15:49 山东
冲冲冲,这么好的文章不上热榜可惜了
1 回复 分享
发布于 2022-08-22 16:46 安徽
牛皮
点赞 回复 分享
发布于 2022-08-23 09:15 上海
哇,楼主更新了
点赞 回复 分享
发布于 2022-08-24 19:50 广东
必须收藏
点赞 回复 分享
发布于 2022-08-24 19:55 广东
感觉就像在升级打怪,一级一级进阶
点赞 回复 分享
发布于 2022-08-24 20:00 广东
很详细,感谢楼主分享
点赞 回复 分享
发布于 2022-08-24 20:10 广东
跟着楼主学习
点赞 回复 分享
发布于 2022-08-24 20:14 广东
点赞 回复 分享
发布于 2022-08-28 09:59 广东

相关推荐

不愿透露姓名的神秘牛友
11-27 10:28
点赞 评论 收藏
分享
10-17 17:14
门头沟学院 C++
牛客410039819号:北京地区大多是919和927,这两场挂太多人了
投递华为等公司10个岗位
点赞 评论 收藏
分享
贺兰星辰:不要漏个人信息,除了简历模板不太好以外你这个个人简介是不是太夸大了...
点赞 评论 收藏
分享
评论
29
126
分享
牛客网
牛客企业服务