https://www.python.org/static/community_logos/python-logo-master-v3-TM.png

大型项目结构与设计模式

项目结构规范

text

复制

下载

enterprise_app/
├── docs/                  # 项目文档
├── tests/                 # 测试代码
│   ├── unit/              # 单元测试
│   └── integration/       # 集成测试
├── src/                   # 主代码
│   ├── package/           # 主包
│   │   ├── __init__.py
│   │   ├── core/          # 核心业务逻辑
│   │   ├── models/        # 数据模型
│   │   ├── services/      # 服务层
│   │   ├── api/           # API接口
│   │   └── utils/         # 工具函数
│   └── scripts/           # 脚本目录
├── configs/               # 配置文件
├── requirements/          # 依赖文件
│   ├── base.txt           # 基础依赖
│   ├── dev.txt            # 开发依赖
│   └── prod.txt           # 生产依赖
├── .env                   # 环境变量
├── .gitignore
├── pyproject.toml         # 项目配置
└── README.md

工厂模式实现

python

复制

下载

from abc import ABC, abstractmethodclass DatabaseConnection(ABC):@abstractmethoddef connect(self):pass@abstractmethoddef execute_query(self, query):passclass MySQLConnection(DatabaseConnection):def connect(self):print("Connecting to MySQL database")return selfdef execute_query(self, query):print(f"Executing MySQL query: {query}")class PostgreSQLConnection(DatabaseConnection):def connect(self):print("Connecting to PostgreSQL database")return selfdef execute_query(self, query):print(f"Executing PostgreSQL query: {query}")class DatabaseFactory:@staticmethoddef create_connection(db_type):if db_type == "mysql":return MySQLConnection()elif db_type == "postgresql":return PostgreSQLConnection()else:raise ValueError("Unsupported database type")# 使用工厂
db = DatabaseFactory.create_connection("mysql")
db.connect().execute_query("SELECT * FROM users")

https://refactoring.guru/images/patterns/diagrams/factory-method/structure.png

企业级Web框架:Django

Django项目结构

text

复制

下载

django_project/
├── manage.py
├── project/
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── apps/├── users/│   ├── migrations/│   ├── __init__.py│   ├── admin.py│   ├── apps.py│   ├── models.py│   ├── tests.py│   ├── urls.py│   └── views.py└── products/├── migrations/├── __init__.py├── admin.py├── apps.py├── models.py├── tests.py├── urls.py└── views.py

Django REST Framework示例

python

复制

下载

# serializers.py
from rest_framework import serializers
from .models import Productclass ProductSerializer(serializers.ModelSerializer):class Meta:model = Productfields = ['id', 'name', 'price', 'description']# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializerclass ProductViewSet(viewsets.ModelViewSet):queryset = Product.objects.all()serializer_class = ProductSerializerfilterset_fields = ['price']search_fields = ['name', 'description']# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ProductViewSetrouter = DefaultRouter()
router.register(r'products', ProductViewSet)urlpatterns = [path('', include(router.urls)),
]

https://www.django-rest-framework.org/img/logo.png

容器化与部署

Dockerfile示例

dockerfile

复制

下载

