最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python Flask實(shí)現(xiàn)多文件項目打包部署(Linux+Docker+Windows全環(huán)境)指南

 更新時間:2026年01月30日 09:50:19   作者:Hui  Baby  
針對多?.py?文件的 Flask 項目,本文在原有部署方案基礎(chǔ)上,補(bǔ)充多文件項目結(jié)構(gòu)規(guī)范、Windows 環(huán)境部署、跨平臺打包等核心內(nèi)容,有需要的小伙伴可以了解下

針對多 .py 文件的 Flask 項目,本文在原有部署方案基礎(chǔ)上,補(bǔ)充多文件項目結(jié)構(gòu)規(guī)范、Windows 環(huán)境部署、跨平臺打包等核心內(nèi)容,確保多文件項目在 Linux/Docker/Windows 下都能穩(wěn)定運(yùn)行。

一、先規(guī)范多文件項目結(jié)構(gòu)(核心前提)

多 .py 文件的關(guān)鍵是模塊化拆分 + 避免循環(huán)導(dǎo)入 + 統(tǒng)一入口,示例結(jié)構(gòu)如下(覆蓋工具類、多藍(lán)圖、配置分層):

plaintext

flask-multi-api/
├── app/                  # 核心代碼包
│   ├── __init__.py       # 應(yīng)用工廠(核心)
│   ├── api/              # 接口模塊(多藍(lán)圖)
│   │   ├── __init__.py
│   │   ├── user.py       # 用戶相關(guān)接口
│   │   └── order.py      # 訂單相關(guān)接口
│   ├── utils/            # 工具類(多py文件)
│   │   ├── __init__.py
│   │   ├── common.py     # 通用工具(加密、校驗(yàn))
│   │   └── db.py         # 數(shù)據(jù)庫操作
│   └── config/           # 配置分層(跨環(huán)境)
│       ├── __init__.py
│       ├── base.py       # 基礎(chǔ)配置(通用)
│       ├── dev.py        # 開發(fā)環(huán)境(Windows)
│       ├── prod.py       # 生產(chǎn)環(huán)境(Linux/Docker)
│       └── win.py        # Windows 特有配置
├── run.py                # 統(tǒng)一啟動入口
├── requirements.txt      # 依賴清單(跨平臺)
├── Dockerfile            # Docker 構(gòu)建文件
├── .dockerignore         # Docker 忽略文件
├── start.bat             # Windows 啟動腳本
└── supervisord.conf      # Linux 進(jìn)程守護(hù)配置

核心文件示例(多文件關(guān)鍵)

app/__init__.py(應(yīng)用工廠,解決多模塊導(dǎo)入)

from flask import Flask
import os

def create_app(env: str = None):
    """
    應(yīng)用工廠函數(shù)(支持指定環(huán)境:dev/prod/win)
    :param env: 環(huán)境標(biāo)識(dev=開發(fā)/Windows, prod=生產(chǎn)/Linux)
    """
    app = Flask(__name__)
    
    # 加載配置(根據(jù)環(huán)境自動切換)
    env = env or os.getenv("FLASK_ENV", "dev")
    if env == "dev" or env == "win":
        app.config.from_object("app.config.win")
    elif env == "prod":
        app.config.from_object("app.config.prod")
    else:
        app.config.from_object("app.config.base")
    
    # 注冊多藍(lán)圖(拆分的接口模塊)
    from app.api.user import user_bp
    from app.api.order import order_bp
    app.register_blueprint(user_bp, url_prefix="/api/user")
    app.register_blueprint(order_bp, url_prefix="/api/order")
    
    return app

app/api/user.py(用戶接口模塊,多 py 文件示例)

from flask import Blueprint, jsonify, request
from app.utils.common import encrypt_password  # 導(dǎo)入工具類(多py文件調(diào)用)

user_bp = Blueprint("user", __name__)

# 用戶登錄接口
@user_bp.post("/login")
def login():
    data = request.get_json()
    username = data.get("username")
    password = encrypt_password(data.get("password"))  # 調(diào)用工具類
    return jsonify({
        "code": 200,
        "msg": "登錄成功",
        "data": {"username": username, "token": f"token_{username}"}
    })

# 用戶信息接口
@user_bp.get("/info")
def get_user_info():
    user_id = request.args.get("id")
    return jsonify({
        "code": 200,
        "data": {"id": user_id, "name": "張三", "age": 25}
    })

