Python Flask實(shí)現(xiàn)多文件項目打包部署(Linux+Docker+Windows全環(huán)境)指南
針對多 .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中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í)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Python?matplotlib繪圖時使用鼠標(biāo)滾輪放大/縮小圖像
Matplotlib是Python程序員可用的事實(shí)上的繪圖庫,雖然它比交互式繪圖庫在圖形上更簡單,但它仍然可以一個強(qiáng)大的工具,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib繪圖時使用鼠標(biāo)滾輪放大/縮小圖像的相關(guān)資料,需要的朋友可以參考下2022-05-05
聊聊Python代碼中if?__name__?==?‘__main__‘的作用是什么
一個python文件通常有兩種使用方法,第一是作為腳本直接執(zhí)行,第二是 import 到其他的python腳本中被調(diào)用執(zhí)行,這篇文章主要給大家介紹了關(guān)于Python代碼中if?__name__?==?‘__main__‘的作用是什么的相關(guān)資料,需要的朋友可以參考下2022-03-03
pycharm 取消默認(rèn)的右擊運(yùn)行unittest的方法
今天小編就為大家分享一篇pycharm 取消默認(rèn)的右擊運(yùn)行unittest的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11

