• 【Python】 Flask相关疑问


    1. 请解释Flask是什么以及他的主要用途
      • Flask是一个用Python编写的清凉web应用框架。它易于扩展且灵活,适用于小型的项目或者微服务,以及作为大型应用的一部分。
    2. Flask和Django相比有什么优缺点
      • Flask提供了更大的灵活性和简单性,适合小型项目和微服务。Django则提供了更多的内置功能,适合大型项目。Flask让开发者更多的控制其组件,而Django则遵循开箱即用的原则
    3. 如何在flask中创建一个基本的web应用
    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route("/")
    def hello_world():
        return "Hello word"
    
    
    if __name__ == "__main__":
        app.run()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 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
    from flask_sqlalchemy import SQLAlchemy
    app.config["SQLALCHEMY_DATABASE_URL"] = "sqlite:///yourdatabase.db"
    db = SQLAlchemy(app)
    
    • 1
    • 2
    • 3
    1. FLASK-Migrate是用来做什么的?你如何在形目中使用它来管理数据库迁移?
    • Flask-Migraet使一个基于Alembic的flask扩展,用于数据库迁。使用flask db init创建迁移环境,‘flask db migrate’生成迁移脚本, ‘flask db upgrade’ 应用迁移
    1. 如何使用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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. 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()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    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等扩展限制客户端的请求频率,防止暴力攻击
    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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    + 输入验证:严格验证用户输入,避免不合法或者恶意的数据导致安全问题
    
    • 1
  • 相关阅读:
    总结:常见的服务发布策略
    Rust有没有信号量机制,在缓存有数据的时候才允许等待的进程取数据?
    C++实现可变参数的日志打印vprintf
    NCF 的Azure Cosmos DB 演示案例
    java计算机毕业设计ssm+vue个人时间规划系统
    FME转换CAD填充块文件为SHP,并正确显示颜色符号。
    C++ 基础与深度分析 Chapter9 序列与关联容器(关联容器、适配器与生成器)
    vue.js毕业设计,基于vue.js前后端分离订座预约系统(H5移动项目) 开题报告
    代码随想录算法训练营第六十一天 | 503.下一个更大元素II、42. 接雨水
    maven
  • 原文地址:https://blog.csdn.net/HelloFif/article/details/136765615