吴秋霖 2023-11-08 13:26 采纳率: 100%
浏览 1
已结题

代码中使用装饰器传递session是什么原理?

请懂的佬帮忙解释一下,下图代码中@sessin_required装饰器session传递的原理是什么?

# -*- coding: utf-8 -*-

import random
import requests
from logger_config import logger
from getuseragent import UserAgent
from settings import REQUEST_SETTINGS
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
from functools import wraps

def session_required(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        session = requests.session()
        kwargs['session'] = session
        return func(*args, **kwargs)
    return wrapper


@session_required
def request_with_retry(url, method="GET", params=None, headers=None, proxy=None, session=None):
    if REQUEST_SETTINGS['enable_random_ua']:
        random_ua_list = ["chrome"]
        ua = UserAgent(random.choice(random_ua_list))
        REQUEST_SETTINGS['headers'] = {'user-agent': ua.Random()}

    if REQUEST_SETTINGS['enable_request_proxy']:
        proxy = REQUEST_SETTINGS['proxies']

    # 配置重试策略
    retries = Retry(
        total=REQUEST_SETTINGS['requests_retry_count'],
        backoff_factor=REQUEST_SETTINGS['retry_backoff_factor'],
        status_forcelist=REQUEST_SETTINGS['retry_status_code'])

    session.mount('http://', HTTPAdapter(max_retries=retries))
    session.mount('https://', HTTPAdapter(max_retries=retries))

    try:
        response = session.request(
            method,
            url,
            params=params,
            headers=REQUEST_SETTINGS['headers'],
            proxies=proxy,
            timeout=REQUEST_SETTINGS['request_timeout_second'])
        response.raise_for_status()

        content_type = response.headers.get("Content-Type", "").lower()
        if "application/json" in content_type:
            return response.json()
        else:
            return response.text

    except requests.RequestException as e:
        logger.log('ERROR', f'请求出现异常: {e}')
        return ''

    except requests.RequestException as e:
        logger.log('ERROR', f'请求出现异常: {e}')
        return ''
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月16日
    • 创建了问题 11月8日

    悬赏问题

    • ¥20 wireshark抓不到vlan
    • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
    • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
    • ¥15 stata安慰剂检验作图但是真实值不出现在图上
    • ¥15 c程序不知道为什么得不到结果
    • ¥40 复杂的限制性的商函数处理
    • ¥15 程序不包含适用于入口点的静态Main方法
    • ¥15 素材场景中光线烘焙后灯光失效
    • ¥15 请教一下各位,为什么我这个没有实现模拟点击
    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来