【Flask开发实战】flask装饰器介绍

一、前言

前面我们已经完成了登录页面的创建,在后续页面的创建中,需要解决一个问题,就是用户是否已认证登录,对于已经认证登录后我们可以开放其他页面访问的权限,如果是没有验证登录的,则应该拒绝访问。此时我们可以使用装饰器的作用,帮助完成不同页面访问用户的认证鉴定。

二、什么是装饰器

Flask 装饰器是一种特殊的 Python 语法,用于修改或包装函数或方法的行为。通过装饰器,我们可以在函数执行之前或之后添加额外的功能,例如身份验证、日志记录、缓存等。Flask 中的装饰器是非常强大的工具,可以提高代码的可读性、可维护性,能够轻松地使应用程序具有更高的灵活性和扩展性。

在 Flask 中,装饰器是以 @ 符号开始的函数,它接受一个函数作为参数,并返回一个新的函数。这个新的函数通常会包装原始函数,并在执行前后执行一些额外的操作。

三、常用装饰器介绍

1、路由装饰器

在 Flask 中,最常见的装饰器是用于定义路由的 @app.route() 装饰器。它告诉 Flask 应用程序哪个 URL 触发了特定的函数。

from flask import Flask

app = Flask(name)

@app.route('/')

def index():

return 'Hello, World!'

if name == 'main':

app.run(debug=True)

2、身份验证装饰器

通过自定义装饰器,我们可以轻松地实现身份验证功能,例如检查用户是否已登录,例如

from flask import Flask, request, redirect, url_for

app = Flask(name)

def login_required(func):
def wrapper(*args, **kwargs):
if not is_logged_in():
return redirect(url_for('login'))
return func(*args, **kwargs)
return wrapper

@app.route('/')
@login_required

def home():

return 'Welcome to the home page!'

if name == 'main':

app.run(debug=True)

3、缓存装饰器

使用装饰器可以轻松地实现缓存功能,提高应用程序的性能,例如:

from flask import Flask, request

from functools import wraps

app = Flask(name)

def cache(func):
cached_data = {}

@wraps(func)
def wrapper(*args, **kwargs):
key = request.path
if key in cached_data:
return cached_datakey
result = func(*args, **kwargs)
cached_datakey = result
return result

return wrapper

@app.route('/')
@cache

def expensive_operation():

Some expensive operation

return 'Result of expensive operation'

if name == 'main':

app.run(debug=True)

四、项目开发实例

在我们防火墙查询页面中,我们也需要使用到身份验证的装饰器,我们首先在主目录下定义个装饰器脚本decorators.py

python 复制代码
from functools import wraps
from flask import g, redirect, url_for

def login_required(func):
    # 保留func的信息
    @wraps(func)
    # func(a,b,c)
    # func(1,2,c=3)
    def inner(*args, **kwargs):
        if g.user:
            return func(*args, **kwargs)
        else:
            return redirect(url_for("auth.login"))
    return inner

在之后的蓝图编写时,对应不同的url,我们就可以加上@login_required后,实现身份验证的功能,例如马上我们要做的首页url:

@bp.route("/")
@login_required

def index():

u = FwModel.query.all()

return render_template('index.html',u=u)

相关推荐
凤山老林8 小时前
聊聊企业级 API 安全:Spring Boot 落地 OAuth 2.1、mTLS 与接口签名防篡改
spring boot·后端·安全·oauth
颜颜yan_8 小时前
ESP-IDF 鸿蒙 PC 适配全记录:打通 Python、构建工具链与 ESP32-P4 固件生成
python·华为·harmonyos
言乐68 小时前
Python加速器4跨境网络加速器
运维·服务器·开发语言·网络·python
weixin_440730508 小时前
线程02-并发串行-互斥锁-Semaphore-Event
python·thread
林鹿8 小时前
maven属性与groovy变量对照表
后端
烽火戏诸诸诸侯8 小时前
AI 让我的独门小工具焕发第二春
后端·ai编程·vibecoding
张小凡vip9 小时前
python--爬虫--经验积累的遇到的坑
开发语言·爬虫·python
狼爷9 小时前
硅谷爆火的FDE是AI新风口,还是高级外包?
后端·全栈
毕业设计7039 小时前
(免费领源码) 基于微信小程序的预制菜商城的设计与实现25172-java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
vue.js·python·mysql·微信小程序·pycharm·微信开发者工具·推荐算法
xifangge202510 小时前
AGENTS.md 怎么写?涵盖 Java、Python、Vue、Go 的 8 套开箱即用模板
java·vue.js·python