# 使用官方Python基础镜像
FROM python:3.9-slim# 设置工作目录
WORKDIR /app# 设置环境变量
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \build-essential \&& rm -rf /var/lib/apt/lists/*# 安装Python依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt# 复制项目代码
COPY . .# 暴露端口
EXPOSE 8000# 运行命令
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "project.wsgi:application"]

Kubernetes部署配置

yaml

复制

下载

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: django-app
spec:replicas: 3selector:matchLabels:app: djangotemplate:metadata:labels:app: djangospec:containers:- name: djangoimage: your-registry/django-app:latestports:- containerPort: 8000envFrom:- configMapRef:name: django-config# service.yaml
apiVersion: v1
kind: Service
metadata:name: django-service
spec:selector:app: djangoports:- protocol: TCPport: 80targetPort: 8000type: LoadBalancer

https://d33wubrfki0l68.cloudfront.net/2475489eaf20163ec0f54ddc1d92aa8d4c87c96b/e7c81/images/docs/components-of-kubernetes.svg

持续集成与部署 (CI/CD)

GitHub Actions配置

yaml

复制

下载

# .github/workflows/ci-cd.yaml
name: CI/CD Pipelineon:push:branches: [ main ]pull_request:branches: [ main ]jobs:test:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Pythonuses: actions/setup-python@v2with:python-version: '3.9'- name: Install dependenciesrun: |python -m pip install --upgrade pippip install -r requirements.txtpip install pytest- name: Run testsrun: |pytestdeploy:needs: testruns-on: ubuntu-latestif: github.ref == 'refs/heads/main'steps:- uses: actions/checkout@v2- name: Build Docker imagerun: docker build -t django-app .- name: Log in to Docker Hubrun: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin- name: Push Docker imagerun: |docker tag django-app your-username/django-app:latestdocker push your-username/django-app:latest- name: Deploy to Kubernetesrun: |kubectl apply -f k8s/

https://www.redhat.com/cms/managed-files/ci-cd-flow-desktop-2.png

监控与日志

Prometheus监控配置

python

复制

下载

# prometheus_client示例
from prometheus_client import start_http_server, Counter, Gauge
import random
import time# 定义指标
REQUEST_COUNT = Counter('app_requests_total', 'Total HTTP Requests')
TEMPERATURE = Gauge('app_temperature_celsius', 'Current temperature')def process_request():REQUEST_COUNT.inc()TEMPERATURE.set(random.uniform(18.0, 25.0))if __name__ == '__main__':# 启动指标服务器start_http_server(8000)# 模拟请求while True:process_request()time.sleep(2)

ELK日志收集配置

python

复制

下载

# logging配置示例
import logging
from pythonjsonlogger import jsonloggerdef setup_logging():logger = logging.getLogger()logger.setLevel(logging.INFO)# JSON格式化formatter = jsonlogger.JsonFormatter('%(asctime)s %(levelname)s %(name)s %(message)s')# 控制台处理器console_handler = logging.StreamHandler()console_handler.setFormatter(formatter)logger.addHandler(console_handler)# 文件处理器file_handler = logging.FileHandler('app.log')file_handler.setFormatter(formatter)logger.addHandler(file_handler)return loggerlogger = setup_logging()
logger.info("Application started", extra={"user": "admin", "module": "startup"})

https://www.elastic.co/guide/en/elasticsearch/reference/current/images/elas_0201.png

微服务架构

FastAPI微服务示例

python

复制

下载

from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: floatis_offer: bool = None@app.get("/")
def read_root():return {"Hello": "World"}@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):return {"item_id": item_id, "q": q}@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):return {"item_name": item.name, "item_id": item_id}# 运行: uvicorn main:app --reload

服务间通信

python

复制

下载

# 使用requests同步调用
import requestsdef get_user_data(user_id):response = requests.get(f"http://user-service/users/{user_id}",timeout=3)response.raise_for_status()return response.json()# 使用aiohttp异步调用
import aiohttpasync def async_get_user_data(user_id):async with aiohttp.ClientSession() as session:async with session.get(f"http://user-service/users/{user_id}") as response:return await response.json()

https://microservices.io/i/architecture.png

安全最佳实践

JWT认证实现

python

复制

下载

from datetime import datetime, timedelta
import jwt
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearerSECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")def create_access_token(data: dict):to_encode = data.copy()expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)to_encode.update({"exp": expire})encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)return encoded_jwtdef verify_token(token: str = Depends(oauth2_scheme)):try:payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])return payloadexcept jwt.PyJWTError:raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED,detail="Invalid authentication credentials",headers={"WWW-Authenticate": "Bearer"},)# 保护路由
@app.get("/protected")
async def protected_route(payload: dict = Depends(verify_token)):return {"message": "Access granted", "user": payload.get("sub")}

安全头部中间件

python

复制

下载

from fastapi import FastAPI
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware
from fastapi.middleware.trustedhost import TrustedHostMiddleware
from fastapi.middleware.gzip import GZipMiddlewareapp = FastAPI()# 强制HTTPS
app.add_middleware(HTTPSRedirectMiddleware)# 可信主机
app.add_middleware(TrustedHostMiddleware, allowed_hosts=["example.com"])# 安全头部
@app.middleware("http")
async def add_security_headers(request, call_next):response = await call_next(request)response.headers["Strict-Transport-Security"] = "max-age=63072000; includeSubDomains"response.headers["X-Content-Type-Options"] = "nosniff"response.headers["X-Frame-Options"] = "DENY"response.headers["X-XSS-Protection"] = "1; mode=block"response.headers["Content-Security-Policy"] = "default-src 'self'"return response

性能调优

数据库优化

python

复制

下载

# 不良实践 - N+1查询问题
users = User.objects.all()
for user in users:print(user.profile.bio)  # 每次循环都查询数据库# 优化方案 - select_related/prefetch_related
users = User.objects.select_related('profile').all()
for user in users:print(user.profile.bio)  # 仅一次查询# 使用索引
class User(models.Model):name = models.CharField(max_length=100, db_index=True)email = models.EmailField(unique=True)class Meta:indexes = [models.Index(fields=['name', 'email']),]

缓存策略

python

复制

下载

from django.core.cache import cachedef get_expensive_data():# 尝试从缓存获取data = cache.get("expensive_data")if data is None:# 缓存未命中,计算数据data = calculate_expensive_data()# 设置缓存,有效期1小时cache.set("expensive_data", data, timeout=3600)return data# Redis缓存后端配置
CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379/1","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",}}
}

企业级测试策略

测试金字塔实现

python

复制

下载

# 单元测试示例
import unittest
from unittest.mock import Mock, patchclass TestUserService(unittest.TestCase):@patch('services.user_service.UserRepository')def test_create_user(self, mock_repo):mock_repo.return_value.save.return_value = {"id": 1, "name": "test"}result = UserService().create_user("test")self.assertEqual(result["name"], "test")# 集成测试示例
from django.test import TestCaseclass UserAPITest(TestCase):def test_user_creation(self):response = self.client.post('/api/users/', {'name': 'test'})self.assertEqual(response.status_code, 201)self.assertEqual(response.json()['name'], 'test')# E2E测试示例
from selenium import webdriverclass UserJourneyTest(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()def test_user_registration(self):self.driver.get("http://localhost:8000/register")self.driver.find_element_by_id("name").send_keys("test")self.driver.find_element_by_id("submit").click()self.assertIn("Welcome", self.driver.page_source)def tearDown(self):self.driver.quit()

https://martinfowler.com/articles/practical-test-pyramid/test-pyramid.png

结语与职业发展

https://www.python.org/static/community_logos/python-powered-h-140x182.png

通过这六篇系列教程,你已经完成了从Python初学者到企业级开发者的蜕变。接下来可以:

  1. 技术深耕

    • 深入研究Python解释器原理

    • 学习CPython源码

    • 掌握元编程高级技巧

  2. 架构能力

    • 设计高可用分布式系统

    • 优化大规模数据处理流程

    • 实现高效缓存策略

  3. 领域专家

    • 成为AI/ML领域的Python专家

    • 深耕DevOps与云原生Python开发

    • 专精金融科技或生物信息等垂直领域

  4. 社区贡献

    • 参与CPython核心开发

    • 维护开源Python项目

    • 在PyCon等大会分享经验

Python在企业中的应用日益广泛,保持持续学习,你将成为行业中的顶尖人才!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85340.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85340.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/85340.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

E结构体基础.go

前言:结构体是一种用户自定义的数据类型,它可以将多个不同类型的数据整合在一起,形成一个有机的整体。这就好比在现实生活中,我们有各种各样的物品,它们各自有不同的属性和用途,而结构体就像是一个收纳箱&a…

Spring @Autowired 依赖注入全解析

Autowired 是 Spring 框架中实现依赖注入的核心注解,其自动装配过程可分为以下步骤,结合了类型匹配、名称解析和容器协作机制: 1. 组件扫描与 Bean 定义注册 扫描阶段:Spring 容器启动时,通过 ComponentScan 或 XML 配…

将git的普通目录用idea初始化为maven项目

在 IntelliJ IDEA 中将一个已存在的 Git 目录初始化为 Maven 项目,可以通过以下步骤完成。这些步骤假设你已经有一个包含代码的 Git 仓库,并希望将其转换为 Maven 项目结构,以便更好地管理依赖和构建。 步骤 1:打开或导入 Git 仓库…

Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建

一、key 属性的核心作用 在 Vue 中,key是一个特殊的属性,主要用于协助 Vue 的虚拟 DOM(Virtual DOM)算法高效地更新实际 DOM。它的核心作用可以概括为: 唯一标识节点:为每个节点提供一个唯一的身份标识优化 Diff 算法:帮助 Vue 准确判断两个节点是否为同一节点(如for循…

【音视频】PJSIP库——示例简介、C++类说明

1、简介 pjsip库的源码中有很多示例,是入门pjsip的第一手资料,下面将各个示例所演示的功能列举出来,以便下一步学习; 最后总结下C++接口主要类及成员函数说明。 2、示例介绍 2.1 音视频处理 aectest 音频回声消除测试工具,用于演示音频处理模块中的回声消除(AEC)功能…

网站用CDN可以防DDoS和CC攻击吗?

现在市面上常见有两种CDN,加速CDN与高防CDN,这两种的区别还是很大的。 加速CDN: 加速CDN基本上都是共享、无防节点,主要做的是加速,所以价格也会相对较低,大陆地区的CDN都需要备案域名接入使用。 高防CD…

【图片识别改名】批量识别图片中的文字对图片进行改名,识别文字对图片重新命名的操作步骤和注意事项

一、应用场景 快递单号识别与管理:在快递业务中,每天会产生大量的快递面单图片。通过咕嘎OCR批量识别面单上的快递单号等关键信息,并以此对图片进行重命名,方便工作人员快速查询和管理快递包裹的物流信息,提高快递处理…

先理解软件工程,再谈AI辅助研发

摘要: 近期行业内对“AI赋能软件工程”的讨论,大多聚焦于代码生成等局部提效,这是一种危险的短视。本文旨在纠正将“软件开发”等同于“编码”的普遍误解,深入探讨软件工程的系统性本质。我们将论证,若缺乏坚实的工程体…

Android软件适配遥控器需求-案例经验分享

不分大屏产品需要有遥控器功能,这里分享部分实战经验 文章目录 前言一、案例部分效果图二、项目基础架构三、焦点基础知识适配遥控器基础-焦点问题焦点管理明确焦点状态布局实现硬编码实现引入第三方自定义组件实现 焦点顺序作用 初始焦点 requestFocus 按键处理获取…

《HTTP权威指南》 第3章 HTTP报文

报文是如何流动的 HTTP报文是在HTTP程序之间发送的数据块。数据块以一些文本形式的元信息开头。 报文方向有:流入、流出、上游、下游。 流入和流出描述事务处理的方向,流入和流出是基于服务器的描述。 流入:客户端发往服务器的请求报文 流…

Kafka 集群架构与高可用方案设计(二)

Kafka 集群架构与高可用方案的优化策略 合理配置参数 在 Kafka 集群的配置中,参数的合理设置对于系统的高可用性和性能表现起着关键作用。例如,min.insync.replicas参数定义了 ISR(In-Sync Replicas,同步副本)集合中…

47-Oracle ASH报告解读

上一期生成了ASH报告后,就需要解读报告关键信息。ASH的使用可以快速定位瞬时性能问题。生产环境的场景时间紧、任务重,但是必须要结合具体业务分析,同时借助其他工具做报告做趋势分析。 一、ASH 技术原理​ ​1. 核心机制​ ​采样原理​&a…

“本地化思维+模块化体验”:一款轻量数据中心监控系统的真实测评

“本地化思维模块化体验”:一款轻量数据中心监控系统的真实测评 在数据中心运维逐步精细化的今天,一款真正贴合本地用户习惯、设计有温度的系统并不多见。近期体验了一款功能全面、逻辑清晰的监控平台,给人留下了深刻印象。并不是广。今天就从…

词编码模型有哪些

词编码模型有哪些 词编码模型在高维向量空间的关系解析与实例说明 如Word2Vec、BERT、Qwen等 一、高维向量空间的基础概念 词编码模型(如Word2Vec、BERT、Qwen等)的核心是将自然语言符号映射为稠密的高维向量,使语义相近的词汇在向量空间中位置接近。以Qwen模型为例,其…

elementui el-select 获取value和label 以及 对象的方法

获取 el-select 的 value 和 label 值 在 Element UI 的 el-select 组件中,可以通过以下方法获取选项的 value 和 label 值。 1、绑定 v-model 获取 value el-select 通常通过 v-model 绑定 value 值,直接访问绑定的变量即可获取当前选中的 value。…

树莓派与嵌入式系统实验报告

一、Linux 系统编译工具链实践:mininim 源码编译 虚拟机 Ubuntu 编译流程 环境配置问题 编译时遇到虚拟机无法联网的情况,通过连接个人热点解决(校园网限制导致无法访问外部资源)。 执行 ./bootstrap 时报错 gnulib-tool: command…

IDEA部署redis测试

新建springboot,项目改为:testredis E:\ideaproject\testredis\src\main\java\org\example\testredis\TestredisApplication.java 代码为: package org.example.testredis;import org.springframework.boot.SpringApplication; import org.…

旅游服务礼仪实训室:从历史演进到未来创新的实践探索

一、旅游服务礼仪实训室的历史演进:从礼制规范到职业化培养 旅游服务礼仪实训室的建设并非一蹴而就,其发展历程与人类对礼仪认知的深化及职业教育体系的完善密切相关。 1. 古代礼仪教育的萌芽 礼仪作为社会行为规范,最早可追溯至中国夏商周…

Could not find a declaration file for module ‘..XX‘.

1. 添加 Vue 声明文件 如果您还没有为 .vue 文件创建类型声明,可以通过创建一个新的类型声明文件来解决该问题。 步骤: 在您的项目根目录下创建一个名为 shims-vue.d.ts 的文件(您可以选择其他名称,但建议使用常见名称以便于识…

OpenCV CUDA模块设备层-----反正切(arctangent)函数atan()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 对输入的 uchar1 像素值(范围 [0, 255]),先归一化到 [0.0, 1.0] 浮点区间,然后计算其反正切值 at…