请懂的佬帮忙解释一下,下图代码中@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 ''