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

写在之前

大家好呀,我是帅蛋。

这里是帅蛋的【最强Python面试题】系列,今天开始第三个专题【Python后台开发】的更新,面试八股文都在这里啦啦啦!

今天主要是 Flask 专题,一共 11 道题,大家一定要记得点赞收藏呀!!!

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

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

主要内容

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

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

已完成

Python 基础题

Python 进阶题

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

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

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

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

以下是正文

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

1、Flask 中请求上下文和应用上下文的区别和作用?

current_app、g 是应用上下文。

request、session 是请求上下文。

手动创建上下文的两种方法:

with app.app_context()
app = current_app._get_current_object()

两者区别:

请求上下文:保存了客户端和服务器交互的数据。

应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用
信息等。

两者作用:

请求上下文(request context):Flask 从客户端收到请求时,要让视图函数能访问一些对象,这样才能处理请求。请求对象是一个很好的例子,它封装了客户端发送的 HTTP 请求。要想让视图函数能够访问请求对象,一个显而易见的方式是将其作为参数传入视图函数,不过这会导致程序中的每个视图函数都增加一个参数,除了访问请求对象,如果视图函数在处理请求时还要访问其他对象,情况会变得更糟。为了避免大量可有可无的参数把视图函数弄得一团糟,Flask使用上下文临时把某些对象变为全局可访问。

应用上下文(application context):它的字面意思是 应用上下文,但它不是一直存在的,它只是 request context 中的一个对 app 的代理(人),所谓 local proxy。它的作用主要是帮助 request 获取当前的应用,它是伴 request 而生,随 request 而灭的。

2、对 Flask 蓝图(Blueprint)的理解?

蓝图的定义

蓝图 /Blueprint 是 Flask 应用程序组件化的方法,可以在一个应用内或跨越多个项目共用蓝图。使用蓝图可以极大地简化大型应用的开发难度,也为 Flask 扩展 提供了一种在应用中注册服务的集中式机制。

蓝图的应用场景

(1) 把一个应用分解为一个蓝图的集合。这对大型应用是理想的。一个项目可以实例化一个应用对象,初始化几个扩展,并注册一集合的蓝图。

(2) 以 URL 前缀和/或子域名,在应用上注册一个蓝图。 URL 前缀/子域名中的参数即成为这个蓝
图下的所有视图函数的共同的视图参数(默认情况下)。

(3) 在一个应用中用不同的 URL 规则多次注册一个蓝图。

(4) 通过蓝图提供模板过滤器、静态文件、模板和其它功能。一个蓝图不一定要实现应用或者视图函
数。

(5) 初始化一个 Flask 扩展时,在这些情况中注册一个蓝图。

蓝图的缺点

不能在应用创建后撤销注册一个蓝图而不销毁整个应用对象。

使用蓝图的三个步骤

(1) 创建一个蓝图对象

blue = Blueprint("blue",__name__)

(2) 在这个蓝图对象上进行操作 ,例如注册路由、指定静态文件夹、注册模板过滤器...

@blue.route('/')
def blue_index():
return 'Welcome to my blueprint'

(3) 在应用对象上注册这个蓝图对象

app.register_blueprint(blue,url_prefix='/blue')

3、Flask 项目中如何实现 session 信息的写入?

Flask 中有三个 session:

(1) 数据库中的 session,例如:db.session.add()

(2)在 flask_session 扩展中的 session,使用:from flask_session importSession,使用第三方扩展的 session 可以把信息存储在服务器中,客户端浏览器中只存储 sessionid

(3) flask 自带的 session,是一个请求上下文, 使用:from flask import session。自带的session 把信息加密后都存储在客户端的浏览器 cookie 中。

4、项目接口实现后路由访问不到怎么办?

可以通过 postman 测试工具测试,或者看 log 日志信息找到错误信息的大概位置。

5、Flask 中 url_for 函数?

URL 反转:根据视图函数名称得到当前所指向的 url。

url_for() 函数最简单的用法是以视图函数名作为参数,返回对应的 url,还可以用作加载静态文件。

<link rel="stylesheet" href="{{url_for('static',filename='css/index.css')}}">

该条语句就是在模版中加载 css 静态文件。

url_for 和 redirect 区别

url_for 是用来拼接 URL 的,可以使用程序 URL 映射中保存的信息生成 URL。

url_for() 函数最简单的用法是以视图函数名作为参数, 返回对应的 URL。例如,在示例程序中 hello.py 中调用 url_for('index') 得到的结果是 /。

redirect 是重定向函数,输入一个 URL 后,自动跳转到另一个 URL 所在的地址,例如,你在函数中写 return redirect('https://www.baidu.com') 页面就会跳转向百度页面。

from flask import Flask,redirect,url_for

app = Flask(__name__)
@app.route('/')

def index():
    login_url = url_for('login')
    return redirect(login_url)
    return u'这是首页'

