文章目录
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中的数据库连接?
- 在脚本中以用第三方库正常连接,用sql语句正常操作数据库,如mysql关系型数据库的pymsql库
- 用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只是实现通信通道,发送的是完全取决于应用程序。