【Python】 Flask相关疑问

  1. 请解释Flask是什么以及他的主要用途
    • Flask是一个用Python编写的清凉web应用框架。它易于扩展且灵活,适用于小型的项目或者微服务,以及作为大型应用的一部分。
  2. Flask和Django相比有什么优缺点
    • Flask提供了更大的灵活性和简单性,适合小型项目和微服务。Django则提供了更多的内置功能,适合大型项目。Flask让开发者更多的控制其组件,而Django则遵循开箱即用的原则
  3. 如何在flask中创建一个基本的web应用
python 复制代码
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对象允许你在其它地方导入它,这使得你能够构建一个模块化的应用,其中视图函数,表单,配置和其他元素都可以被分开定义并导入 到主应用中。这有助于保持代码的清晰和组织性,尤其在大型项目中。
  1. 在flask应用中,路由是如何工作的,请给出一个实例
    • 在flask中路由使用@app.route() 装饰器定义,他将URL映射到Python函数
    • 使用add_url_rule()方法
    • 使用蓝图
  2. Flask的request和response对象是什么?他们同通常用于什么目的?
    • request对象用于获取对象的请求,如数据参数等。response对象用于构建返回给客户端。
  3. 如何在Flask应用中处理表单提交?
  • 使用request对象获取表单数据,在flask视图函数中,你可以使用request对象从表单中获取提交的数据。当使用post请求的时候,你可以通过request.form获取数据
  1. 在flask中,jinja2模板引擎是如何工作的?
    • jinja2模板通过占位符和控制结构允许在html内动态插入内容
  2. 如何在Flask中管理静态文件
  • 静态文件放在static文件夹下,通过url_for(static, filename='filename')在模板中引用
  1. 你如何在Flask应用中集成和是用sqlalchemy
python 复制代码
from flask_sqlalchemy import SQLAlchemy
app.config["SQLALCHEMY_DATABASE_URL"] = "sqlite:///yourdatabase.db"
db = SQLAlchemy(app)
  1. FLASK-Migrate是用来做什么的?你如何在形目中使用它来管理数据库迁移?
  • Flask-Migraet使一个基于Alembic的flask扩展,用于数据库迁。使用flask db init创建迁移环境,'flask db migrate'生成迁移脚本, 'flask db upgrade' 应用迁移
  1. 如何使用flask创建一个restful api?提供一个简单的示例,包括一个路由和对应的处理函数
python 复制代码
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()
  1. flask中有哪些扩展可以帮助你创建restful服务,你通常如何选择
  • Flask-RESTful使创建RESTful服务的一个流行的扩展,简化了API的开发
python 复制代码
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()
  1. 在Flask中,中间件是如何工作的?你可以给出一个使用中间件的场景吗?
  • 中间件通常可以在请求/响应处理流程中添加钩子函数来工作。flask通常使用before_request和after_request装饰器来实现中间件的功能
  1. 装饰在Flask中通常用与什么目的?请给出示例
    • 装饰器用于在不修改函数的情况下,增加函数功能。常用于身份验证,日志记录等
  2. Flask的蓝图(Blueprints)是什么?
  • 蓝图(Blueprints) 用于构建大型应用,允许你组织应用的路由或者视图函数
  1. 如何在flask应用中进行性能优化
    • 代码优化:避免在请求处理中进行复杂的计算或者IO操作,对于耗时的任务考虑使用异步或者后台任务队列(例如celery)
    • 数据库优化:优化数据库查询,避免N+1查询,使用索引来加快查询速度,考虑使用缓存(如redis)减少数据库访问
    • 应用架构,使用蓝图优化应用架构,模块化代码提高可维护性和可扩展性
    • web服务器和WSGI容器:使用高性能的web服务器和wsgi容器,如nginx配合uWSGI或者Gunicorn,正确配置并发和工作进程数量
    • 静态文件服务:使用专门的服务器或者服务来托管静态文件,如云存储
  2. 你可以采用那些措施来提高flask应用的安全性
    • Https使用ssl整数确保所有通信通过https进行
    • sql注入防护,使用ORM再带的方法构架您查询,避免直接使用字符串冰洁
    • xss防护:使用jinja2模板自带的转移功能,避免在模板中直接渲染用户输入的内容
    • CSRF:使用flask-wtf等扩展提供的CSRF保护的功能
    • 密码安全:使用加密算法进行密码保护
    • 限制请求频率:使用flask-limiter等扩展限制客户端的请求频率,防止暴力攻击
python 复制代码
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"
+ 输入验证:严格验证用户输入,避免不合法或者恶意的数据导致安全问题
相关推荐
欧阳枫落4 分钟前
python 2小时学会八股文-数据结构
开发语言·数据结构·python
天天要nx8 分钟前
D64【python 接口自动化学习】- python基础之数据库
数据库·python
何曾参静谧11 分钟前
「QT」文件类 之 QTextStream 文本流类
开发语言·qt
monkey_meng15 分钟前
【Rust类型驱动开发 Type Driven Development】
开发语言·后端·rust
落落落sss23 分钟前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby
2401_8532757344 分钟前
ArrayList 源码分析
java·开发语言
zyx没烦恼44 分钟前
【STL】set,multiset,map,multimap的介绍以及使用
开发语言·c++
lb363636363644 分钟前
整数储存形式(c基础)
c语言·开发语言
feifeikon1 小时前
Python Day5 进阶语法(列表表达式/三元/断言/with-as/异常捕获/字符串方法/lambda函数
开发语言·python
大鲤余1 小时前
Rust,删除cargo安装的可执行文件
开发语言·后端·rust