app/api/order.py(訂單接口模塊,多 py 文件示例)

from flask import Blueprint, jsonify
from app.utils.db import get_order_data  # 導(dǎo)入數(shù)據(jù)庫工具類

order_bp = Blueprint("order", __name__)

# 訂單列表接口
@order_bp.get("/list")
def get_order_list():
    orders = get_order_data()  # 調(diào)用工具類
    return jsonify({
        "code": 200,
        "data": orders
    })

app/utils/common.py(工具類 1)

import hashlib

def encrypt_password(password: str) -> str:
    """密碼加密工具"""
    return hashlib.md5((password + "salt123").encode()).hexdigest()

def check_params(params: dict, required: list) -> bool:
    """參數(shù)校驗(yàn)工具"""
    return all([p in params for p in required])

app/utils/db.py(工具類 2,數(shù)據(jù)庫示例)

def get_order_data():
    """模擬數(shù)據(jù)庫查詢訂單數(shù)據(jù)"""
    return [
        {"order_id": "1001", "amount": 99.9, "status": "paid"},
        {"order_id": "1002", "amount": 199.9, "status": "unpaid"}
    ]

app/config/win.py(Windows 環(huán)境配置)

DEBUG = True  # Windows 開發(fā)環(huán)境開啟DEBUG
HOST = "127.0.0.1"  # Windows 本地訪問
PORT = 5000
SECRET_KEY = "win-secret-key-123"
# Windows 特有配置(如本地數(shù)據(jù)庫路徑)
DB_PATH = "C:/flask-api/data.db"

app/config/prod.py(Linux 生產(chǎn)環(huán)境配置)

DEBUG = False  # 生產(chǎn)環(huán)境關(guān)閉DEBUG
HOST = "0.0.0.0"  # 允許外部訪問
PORT = 5000
SECRET_KEY = "prod-secret-key-456"
# Linux 特有配置(如服務(wù)器數(shù)據(jù)庫地址)
DB_PATH = "/opt/flask-api/data.db"

run.py(統(tǒng)一啟動入口)

import sys
from app import create_app

if __name__ == "__main__":
    # 識別運(yùn)行環(huán)境(Windows/Linux)
    env = "win" if sys.platform == "win32" else "prod"
    # 手動指定環(huán)境:python run.py prod
    if len(sys.argv) > 1:
        env = sys.argv[1]
    
    app = create_app(env=env)
    app.run(
        host=app.config["HOST"],
        port=app.config["PORT"],
        debug=app.config["DEBUG"]
    )

requirements.txt(跨平臺依賴)

# 核心依賴(跨平臺兼容)
Flask==2.3.3
gunicorn==21.2.0  # Linux/Docker用(Windows可選)
waitress==2.1.2   # Windows替代Gunicorn的WSGI服務(wù)器
requests==2.31.0
pywin32>=306      # Windows 進(jìn)程守護(hù)(可選)
supervisor==4.2.5 # Linux 進(jìn)程守護(hù)(Windows也可裝)

二、Windows 環(huán)境部署(多文件項目)

Windows 部署分開發(fā)環(huán)境(本地調(diào)試) 和生產(chǎn)環(huán)境(服務(wù)運(yùn)行) 兩種場景,重點(diǎn)解決 “多文件導(dǎo)入”“進(jìn)程守護(hù)”“端口占用” 問題。

步驟 1:Windows 環(huán)境準(zhǔn)備

安裝 Python 3.8+(勾選 “Add Python to PATH”);

驗(yàn)證環(huán)境:

python --version  # 或 python3 --version
pip --version

解壓 / 克隆項目到本地(如 D:\flask-multi-api)。

步驟 2:創(chuàng)建虛擬環(huán)境(隔離依賴)

# 進(jìn)入項目目錄
cd D:\flask-multi-api
# 創(chuàng)建虛擬環(huán)境
python -m venv venv
# 激活虛擬環(huán)境(Windows 命令行)
venv\Scripts\activate.bat
# 如果是PowerShell,執(zhí)行:
# venv\Scripts\Activate.ps1
# 安裝依賴
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

步驟 3:本地調(diào)試運(yùn)行(開發(fā)環(huán)境)

# 方式1:直接啟動(自動識別Windows環(huán)境)
python run.py

# 方式2:手動指定win環(huán)境
python run.py win

