Flask框架面试题

1.什么是Flask,有什么优点?

答:
Flask是一个轻量级的Web框架,主要是用来写接口的一个框架,实现前后端分离,提升开发效率,Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展 Flask-Mail,用户认证 Flask-Login),都需要用第三方的扩展来实现。比如可以用 Flask-extension 加入 ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,可以选择 MySQL,也可以用 NoSQL。
优点: 框架很轻量;更新时依赖小;专注于安全方面的bug

Werkzeug,一个WSGI工具包(web服务网关接口:是为python语言定义的web服务器和web应用程序或架构之间的一种简单而通用的接口,其他语言也有类似的接口)
jinja2是基于python的模板引擎,功能类似于PHPP的smarty,能完全支持unicode,并具有继承的沙箱执行环境,应用广泛。

2.Flask-WTF是什么,有什么特点?

答: Flask-WTF是一个用于表单处理、校验并提供CSRF验证的功能的扩展库;Flask-wtf能把正表单免受CSRF<跨站请求伪造>的攻击
form.html

<form action="{{ url_for('wtf_form') }}" method='post'>
    {{ form.csrf_token }} #进入csrf验证
    <p>{{ form.username.label }}{{ form.username(style='color:red',placeholder='请输入用户名') }}{{ form.username.errors }}</p>
    <p>{{ form.userpass.label }}{{ form.userpass() }}{{ form.userpass.errors }}</p>
    <p>{{ form.submit() }}</p>
</form>

manage.py

from flask import Flask,render_template,request
from flask_wtf import FlaskForm   #导入继承父类
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import Length,DataRequired

class Login(FlaskForm):  #继承自FlaskForm类
    username = StringField('用户名',validators=[Length(min=6,max=12,message='用户名长度为6~12位'),DataRequired(message='用户名不能为空')])
    userpass = PasswordField('密码',validators=[Length(min=6,max=12,message='密码长度为6~12位'),DataRequired(message='密码不能为空')])
    submit = SubmitField('登录')


@app.route('/wtf_form',methods=['GET','POST'])
def wtf_form():
    form = Login()  #实例化form对象
    if request.method == 'POST':
        if form.validate_on_submit():  #数据正确 并且验证csrf通过
            print(request.form.get('userpass'))
            print(request.form.get('username'))
            return '数据提交成功'
    return render_template('wtf_form.html',form=form)

#注:
#1 methods 参数告诉Flask在URL映射中把这个视图函数注册为GET和POST请求的处理程序,默认GET
#2 采用post请求可以通过对象很轻松访问,GET 请求没有主体,提交的数据以查询字符串的形式附加到URL中
#3 validate_on_submit() 会调用username 字段上附属的 DataRequired() 验证函数。

3.Flask脚本的常用方式是什么?

答: 在shell中运行脚本文件;在python编译器中run

4.如何在Flask中访问会话?

会话(seesion)会话数据存储在服务器上。 会话是客户端登录到服务器并注销的时间间隔。 需要在此会话中进行的数据存储在服务器上的临时目录中。

from flask import session		#导入会话对象
session['name'] = 'admin'		# 给会话添加变量
session.pop('username', None)	# 删除会话的变量

5.解释Python Flask中的数据库连接?

  1. 在脚本中以用第三方库正常连接,用sql语句正常操作数据库,如mysql关系型数据库的pymsql库
  2. 用ORM来进行数据库连接,flask中典型的flask_sqlalchemy,已面向对象的方式进行数据库的连接与操作

6.Flask框架依赖组件?

  • Route(路由)
  • templates(模板)
  • Models(orm模型)
  • blueprint(蓝图)
  • Jinja2模板引擎

7.Flask蓝图的作用?

蓝图Blueprint实现模块化的应用
book_bp = Blueprint('book', __name__)创建蓝图对象
蓝图中使用路由@book_bp.route('url')
在另一.py文件里导入和注册蓝图from book import book_bp app.register_blueprint(book_bp)
作用: 将不同的功能模块化;构建大型应用;优化项目结构;增强可读性,易于维护(跟Django的view功能相似)

8.列举使用过的Flask第三方组件?

flask_bootstrap:Bootstrap是由Twitter推出的一个用于前端开发的开源工具包,给予HTML、CSS、JavaScriot,提供简洁、直观、强悍的前端开发框架,是目前最受环境的前端框架。
安装:pip install flask_bootstrap
Flask 扩展一般都在创建程序实例时初始化,下面是Flask_Bootstrap的初始化方法
加载:
from flask_bootstrap import Bootstrap
初始化:
app = Flask(__name__) Bootstrap(app)

flask-WTF:是一个关于表单的扩展库,可以自动生成表单的HTML代码和验证提交的表单数据,并且提供跨站请求伪造(Cross-Site Request Forgery)保护的功能,使用非常方便。
flask_sqlalchemy

9.简述Flask上下文管理流程?

  • 请求到来时,将session和request封装到ctx对象中
  • 对session做补充
  • 将包含了request和session的ctx对象放到一个容器中(每个请求都会根据线程/协程加一个唯一标识)
  • 视图函数使用的时候需要根据当前线程或协程的唯一标识,获取ctx对象,再取ctx对象中取request和session(视图函数使用的时候,需要根据当前线程获取数据。)
  • 请求结束时,根据当前线程/协程的唯一标记,将这个容器上的数据移除。

10.Flask中多app应用是怎么完成?

请求进来时,可以根据URL的不同,交给不同的APP处理
使用Flask类创建不同的app对象,然后借助DispatcherMiddleware类来实现。

11.wtforms组件的作用?

WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。

12.Flask框架默认session处理机制?

Flask的默认session利用了Werkzeug的SecureCookie,把信息做序列化(pickle)后编码(base64),放到cookie里了。
过期时间是通过cookie的过期时间实现的。
为了防止cookie内容被篡改,session会自动打上一个叫session的hash串,这个串是经过session内容、SECRET_KEY计算出来的,看得出,这种设计虽然不能保证session里的内容不泄露,但至少防止了不被篡改。

13.lask中的g的作用

g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别

14.Flask中上下文管理主要涉及到了那些相关的类,这些类的主要作用

LocalStack:帮助我们在local中把一个列表维护成一个栈,方便我们对列表中的数据进行添加和维护,有了LocalStack操作更加便捷。
Local:帮助我们为每个线程/协程开辟空间

15.在Flask中实现WebSocket需要什么组件

WebSocket是HTML5引入的新的通信协议,主要由Web客户端和服务器实现,当然它也可以在Web之外实现。
与HTTP连接不同,WebSocket连接是客户端和服务器之间永久的双向通信通道,其中任何一个都可以启动交换。 一旦建立,连接一直有效,直到其中一方断开连接。

Flask-Sockets和Flask-SocketIO之间的主要区别在于前者仅仅将WebSocket协议(通过使用gevent-websocket项目)进行包装,因此它只适用于原生支持WebSocket协议的浏览器,对于那些不支持WebSocket协议的较老的浏览器,就无法使用它了。 Flask-SocketIO则不同,通过前面的介绍,读者应该已经知道了它不仅实现了WebSocket协议,并且对于那些不支持WebSocket协议的旧版浏览器,使用它也能够实现相同的效果。新版旧版的浏览器都能使用他
另一个区别是Flask-SocketIO实现了SocketIO Javascript库公开的消息传递协议。 Flask-Sockets只是实现通信通道,发送的是完全取决于应用程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值