Flask面试问题

1. 解释什么是Flask及其好处?

Flask是一个Python编写的Web微框架,让我们可以使用Python语言快速实现一个网站或Web服务。

2. Django和Flask有什么区别?

Flask:

  • Flask确实很“轻”,Flask自由、灵活,可扩展性强,第三方库的选择面广,开发时可以结合自己最喜欢用的轮子,也能结合最流行最强大的Python库。
  • 入门简单,非常适用于小型网站和开发web服务的API
  • 开发大型网站无压力,但代码架构需要自己设计,开发成本取决于开发者的能力
  • 各方面性能均等于或优于Django
  • Flask与关系型数据库的配合使用不弱于Django,而其与NoSQL数据库的配合远远优于Django
  • Flask比Django更加Pythonic,与Python的philosophy更加吻合
    Django:
  • 太重了,除了web框架,自带ORM和模板引擎,灵活和自由度不够高
  • 非常适合企业级网站的开发:快速、靠谱、稳定,但相比于Flask,Django的整体生态相对封闭
  • 自带的数据库管理app好评如潮
  • 自带ORM也使Django与关系型数据库耦合度过高,如果想使用MongoDB等NoSQL数据,需要选取合适的第三方库,且总感觉Django+SQL才是天生一对的搭配,Django+NoSQL砍掉了Django的半壁江山。

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

Flask的简单WTForms集成,包含CSRF、文件上传和Recaptcha集成。
flask-wtf可以保护表单免受跨站请求伪造(CSRF)的攻击,恶意网站将请求发送到被攻击者已登录的其他网站时就会引发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() 验证函数。

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

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

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

一个会话基本上允许记住从一个请求到另一个请求的信息。在Flask中,它使用签名的cookie,以便用户可以查看会话内容并进行修改。用户可以修改会话,只要它有密钥Flask.secret_key。
会话(seesion)会话数据存储在服务器上。 会话是客户端登录到服务器并注销的时间间隔。 需要在此会话中进行的数据存储在服务器上的临时目录中。

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

6. Flask是一个MVC模型吗?如果是,可以示例一下吗?

基本上,Flask是一个简单的框架,其行为与MVC框架相同。所以MVC是Flask的完美选择。

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

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

8. 列举Http请求中常见的请求方式?

1、opions 返回服务器针对特定资源所支持的HTML请求方法 或web服务器发送*测试服务器功能(允许客户端查看服务器性能)
2、Get 向特定资源发出请求(请求指定页面信息,并返回实体主体)
3、Post 向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的建立或原有资源的修改
4、Put 向指定资源位置上上传其最新内容(从客户端向服务器传送的数据取代指定文档的内容)
5、Head 与服务器索与get请求一致的相应,响应体不会返回,获取包含在小消息头中的原信息(与get请求类似,返回的响应中没有具体内容,用于获取报头)
6、Delete 请求服务器删除request-URL所标示的资源(请求服务器删除页面)
7、Trace 回显服务器收到的请求,用于测试和诊断
8、Connect HTTP/1.1协议中能够将连接改为管道方式的代理服务器

9. 列举Http请求中常见的请求头?

•Accept:浏览器可接受的MIME类型 
•Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集 
•Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip 
•Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。可以在浏览器中进行设置。 
•Host:初始URL中的主机和端口 
•Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面 
•Content-Type:内容类型 
•If-Modified-Since: Wed, 02 Feb 201112:04:56 GMT利用这个头与服务器的文件进行比对,如果一致,则从缓存中直接读取文件。 
•User-Agent:浏览器类型. 
•Content-Length:表示请求消息正文的长度 
•Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接 
•Cookie:这是最重要的请求头信息之一 
•Date:Date: Mon, 22 Aug 2011 01:55:39 GMT请求时间GMT

10. 什么是wsgi?

WSGI(Web Server Gateway Interface,Web 服务器网关接口)则是Python语言中1所定义的Web服务器和Web应用程序之间或框架之间的通用接口标准。
WSGI就是一座桥梁,桥梁的一端称为服务端或网关端,另一端称为应用端或者框架端,WSGI的作用就是在协议之间进行转化。WSGI将Web组件分成了三类:Web 服务器(WSGI Server)、Web中间件(WSGI Middleware)与Web应用程序(WSGI Application)。
Web Server接收HTTP请求,封装一系列环境变量,按照WSGI接口标准调用注册的WSGI Application,最后将响应返回给客户端。

11. Flask框架依赖组件?

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

12. Flask蓝图的作用?

蓝图Blueprint实现模块化的应用

book_bp = Blueprint(‘book’, name)创建蓝图对象

蓝图中使用路由@book_bp.route(‘url’) 
在另一.py文件里导入和注册蓝图

from book import book_bp app.register_blueprint(book_bp)

作用

将不同的功能模块化
构建大型应用
优化项目结构
增强可读性,易于维护(跟Django的view功能相似)

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

flask_bootstrap
flask-WTF
flask_sqlalchemy

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

每次有请求过来的时候,flask 会先创建当前线程或者进程需要处理的两个重要上下文对象,把它们保存到隔离的栈里面,这样视图函数进行处理的时候就能直接从栈上获取这些信息。

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

请求进来时,可以根据URL的不同,交给不同的APP处理

17. wtforms组件的作用?

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

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

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

19. ORM的实现原理?

概念: 对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

详细介绍:让我们从O/R开始。字母O起源于”对象”(Object),而R则来自于”关系”(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。

当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。

ORM解决的主要问题是对象关系的映射。域模型和关系模型分别是建立在概念模型的基础上的。域模型是面向对象的,而关系模型是面向关系的。一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。

20. ORM技术特点

1.提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。
2.ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。