測試接口(瀏覽器 / Postman/curl):

# 測試用戶接口
curl "http://127.0.0.1:5000/api/user/info?id=1"
# 測試訂單接口
curl "http://127.0.0.1:5000/api/order/list"

步驟 4:Windows 生產(chǎn)環(huán)境部署(后臺運(yùn)行 + 進(jìn)程守護(hù))

Flask 內(nèi)置服務(wù)器不適合生產(chǎn),Windows 用 waitress 替代 Gunicorn,結(jié)合 Supervisor 或 NSSM 實(shí)現(xiàn)后臺運(yùn)行。

方案 1:Waitress + Supervisor(推薦)

安裝 Supervisor(Windows 版):

pip install supervisor

創(chuàng)建 supervisord.conf 配置文件(項目根目錄):

[unix_http_server]
file = NUL  # Windows 無需unix socket

[inet_http_server]
port = 127.0.0.1:9001  # Supervisor 管理端口
username = admin
password = 123456

[supervisord]
logfile = D:\flask-multi-api\logs\supervisord.log
logfile_maxbytes = 50MB
logfile_backups = 10
loglevel = info
pidfile = D:\flask-multi-api\supervisord.pid
nodaemon = false  # 后臺運(yùn)行
minfds = 1024
minprocs = 200
environment = FLASK_ENV="win"

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl = http://127.0.0.1:9001

# Flask 應(yīng)用配置
[program:flask-api]
directory = D:\flask-multi-api
command = D:\flask-multi-api\venv\Scripts\waitress-serve.exe --host=0.0.0.0 --port=5000 run:create_app('win')
autostart = true
autorestart = true
startretries = 3
stdout_logfile = D:\flask-multi-api\logs\flask-api.log
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups = 10
redirect_stderr = true

創(chuàng)建日志目錄:

mkdir D:\flask-multi-api\logs

啟動 Supervisor:

# 生成默認(rèn)配置(可選)
echo_supervisord_conf > supervisord.conf
# 啟動Supervisor
supervisord -c supervisord.conf
# 管理命令
supervisorctl -c supervisord.conf status  # 查看狀態(tài)
supervisorctl -c supervisord.conf start flask-api  # 啟動應(yīng)用
supervisorctl -c supervisord.conf restart flask-api  # 重啟

方案 2:NSSM(將 Flask 注冊為 Windows 服務(wù))

下載 NSSM,解壓到 D:\nssm;

注冊為 Windows 服務(wù):

# 進(jìn)入NSSM目錄
cd D:\nssm\win64
# 注冊服務(wù)(名稱:FlaskAPI)
nssm install FlaskAPI D:\flask-multi-api\venv\Scripts\python.exe
# 設(shè)置服務(wù)參數(shù)
nssm set FlaskAPI AppParameters "run.py win"
nssm set FlaskAPI AppDirectory D:\flask-multi-api
nssm set FlaskAPI Start SERVICE_AUTO_START  # 開機(jī)自啟
nssm set FlaskAPI AppStdout D:\flask-multi-api\logs\stdout.log
nssm set FlaskAPI AppStderr D:\flask-multi-api\logs\stderr.log

啟動 / 管理服務(wù):

nssm start FlaskAPI  # 啟動
nssm stop FlaskAPI   # 停止
nssm restart FlaskAPI # 重啟
nssm remove FlaskAPI confirm  # 卸載

步驟 5:Windows 端口占用排查

# 查看5000端口占用
netstat -ano | findstr :5000
# 殺死占用進(jìn)程(PID替換為實(shí)際值)
taskkill /F /PID 1234

三、Linux 環(huán)境部署(多文件項目)

在原有 Linux 部署基礎(chǔ)上,適配多文件結(jié)構(gòu),核心步驟不變,僅補(bǔ)充細(xì)節(jié):

步驟 1:上傳多文件項目到 Linux

# 創(chuàng)建目錄
mkdir -p /opt/flask-multi-api
# 上傳項目(用scp/rz/git)
scp -r D:\flask-multi-api root@<LinuxIP>:/opt/
cd /opt/flask-multi-api

步驟 2:虛擬環(huán)境 + 依賴安裝

python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

步驟 3:Gunicorn 啟動(多文件兼容)

# 直接啟動(自動識別Linux環(huán)境)
gunicorn -w 4 -b 0.0.0.0:5000 "run:create_app('prod')"

