- Add Free_Proxy_Website-style fpw_* plugins and register them - Per-plugin crawl timeout (crawl_timeout_seconds=120); remove global crawl_timeout setting - Validator: fix connect vs total timeout on save; SOCKS session LRU cache; drop redundant semaphore - Validation handler uses single DB connection; batch upsert after crawl; WorkerPool put_nowait - Remove unused max_retries from settings API/UI; settings maintenance SQL + init_db cleanup of deprecated keys - WebSocket dashboard stats; ProxyList pool_filter and API alignment - POST /api/proxies/delete-one for IPv6-safe deletes; task poll stops on 404 - pytest uses PROXYPOOL_DB_PATH=db/proxies.test.sqlite so tests do not wipe production DB - .gitignore: explicit proxies.test.sqlite patterns; fix plugin_service ValidationException import Made-with: Cursor
78 lines
2.0 KiB
Python
78 lines
2.0 KiB
Python
"""全局配置 - 使用 Pydantic Settings 支持环境变量和 .env 文件"""
|
||
import os
|
||
from typing import List
|
||
from pydantic import AliasChoices, Field
|
||
from pydantic_settings import BaseSettings, SettingsConfigDict
|
||
|
||
|
||
class Settings(BaseSettings):
|
||
model_config = SettingsConfigDict(
|
||
env_file=".env",
|
||
env_file_encoding="utf-8",
|
||
extra="ignore",
|
||
)
|
||
|
||
# 数据库配置(环境变量 PROXYPOOL_DB_PATH 优先,供 pytest 与生产隔离)
|
||
db_path: str = Field(
|
||
default="db/proxies.sqlite",
|
||
validation_alias=AliasChoices("PROXYPOOL_DB_PATH", "DB_PATH", "db_path"),
|
||
)
|
||
|
||
# API 服务配置
|
||
host: str = "127.0.0.1"
|
||
port: int = 18080
|
||
|
||
# 验证器配置
|
||
validator_timeout: int = 5
|
||
validator_max_concurrency: int = 200
|
||
validator_connect_timeout: int = 3
|
||
|
||
# 爬虫配置
|
||
crawler_num_validators: int = 50
|
||
crawler_max_queue_size: int = 500
|
||
|
||
# 日志配置
|
||
log_level: str = "INFO"
|
||
log_dir: str = "logs"
|
||
|
||
# WebSocket:统计广播间隔(秒);无连接时不查库
|
||
ws_stats_interval_seconds: int = 1
|
||
|
||
# 导出配置
|
||
export_max_records: int = 10000
|
||
|
||
# 代理评分配置
|
||
score_valid: int = 10
|
||
score_invalid: int = -5
|
||
score_min: int = 0
|
||
score_max: int = 100
|
||
|
||
# 验证目标配置
|
||
validator_test_urls: List[str] = [
|
||
"http://httpbin.org/ip",
|
||
"https://httpbin.org/ip",
|
||
"http://api.ipify.org",
|
||
"https://api.ipify.org",
|
||
"http://www.baidu.com",
|
||
"http://www.qq.com",
|
||
]
|
||
|
||
# 插件配置
|
||
plugins_dir: str = "plugins"
|
||
|
||
# CORS 配置 - Pydantic v2 会自动将逗号分隔的字符串解析为 List[str]
|
||
cors_origins: List[str] = [
|
||
"http://localhost:8080",
|
||
"http://localhost:5173",
|
||
"http://127.0.0.1:18081",
|
||
"http://localhost:18081",
|
||
]
|
||
|
||
@property
|
||
def base_dir(self) -> str:
|
||
return os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||
|
||
|
||
# 全局配置实例(启动时加载一次)
|
||
settings = Settings()
|