- 请解释Flask是什么以及他的主要用途
- Flask是一个用Python编写的清凉web应用框架。它易于扩展且灵活,适用于小型的项目或者微服务,以及作为大型应用的一部分。
- Flask和Django相比有什么优缺点
- Flask提供了更大的灵活性和简单性,适合小型项目和微服务。Django则提供了更多的内置功能,适合大型项目。Flask让开发者更多的控制其组件,而Django则遵循开箱即用的原则
- 如何在flask中创建一个基本的web应用
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "Hello word"
if __name__ == "__main__":
app.run()
- app = Flask(name) 这行代码在Flask中非常关键,它执行了几个重要的功能:
- 实例化Flask类:‘Flask’是Flask框架中定义的一个类,它实现了应用的所有的主要功能,如路由设置,请求处理。通过调用’Flask’类,你创建了一个FLask应用的示例,通常赋值给变量app。这个示例成为了应用的核心,你将用它来定义路由,注册蓝图,处理请求等
- 确定应用的跟根目录:“name”是Python的特殊变量,它对于当前执行的文件来说,其值通常是"main",但是如果该文件被另外一个文件导入,则"name"的值会便位该文件的模块名。在‘Flask(name)’表达式中使用’name’,使flask能够准确定位应用的位置,从而找到相对于应用根目录的资源,例如模板文件和静态文件
- 配置环境:flask使用这个信息来设置一些与应用环境相关的参数。例如,它可以根据这个信息来确定是否处于调试模式,以及如何加载关联的资源。
- 便于模块化:讲应用实例化为app对象允许你在其它地方导入它,这使得你能够构建一个模块化的应用,其中视图函数,表单,配置和其他元素都可以被分开定义并导入 到主应用中。这有助于保持代码的清晰和组织性,尤其在大型项目中。
- 在flask应用中,路由是如何工作的,请给出一个实例
- 在flask中路由使用@app.route() 装饰器定义,他将URL映射到Python函数
- 使用add_url_rule()方法
- 使用蓝图
- Flask的request和response对象是什么?他们同通常用于什么目的?
- request对象用于获取对象的请求,如数据参数等。response对象用于构建返回给客户端。
- 如何在Flask应用中处理表单提交?
- 使用request对象获取表单数据,在flask视图函数中,你可以使用request对象从表单中获取提交的数据。当使用post请求的时候,你可以通过request.form获取数据
- 在flask中,jinja2模板引擎是如何工作的?
- jinja2模板通过占位符和控制结构允许在html内动态插入内容
- 如何在Flask中管理静态文件
- 静态文件放在static文件夹下,通过url_for(static, filename=‘filename’)在模板中引用
- 你如何在Flask应用中集成和是用sqlalchemy
from flask_sqlalchemy import SQLAlchemy
app.config["SQLALCHEMY_DATABASE_URL"] = "sqlite:///yourdatabase.db"
db = SQLAlchemy(app)
- FLASK-Migrate是用来做什么的?你如何在形目中使用它来管理数据库迁移?
- Flask-Migraet使一个基于Alembic的flask扩展,用于数据库迁。使用flask db init创建迁移环境,‘flask db migrate’生成迁移脚本, ‘flask db upgrade’ 应用迁移
- 如何使用flask创建一个restful api?提供一个简单的示例,包括一个路由和对应的处理函数
from flask import Flask
from flask import jsonify
from flask import request
app = Flask(__name__)
@app.route("/api/data", methods=["GET"])
def hello_world():
data = {"hello": "world"}
return jsonify(data)
if __name__ == "__main__":
app.run()
- flask中有哪些扩展可以帮助你创建restful服务,你通常如何选择
- Flask-RESTful使创建RESTful服务的一个流行的扩展,简化了API的开发
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {"a": "Hello world"}
api.add_resource(HelloWorld, "/")
if __name__ == "__main__":
app.run()
- 在Flask中,中间件是如何工作的?你可以给出一个使用中间件的场景吗?
- 中间件通常可以在请求/响应处理流程中添加钩子函数来工作。flask通常使用before_request和after_request装饰器来实现中间件的功能
- 装饰在Flask中通常用与什么目的?请给出示例
- 装饰器用于在不修改函数的情况下,增加函数功能。常用于身份验证,日志记录等
- Flask的蓝图(Blueprints)是什么?
- 蓝图(Blueprints) 用于构建大型应用,允许你组织应用的路由或者视图函数
- 如何在flask应用中进行性能优化
- 代码优化:避免在请求处理中进行复杂的计算或者IO操作,对于耗时的任务考虑使用异步或者后台任务队列(例如celery)
- 数据库优化:优化数据库查询,避免N+1查询,使用索引来加快查询速度,考虑使用缓存(如redis)减少数据库访问
- 应用架构,使用蓝图优化应用架构,模块化代码提高可维护性和可扩展性
- web服务器和WSGI容器:使用高性能的web服务器和wsgi容器,如nginx配合uWSGI或者Gunicorn,正确配置并发和工作进程数量
- 静态文件服务:使用专门的服务器或者服务来托管静态文件,如云存储
- 你可以采用那些措施来提高flask应用的安全性
- Https使用ssl整数确保所有通信通过https进行
- sql注入防护,使用ORM再带的方法构架您查询,避免直接使用字符串冰洁
- xss防护:使用jinja2模板自带的转移功能,避免在模板中直接渲染用户输入的内容
- CSRF:使用flask-wtf等扩展提供的CSRF保护的功能
- 密码安全:使用加密算法进行密码保护
- 限制请求频率:使用flask-limiter等扩展限制客户端的请求频率,防止暴力攻击
from flask import Flask
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
app = Flask(__name__)
limiter = Limiter(
app=app, key_func=get_remote_address, default_limits=["200 per day", "50 per hour"]
)
@app.route("/")
@limiter.limit("1 per minute")
def slow():
return "sucess"
+ 输入验证:严格验证用户输入,避免不合法或者恶意的数据导致安全问题