当前位置: 首页 > 科技观察

Flask中五个非常流行的扩展

时间:2023-03-13 00:18:45 科技观察

1.Flask-AdminDjango中有一个杀手级的特性就是内置了Admin面板,所有的数据都可以通过Admin后台进行操作,Flask-Admin是一个功能和Django-Admin很相似library,有了它,你再也不用直接去数据库里查数据,改数据了。Github地址:https://github.com/flask-admin/flask-admin2.Flask-SQLAlchemyFlask-SQLAlchemy在SQLAlchemy的基础上直接封装了一层,简化了SQLAlchemy库的配置和导入路径。#config.pySQLALCHEMY_DATABASE_URI=''#app.pydefcreate_app(config_name=None,app_name=None):"""使用工厂模式创建应用"""ifnotapp_name:app_name=__name__app=Flask(app_name)fromflask_sqlalchemyimportSQLAlchemydb=SQLAlchemy()db.init_app(app)#model.pyclass用户(db.Model):id=db.Column(db.Integer,primary_key=True)username=db.Column(db.String,unique=True,nullable=False)email=db.Column(db.String,unique=True,nullable=False)db.session.add(User(username="Flask",email="example@example.com"))db.session.commit()3.Flask-MigrateFlask-migrate是一个SQLAlchemy数据库升级和迁移工具,基于Alembic实现,它提供了一系列命令来执行数据库升级和退出操作。fromflask_alembicimportAlembicalembic=Alembic()alembic.init_app(app)4.Flask-JWT-Extended前后端分离项目基本都是使用JWT进行用户认证。这是一个用来实现JWT功能的扩展,提供了很多配置参数,非常灵活,可以直接在config中配置,省去了很多造轮子的麻烦。从flask_jwt_extended导入create_access_token从flask_jwt_extended导入get_jwt_identity从flask_jwt_extended导入jwt_required从flask_jwt_extended导入JWTManagerjwt=JWTManager(app)#view.py@app.route("/login",methods=["POST"])deflogin():username=request.json.get("username",None)password=request.json.get("password",None)ifusername!="test"orpassword!="test":returnjsonify({"msg":"Badusernameorpassword"}),401#如果账号密码正确,则创建token返回给前端=["GET"])@jwt_required()defusers():#这是一个需要用户登录后才能访问的接口。可以直接用装饰器jwt_required()进行装饰。当token校验不通过时,直接拦截。#这里identity返回的对象依赖于前面创建token的方法中传入的参数identtiycurrent_user=get_jwt_identity()returnjsonify(logged_in_as=current_user),200也可以通过实现user_loader_callback_loader回调来获取get_current_user对象。@jwt_ext.user_loader_callback_loaderdefloader_user_callback(identity):returnUser.query.filter_by(username=identity).first()特别是4.0还实现了白名单功能,可以直接限制用户登录。5.Flask-LimiterFlask-Limiter用于限制接口频率。可以根据不同的资源灵活限制请求的数量。比如可以限制整个app,一个页面可以限制某个蓝图,或者限制路由,也支持自定义配置。fromflaskimportFlaskfromflask_limiterimportLimiterfromflask_limiter.utilimportget_remote_addressapp=Flask(__name__)limiter=Limiter(app,key_func=get_remote_address,default_limits=["每天200","每小时50"])@app.route("/slow")@limiter.limit("1perday")defslow():return":("@app.route("/medium")@limiter.limit("1/second",override_defaults=False)defmedium():return":|"本文转载自微信公众号“Python之禅”,可通过以下二维码关注,转载请联系Python之禅公众号。