Python--Flask里装饰器+g抽取

装饰器这个在Flask里面咋用的啊!?

最近这句话在我身边无数次的响起~

咱们来看看对于解释。

装饰器解释:
装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。
                                                             

这是what?!其实看字面意思,似乎懂了,实际仍然不知道啥子意思。

来业务场景:

在一个论坛业务中,我们登录页面登录过后,跳转其他页面需要每次都判断我们的登录状态,但是每次重复写同样的代码,费事费力,还极其容易出错,有什么方法可以直接避开这样的问题呢?这就要用到装饰器,即使用装饰器的方法去查询登录状态。

传统的方法,遇到这种业务逻辑会将公用的代码抽取到一个方法中,但是这是相当的啰嗦,怎么破?

装饰器+g变量
=============================
#公共类

import functools
import flask import current
import flask import g    
import flask import session

def check_login(f):
    @functools.wraps(f)                 #核心部分,对内层函数wrapper进行装饰
    def wrapper(*args,**kwargs):
        uid = session.get("uid",None)
        user = None
        if uid:
            try:
                user = User.query.get(uid)
            except Exception as e:
                 current_app.logger.error(e)
        g.user = user                    #查询到的值赋予g变量
        return f(*args,**kwargs)
        return wrapper

#具体调用
@xxx_blur.route('xxxx')
@check_login
def newstalk(newsid):
    user = g.user
    pass



    

装饰器本质上是一个Python函数,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能。对于上边的代码,即抽离大量的与函数功能本身无关的雷同代码并发并继续使用。我们只需要将其保存在g变量中,用的时候调用函数即可。

其他:

1、g对象,用于保存数据。

2、关于functools_wraps函数

我们都还知道,装饰器装饰完之后,我们被装饰的函数的名字会变成装饰器函数的内层函数名。
即无论你打印多少,名字都会是你的内层函数名。而使用了functools.wraps就还原了原来的方法名。
说白了,functools.wraps保持了当前装饰器所装饰的函数__name__的值不变。
那么在我们的Flask项目里面,一个视图函数不能被两个不同的路由进行装饰,一个路由对应一个函数,否则就会出现覆盖,报错。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现课程电商网站,我们可以使用Flask框架和MySQL数据库来构建网站,并使用PayPal API来处理付款。以下是一些步骤: 1. 首先,我们需要使用Flask和MySQL来构建网站。我们可以使用Flask的蓝图来组织我们的代码,并使用MySQL来存储我们的数据。 2. 接下来,我们需要使用PayPal API来处理付款。我们可以使用PayPal的Vue.js包装组件vue-paypal-checkout来实现这一点。我们可以将这个组件添加到我们的网站,并使用它来处理付款。 3. 我们还需要使用python-dotenv和flask-cli自定义命令来管理我们的环境变量和启动我们的应用程序。我们可以使用python-dotenv来加载我们的环境变量,并使用flask-cli自定义命令来启动我们的应用程序。 ```python # 示例代码 from flask import Flask from flask_mysqldb import MySQL from paypalcheckoutsdk.core import PayPalHttpClient, SandboxEnvironment from paypalcheckoutsdk.orders import OrdersCreateRequest app = Flask(__name__) # 配置MySQL数据库 app.config['MYSQL_HOST'] = 'localhost' app.config['MYSQL_USER'] = 'root' app.config['MYSQL_PASSWORD'] = 'password' app.config['MYSQL_DB'] = 'mydatabase' mysql = MySQL(app) # 配置PayPal API client_id = 'YOUR_CLIENT_ID' client_secret = 'YOUR_CLIENT_SECRET' environment = SandboxEnvironment(client_id=client_id, client_secret=client_secret) client = PayPalHttpClient(environment) # 创建订单 request = OrdersCreateRequest() request.prefer('return=representation') request.request_body({ "intent": "CAPTURE", "purchase_units": [{ "amount": { "currency_code": "USD", "value": "100.00" } }] }) response = client.execute(request) print(response.result.id) # 自定义命令 @app.cli.command() def init_db(): cur = mysql.connection.cursor() cur.execute('CREATE TABLE IF NOT EXISTS courses (id INT, name VARCHAR(255), price FLOAT)') mysql.connection.commit() cur.close() print('Initialized the database.') # 蓝图 from flask import Blueprint bp = Blueprint('courses', __name__, url_prefix='/courses') @bp.route('/') def index(): cur = mysql.connection.cursor() cur.execute('SELECT * FROM courses') courses = cur.fetchall() cur.close() return render_template('courses/index.html', courses=courses) @bp.route('/<int:id>') def show(id): cur = mysql.connection.cursor() cur.execute('SELECT * FROM courses WHERE id = %s', [id]) course = cur.fetchone() cur.close() return render_template('courses/show.html', course=course) app.register_blueprint(bp) if __name__ == '__main__': app.run() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值