Python轻量级Web框架Flask(10)——Flask进阶知识(caching插件和Flask自带的钩子函数)

1、Flask的MVT(Models、Views、Templates)框架流程回顾:

在这里插入图片描述

  • 视图函数把数据返回给浏览器的方法有多种,其中一种就是通过模板Templates

2、Flask插件介绍:

  • Flask插件可以去官网查看,有很多。
  • 插件安装流程:
    • 1、通过pip指令在对应环境中下载插件
    • 2、在项目的exts.py文件中初始化
    • 3、使用

3、Flask的caching插件介绍:

  • 这个插件是一个和缓存相关的插件,缓存经常用来保留那些经常被访问的临时数据。
  • 注意下面操作中,安装操作是在终端文件中完成的,初始化是在exts文件中,使用是在视图函数中,注意在视图函数中使用之前要先导入cache。
    在这里插入图片描述
  • 在视图函数中,写在timeout后面的数据就是缓存的时长,如果当前视图函数当中的数据被访问过,就会将该数据保存30秒的时长,在30秒之内都是可以访问缓存数据的,不用再调用视图函数加载数据了,但是超过30秒就要重新加载了。

4、钩子函数:

  • 定义:钩子函数也叫做钩子或者中间件,是指在执行函数和目标函数之间挂载的函数,框架开发者给调用方提供了一个point(挂载点),是一种AOP切面编程思想。简单理解就是在Flask框架的MVT环节中的各个过程中,钩子函数都可以做拦截,相当于在正常流程的中间切开做操作,所以叫做切面编程。
  • 通俗理解:就是在程序执行的过程中,设置钩子函数,可以拦截错误的访问,同时可以检查执行的数据。
  • 常用的钩子函数:
    • before_first_request:处理第一次请求之前执行。
    • before_request:每次请求之前执行,通常用这个钩子函数预处理一些变量,实现反爬等。
    • after_request:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
    • teardown_appcontext:当APP上下文被移除之后执行的函数,可以进行数据库的提交或者回滚。

5、结合Flask的caching插件和钩子函数制作一个简单的爬虫反扒工具:

  • 项目预览
    在这里插入图片描述

注意:这里项目用到的还是之前的项目模板,可以看下Python轻量级Web框架Flask(8)

  • 需求:写一个简单爬虫,通过Flask模型中缓存插件和钩子函数制作一个反扒程序。
  • 首先下载安装flask-caching(在环境的对应终端pip install flask-caching)
  • 然后初始化(参考上面)
  • 代码展示(这部分只会展示和模板中被修改部分的代码,其余文件代码参考模板)

exts:

from flask_sqlalchemy import SQLAlchemy # ORM
from flask_migrate import Migrate   # 数据迁移
from flask_caching import Cache

db = SQLAlchemy()
migrate = Migrate()
cache = Cache(
    config={'CACHE_TYPE': 'simple'} # 缓存类型
)

def init_exts(app):
    db.init_app(app=app)
    migrate.init_app(app=app,db=db)
    cache.init_app(app=app)

views:

# 在views.py中放路由和视图函数
from flask import Blueprint, request
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件
from .exts import cache
import time

# 蓝图
blue = Blueprint('user', __name__)

@blue.route('/')
@cache.cached(timeout=10) # 缓存的有效时间是10秒
def index():
    print('index')
    time.sleep(3)   # 第一次访问会等待3秒,返回值也会给到缓存,之后再访问就直接在缓存中获取返回值(不会再执行index了)
    return 'index'

# 钩子函数
# defore_request:每次请求之前访问
@blue.before_request
def before():   # 钩子函数没有路由
    print('before_request')
    # request
    print(request.path) # /
    print(request.method)   # GET
    print(request.remote_addr)  # 127.0.0.1(客户端ip)

    # # 简单反爬(通过访问代理)
    # print(request.user_agent)
    # # 浏览器访问的user_agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36
    # # python爬虫访问的user_agent:python-requests/2.28.2  【运行spider文件之后的结果】
    # if 'python' in request.user_agent.string:
    #     return '请不要使用python爬虫!该访问已被拦截'

    # 通过ip的访问频率反爬,下面代码就是在检测用户是否是1秒内连续访问,如果是就是爬虫行为。
    ip = request.remote_addr
    if cache.get(ip): # 获取缓存
        return '你的ip正在实施爬虫行为' # 这里如果返回的话,就不会再进入视图函数了,这就是AOP切面编程
    else:
        # 对每个ip设置一个缓存,1秒内不让重复访问
        cache.set(ip, 'value', timeout=1) # 设置缓存

spider:

import requests

# res = requests.get('http://127.0.0.1:5000/')
# print(res.text) # index

# 频繁访问
for i in range(10):
    res = requests.get('http://127.0.0.1:5000/')
    print(res.text)  # index
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值