@app.route('/login/')
def login():
    return u'这是登陆页面'

@app.route('/question/<is_login>/')
def question(is_login):
    if is_login == '1':
        return u'这是发布问答的页面'
    else:
        return redirect(url_for('login'))

if __name__ == '__main__':
    app.run(debug=True)

6、Flask 中请求钩子的理解和应用?

请求钩子是通过装饰器的形式实现的,支持以下四种:

before_first_request 在处理第一个请求前运行
before_request 在每次请求前运行

after_request 如果没有未处理的异常抛出,在每次请求后运行
teardown_request 即使有未处理的异常抛出,在每次请求后运行

应用:

请求钩子

@api.after_request
def after_request(response):
"""设置默认的响应报文格式为 application/json"""
    # 如果响应报文 response 的 Content-Type 是以 text 开头,则将其改为
    # 默认的 json 类型
    if response.headers.get("Content-Type").startswith("text"):
        response.headers["Content-Type"] = "application/json"
    return respon

7、一个变量后写多个过滤器是如何执行的?

{{ expression | filter1 | filter2 | ... }} 即表达式(expression)使用 filter1 过滤后再使用 filter2 过滤。

8、如何把整个数据库导出来,再导入指定数据库中?

导出

mysqldump [-h 主机] -u 用户名 -p 数据库名 > 导出的数据库名.sql

导入指定的数据库中:

第一种方法:

mysqldump [-h 主机] -u 用户名 -p 数据库名 < 导出的数据库名.sql

第二种方法:

先创建好数据库,因为导出的文件里没有创建数据库的语句,如果数据库已经建好,则不用再创建。

create database example charset=utf8;(数据库名可以不一样)

切换数据库:

use example;

导入指定 sql 文件:

mysql>source /path/example.sql;

9、Flask 和 Django 路由映射的区别?

在 django 中,路由是浏览器访问服务器时,先访问的项目中的 url,再由项目中的 url 找到应用 url,这些 url 是放在一个列表里,遵从从前往后匹配的规则。在 flask 中,路由是通过装饰器给每个视图函数提供的,而且根据请求方式的不同可以一个 url 用于不同的作用。

10、跨站请求伪造和跨站请求保护的实现?

图片说明

图中 Browse 是浏览器,WebServerA 是受信任网站/被攻击网站 A,WebServerB 是恶意网站/点击网站 B。

(1)一开始用户打开浏览器,访问受信任网站 A,输入用户名和密码登陆请求登陆网站 A。

(2)网站 A 验证用户信息,用户信息通过验证后,网站 A 产生 Cookie 信息并返回给浏览器。

(3)用户登陆网站 A 成功后,可以正常请求网站 A。

(4)用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 访问网站 B。

(5)网站 B 看到有人方式后,他会返回一些攻击性代码。

(6)浏览器在接受到这些攻击性代码后,促使用户不知情的情况下浏览器携带 Cookie(包括 sessionId)信息,请求网站 A。这种请求有可能更新密码,添加用户什么的操作。

从上面 CSRF 攻击原理可以看出,要完成一次 CSRF 攻击,需要被攻击者完成两个步骤:

(1) 登陆受信任网站 A,并在本地生成 COOKIE。
(2) 在不登出 A 的情况下,访问危险网站 B。

如果不满足以上两个条件中的一个,就不会受到 CSRF 的攻击,以下情况可能会导致 CSRF:

(1) 登录了一个网站后,打开一个 tab 页面并访问另外的网站。

(2) 关闭浏览器了后,本地的 Cookie 尚未过期,你上次的会话还没有已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了……)

解决办法:就是在表单中添加 from.csrf_token。

11、Flask(name)中的name可以传入哪些值?

可以传入的参数:

(1) 字符串:‘hello’, 但是‘abc’,不行,因为 abc 是 python 内置的模块

(2) __name__,约定俗成

不可以传入的参数:

(1) python 内置的模块,re,urllib,abc 等

(2) 数字


最近牛客在搞一个秋招同行计划,邀请大家一起记录自己的笔试,面试经历,写一篇讨论帖@周周~ 就可以得100牛币

反正不限制字数和题材,写的好的还可以拿到50京东卡、周边、一些技术书等,大家冲起来!

活动详情:https://www.nowcoder.com/link/bgzz2023

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

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

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

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

#帅蛋的面试空间##面试八股文##秋招##Python##python面试#
全部评论
新的专题开始啦!大家准备好卷了么~
1 回复
分享
发布于 2022-08-05 13:40
卷起来!
1 回复
分享
发布于 2022-08-05 18:40
秋招专场
校招火热招聘中
官网直投
这么好的文章不上热榜可惜了
1 回复
分享
发布于 2022-08-05 19:10

相关推荐

点赞 评论 收藏
转发
25 113 评论
分享
牛客网
牛客企业服务