步驟 4:Supervisor 配置(適配多文件)

修改 /etc/supervisord.d/flask-api.ini

[program:flask-api]
directory=/opt/flask-multi-api
command=/opt/flask-multi-api/venv/bin/gunicorn -w 4 -b 0.0.0.0:5000 "run:create_app('prod')"
autostart=true
autorestart=true
user=root
stdout_logfile=/var/log/flask-api.log

重啟 Supervisor:

supervisorctl reload
supervisorctl start flask-api

四、Docker 部署(跨平臺多文件項目)

Docker 部署可統(tǒng)一 Windows/Linux 環(huán)境,核心是優(yōu)化 Dockerfile 適配多文件結(jié)構(gòu),支持跨平臺構(gòu)建。

步驟 1:優(yōu)化 Dockerfile(多文件兼容)

# 基礎(chǔ)鏡像(跨平臺兼容)
FROM python:3.9-slim

# 設(shè)置工作目錄
WORKDIR /app

# 環(huán)境變量(生產(chǎn)環(huán)境)
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV FLASK_ENV=prod

# 安裝系統(tǒng)依賴
RUN apt update && apt install -y --no-install-recommends gcc \
    && rm -rf /var/lib/apt/lists/*

# 復(fù)制依賴清單
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 復(fù)制所有多文件代碼(關(guān)鍵:保留目錄結(jié)構(gòu))
COPY . .

# 暴露端口
EXPOSE 5000

# 啟動命令(多文件入口)
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "run:create_app('prod')"]

步驟 2:Windows 下構(gòu)建 Docker 鏡像

安裝 Docker Desktop(Windows),開啟 WSL2 后端;

進(jìn)入項目目錄,構(gòu)建鏡像:

docker build -t flask-multi-api:v1 .

步驟 3:啟動 Docker 容器(跨平臺通用)

# Windows/Linux 通用命令
docker run -d \
  --name flask-multi-api \
  -p 5000:5000 \
  --restart=always \
  -v /var/log/flask-api:/app/logs \  # 掛載日志(Linux)
  # Windows 掛載日志:-v D:\flask-multi-api\logs:/app/logs
  flask-multi-api:v1

步驟 4:Docker Compose(多容器 + 多文件)

編寫 docker-compose.yml

version: '3.8'
services:
  flask-api:
    build: .
    ports:
      - "5000:5000"
    restart: always
    volumes:
      - ./logs:/app/logs  # 掛載日志(跨平臺)
    environment:
      - FLASK_ENV=prod
    networks:
      - flask-network

networks:
  flask-network:
    driver: bridge

啟動:

# Windows
docker-compose up -d
# Linux
docker-compose up -d

五、多文件項目部署關(guān)鍵注意事項

導(dǎo)入路徑問題

  • 確保所有 .py 文件所在目錄有 __init__.py(空文件也可);
  • 避免相對導(dǎo)入,統(tǒng)一用絕對導(dǎo)入(如 from app.utils.common import xxx)。

跨平臺配置

  • 通過 FLASK_ENV 環(huán)境變量區(qū)分 Windows/Linux 配置;
  • 路徑用 os.path 或 pathlib 適配(避免硬編碼 C:/ 或 /opt/)。

依賴跨平臺兼容

避免依賴僅支持單一系統(tǒng)(如 pywin32 僅 Windows,在 Linux/Docker 中跳過);

requirements.txt 中可通過 ; sys_platform == "win32" 區(qū)分依賴:

pywin32>=306 ; sys_platform == "win32"
gunicorn==21.2.0 ; sys_platform != "win32"
waitress==2.1.2 ; sys_platform == "win32"

Docker 跨平臺構(gòu)建

  • Windows 下構(gòu)建 Linux 鏡像:開啟 Docker Desktop 的 “Buildx” 功能;
  • 避免在 Dockerfile 中使用 Windows 特有命令(如 COPY C:/xxx)。

日志持久化:多文件項目日志需統(tǒng)一目錄,Docker/Windows/Linux 均掛載日志目錄,避免日志丟失。

六、常見問題排查(多文件 + 跨平臺)

問題場景原因解決方案
多文件導(dǎo)入報錯 ModuleNotFoundError缺少 __init__.py 或?qū)肼窂藉e誤給所有包目錄加 __init__.py,使用絕對導(dǎo)入
Windows 啟動 Supervisor 報錯路徑用了 / 而非 \配置文件中路徑用 D:\xxx 或 /d/xxx
Docker 構(gòu)建失敗(多文件)復(fù)制時遺漏目錄COPY . . 確保復(fù)制所有目錄,檢查 .dockerignore 未忽略核心文件
Linux 下 Gunicorn 啟動報錯 create_app not found入口函數(shù)調(diào)用格式錯誤用雙引號包裹:"run:create_app('prod')"
Windows 服務(wù)啟動后無響應(yīng)Waitress 命令錯誤檢查 waitress-serve 路徑,確保調(diào)用 create_app 返回 app 實(shí)例

通過以上方案,多 .py 文件的 Flask 項目可在 Windows(開發(fā) / 生產(chǎn))、Linux(生產(chǎn))、Docker(跨平臺)下穩(wěn)定部署,兼顧模塊化拆分和環(huán)境適配。

init.py 的核心作用與使用場景詳解

在 Python 項目(尤其是 Flask 多文件項目)中,__init__.py 是包(Package) 的核心標(biāo)識文件,理解它的作用能徹底解決多文件導(dǎo)入、模塊化拆分的問題。以下從「核心作用」「實(shí)戰(zhàn)場景」「常見誤區(qū)」三個維度講清楚:

init.py 的核心作用(為什么必須有)

Python 中「目錄」和「包」的唯一區(qū)別就是是否有 __init__.py —— 沒有這個文件,目錄只是普通文件夾,無法被 import;有了它,目錄才會被識別為Python 包,支持模塊化導(dǎo)入。

作用 1:標(biāo)記目錄為 Python 包(最基礎(chǔ))

# 無 __init__.py 的情況(普通文件夾)
flask-api/
└── app/          # 普通文件夾,無法 import
    ├── user.py
    └── order.py

# 導(dǎo)入報錯(Python 不識別 app 為包)
from app import user  # ModuleNotFoundError: No module named 'app'
# 有 __init__.py 的情況(包)
flask-api/
└── app/          # Python 包
    ├── __init__.py  # 空文件也生效
    ├── user.py
    └── order.py

# 導(dǎo)入成功
from app import user
from app.user import user_bp

作用 2:控制包的導(dǎo)出(簡化導(dǎo)入)

如果直接讓用戶導(dǎo)入 app/user.py 里的 user_bp,路徑太長且暴露內(nèi)部結(jié)構(gòu);可以在 app/__init__.py 中「導(dǎo)出」常用對象,讓導(dǎo)入更簡潔。

示例:簡化多文件導(dǎo)入

# app/__init__.py
# 從子模塊導(dǎo)出核心對象
from app.user import user_bp
from app.order import order_bp
from app.utils.common import encrypt_password

# 定義 __all__(配合 from app import * 時生效)
__all__ = ["user_bp", "order_bp", "encrypt_password"]
# 外部導(dǎo)入(簡化前)
from app.user import user_bp
from app.order import order_bp
from app.utils.common import encrypt_password

# 外部導(dǎo)入(簡化后)
from app import user_bp, order_bp, encrypt_password
# 或
from app import *  # 僅導(dǎo)入 __all__ 中的對象

作用 3:初始化包的資源(統(tǒng)一加載)

__init__.py 在包被導(dǎo)入時自動執(zhí)行,可以在這里完成包的初始化邏輯(如加載配置、初始化數(shù)據(jù)庫、注冊藍(lán)圖等)—— 這也是 Flask 多文件項目的核心用法。

示例:Flask 應(yīng)用工廠(核心實(shí)戰(zhàn))

# app/__init__.py
from flask import Flask
import os

# 包導(dǎo)入時自動執(zhí)行的初始化邏輯
def create_app(env: str = None):
    app = Flask(__name__)
    
    # 加載配置
    env = env or os.getenv("FLASK_ENV", "dev")
    if env == "prod":
        app.config.from_object("app.config.prod")
    else:
        app.config.from_object("app.config.dev")
    
    # 統(tǒng)一注冊所有藍(lán)圖(無需在 run.py 中逐個導(dǎo)入)
    from app.user import user_bp
    from app.order import order_bp
    app.register_blueprint(user_bp, url_prefix="/api/user")
    app.register_blueprint(order_bp, url_prefix="/api/order")
    
    return app

# 可選:初始化數(shù)據(jù)庫連接(全局生效)
from app.utils.db import init_db
init_db()
# run.py(只需導(dǎo)入 create_app,無需關(guān)心內(nèi)部模塊)
from app import create_app

app = create_app()
app.run()

作用 4:解決循環(huán)導(dǎo)入問題

多文件項目最容易遇到「循環(huán)導(dǎo)入」(如 user.py 導(dǎo)入 db.py,db.py 又導(dǎo)入 user.py),通過 __init__.py 延遲導(dǎo)入可解決。

示例:解決循環(huán)導(dǎo)入

# 問題場景:循環(huán)導(dǎo)入
# app/user.py
from app.utils.db import db  # 導(dǎo)入 db
db.add_user(...)

# app/utils/db.py
from app.user import user_bp  # 又導(dǎo)入 user_bp → 循環(huán)導(dǎo)入報錯
# 解決方案:在 __init__.py 中延遲導(dǎo)入
# app/__init__.py
def create_app():
    app = Flask(__name__)
    
    # 延遲導(dǎo)入(直到函數(shù)調(diào)用時才導(dǎo)入,避免初始化時循環(huán))
    from app.user import user_bp
    from app.utils.db import init_db
    
    init_db(app)  # 把 app 傳入 db 模塊,避免 db 導(dǎo)入 user
    app.register_blueprint(user_bp)
    return app

作用 5:定義包的元數(shù)據(jù)(可選)

可以在 __init__.py 中定義包的版本、作者等元數(shù)據(jù),方便外部調(diào)用。

# app/__init__.py
__version__ = "1.0.0"
__author__ = "xxx"
__description__ = "Flask 多文件 API 項目"
# 外部獲取元數(shù)據(jù)
import app
print(app.__version__)  # 1.0.0
print(app.__author__)   # xxx

不同場景下init.py 的寫法

場景init.py 寫法說明
僅標(biāo)記為包空文件最簡單,僅讓目錄可導(dǎo)入
簡化導(dǎo)入導(dǎo)出子模塊對象 + 定義 all外部導(dǎo)入更簡潔
Flask 項目核心包編寫應(yīng)用工廠函數(shù) + 統(tǒng)一注冊藍(lán)圖 / 初始化資源多文件項目的標(biāo)準(zhǔn)用法
工具類包導(dǎo)出常用工具函數(shù) + 初始化全局資源如 utils/init.py
避免循環(huán)導(dǎo)入延遲導(dǎo)入(在函數(shù)內(nèi)部導(dǎo)入子模塊)解決多文件依賴問題

常見誤區(qū)(避坑)

誤區(qū) 1:Python 3.3+ 不需要init.py?

Python 3.3 引入了「隱式命名空間包」,即使沒有 __init__.py,也能導(dǎo)入目錄;但:

  • 兼容性差(低版本 Python 不支持);
  • 無法控制導(dǎo)出、初始化資源、解決循環(huán)導(dǎo)入;
  • Flask/Django 等框架的工程化實(shí)踐中,仍要求必須有 __init__.py(保證項目規(guī)范)。

誤區(qū) 2:所有init.py 都要寫復(fù)雜邏輯?

不是!子包的 __init__.py 可以是空文件(僅標(biāo)記為包),只有「根包」(如 app/__init__.py)需要寫初始化邏輯。

示例:合理的分層寫法

app/
├── __init__.py  # 核心邏輯(應(yīng)用工廠、藍(lán)圖注冊)
├── user.py
├── order.py
└── utils/       # 子包
    ├── __init__.py  # 空文件(僅標(biāo)記為包)
    ├── common.py
    └── db.py

誤區(qū) 3:init.py 執(zhí)行多次?

__init__.py 僅在包第一次被導(dǎo)入時執(zhí)行一次,后續(xù)導(dǎo)入會復(fù)用已加載的模塊(Python 模塊緩存機(jī)制),無需擔(dān)心性能問題。

總結(jié)

核心結(jié)論通俗解釋
為什么要有?讓普通目錄變成「Python 包」,支持導(dǎo)入
空文件行不行?行(僅滿足基礎(chǔ)導(dǎo)入),但工程化項目建議寫邏輯
Flask 項目中核心作用?統(tǒng)一初始化應(yīng)用、注冊藍(lán)圖、簡化導(dǎo)入、解決循環(huán)依賴
哪些目錄需要?所有需要被 import 的目錄(如 app/、app/utils/)

簡單來說:__init__.py 是 Python 模塊化的「入口門牌號」—— 沒有它,Python 找不到你的代碼;有了它,你還能控制代碼怎么被找到、怎么初始化。

到此這篇關(guān)于Python Flask實(shí)現(xiàn)多文件項目打包部署(Linux+Docker+Windows全環(huán)境)指南的文章就介紹到這了,更多相關(guān)Python Flask打包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解python常用命令行選項與環(huán)境變量

    詳解python常用命令行選項與環(huán)境變量

    這篇文章主要介紹了python常用命令行選項與環(huán)境變量,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • python中eval函數(shù)使用與異常處理詳解

    python中eval函數(shù)使用與異常處理詳解

    這篇文章主要給大家介紹了關(guān)于python中eval函數(shù)使用與異常處理的相關(guān)資料,eval()函數(shù)用來執(zhí)行一個字符串表達(dá)式,并返回表達(dá)式的值,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • Python中MySQL監(jiān)控與日志配置實(shí)戰(zhàn)指南

    Python中MySQL監(jiān)控與日志配置實(shí)戰(zhàn)指南

    這篇文章主要為大家詳細(xì)介紹了Python中MySQL監(jiān)控與日志配置的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-12-12
  • 使用Python進(jìn)行SSH和文件傳輸實(shí)現(xiàn)方法實(shí)例

    使用Python進(jìn)行SSH和文件傳輸實(shí)現(xiàn)方法實(shí)例

    這篇文章主要為大家介紹了使用Python進(jìn)行SSH和文件傳輸實(shí)現(xiàn)方法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Python?matplotlib繪圖時使用鼠標(biāo)滾輪放大/縮小圖像

    Python?matplotlib繪圖時使用鼠標(biāo)滾輪放大/縮小圖像

    Matplotlib是Python程序員可用的事實(shí)上的繪圖庫,雖然它比交互式繪圖庫在圖形上更簡單,但它仍然可以一個強(qiáng)大的工具,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib繪圖時使用鼠標(biāo)滾輪放大/縮小圖像的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • pywinauto自動化操作記事本

    pywinauto自動化操作記事本

    這篇文章主要為大家詳細(xì)介紹了pywinauto自動化操作記事本,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • python實(shí)現(xiàn)階乘的三種方法

    python實(shí)現(xiàn)階乘的三種方法

    階乘是基斯頓·卡曼于 1808 年發(fā)明的運(yùn)算符號,是數(shù)學(xué)術(shù)語,一個正整數(shù)的階乘(factorial)是所有小于及等于該數(shù)的正整數(shù)的積,并且0的階乘為1,本文給大家介紹了python實(shí)現(xiàn)階乘的三種方法,通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 聊聊Python代碼中if?__name__?==?‘__main__‘的作用是什么

    聊聊Python代碼中if?__name__?==?‘__main__‘的作用是什么

    一個python文件通常有兩種使用方法,第一是作為腳本直接執(zhí)行,第二是 import 到其他的python腳本中被調(diào)用執(zhí)行,這篇文章主要給大家介紹了關(guān)于Python代碼中if?__name__?==?‘__main__‘的作用是什么的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Pytorch搭建SRGAN平臺提升圖片超分辨率

    Pytorch搭建SRGAN平臺提升圖片超分辨率

    這篇文章主要為大家介紹了Pytorch搭建SRGAN平臺提升圖片超分辨率,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • pycharm 取消默認(rèn)的右擊運(yùn)行unittest的方法

    pycharm 取消默認(rèn)的右擊運(yùn)行unittest的方法

    今天小編就為大家分享一篇pycharm 取消默認(rèn)的右擊運(yùn)行unittest的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11

最新評論

巴彦淖尔市| 桂阳县| 高邮市| 浙江省| 高密市| 南乐县| 利川市| 诏安县| 吴江市| 敦煌市| 佛山市| 岱山县| 油尖旺区| 雅江县| 宁南县| 洛南县| 慈溪市| 建阳市| 射阳县| 泰来县| 文安县| 新干县| 磴口县| 根河市| 星子县| 双鸭山市| 八宿县| 精河县| 望谟县| 穆棱市| 江北区| 崇仁县| 合山市| 大洼县| 昌江| 镇安县| 柳河县| 延安市| 龙游县| 玉溪市| 宁德市|