開發(fā)
創(chuàng)建項目
創(chuàng)建目錄結構

image-20260112111932389.png
創(chuàng)建虛擬環(huán)境
python3 -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
安裝依賴
requirements.txt 文件內容如下:
Flask==3.0.0
Flask-SQLAlchemy==3.0.5
Flask-Migrate==4.0.5
PyMySQL==1.0.2
執(zhí)行命令安裝依賴庫:
pip install -r requirements.txt
現(xiàn)有項目生成完整的依賴文件:
pip freeze > requirements.txt
配置文件 config.py
import os
class Config:
# SECRET_KEY = os.environ.get("SECRET_KEY") or "123"
SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL") or "mysql+pymysql://root:pwd@ip:port/test"
SQLALCHEMY_TRACK_MODIFICATIONS = False
擴展定義 app/extensions.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
應用工廠 app/init.py
from flask import Flask
from app.extensions import db
import config
from app.views.auth import auth_bp
def create_app():
app = Flask(__name__)
app.config.from_object(config.Config)
db.init_app(app)
# 注冊藍圖
app.register_blueprint(auth_bp)
return app
模型定義 app/models/user.py
from app.extensions import db
from datetime import datetime
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True, nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
def __repr__(self):
return f'<User {self.name}>'
def to_dict(self):
return {
'id': self.id,
'name': self.name
}
路由/視圖 app/views/auth.py
from flask import Blueprint, jsonify, request
from app.models.user import User
from app.extensions import db
auth_bp = Blueprint('auth', __name__, url_prefix="/auth")
@auth_bp.route('/items', methods=['GET'])
def get_items():
items = User.query.all()
return jsonify([item.to_dict() for item in items])
@auth_bp.route('/items/<int:id>', methods=['GET'])
def get_item(id):
item = User.query.get_or_404(id)
return jsonify(item.to_dict())
@auth_bp.route('/items', methods=['POST'])
def create_item():
data = request.get_json() or {}
if 'name' not in data:
return jsonify({'error': 'name is required'}), 400
item = User()
item.name = data['name']
db.session.add(item)
db.session.commit()
return jsonify(item.to_dict()), 200
@auth_bp.route('/items/<int:id>', methods=['POST'])
def update_item(id):
item = User.query.get_or_404(id)
data = request.get_json() or {}
if 'name' in data:
item.name = data['name']
db.session.commit()
return jsonify(item.to_dict())
@auth_bp.route('/items/<int:id>', methods=['DELETE'])
def delete_items(id):
item = User.query.get_or_404(id)
db.session.delete(item)
db.session.commit()
return jsonify({'message': 'Item deleted'}), 200
啟動腳本 run.py
from app import create_app
app = create_app()
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
打包
離線環(huán)境準備
-
在本地模擬服務器環(huán)境(只有在linux上下載的包才能在linux上使用)
使用 Docker 或虛擬機安裝與目標服務器相同版本的 Linux(如 Ubuntu 20.04)。
確保 Python 版本一致(例如 Python 3.8)
-
導出項目依賴列表
pip freeze > requirements.txt
-
下載所有依賴到本地文件夾(例如 ./offline_packages)
pip download -r requirements.txt -d ./offline_packages
項目打包與傳輸
-
壓縮項目目錄(排除虛擬環(huán)境和緩存文件):
tar -czvf flask_project.tar.gz ./flask_project --exclude=venv --exclude=__pycache__ -
傳輸到離線服務器
- 通過 U 盤、內網 FTP 或scp(如果服務器可臨時連接)傳輸:
scp flask_project.tar.gz user@server_ip:/path/to/target - 在服務器解壓:
tar -xzvf flask_project.tar.gz -C /opt/flask_project
- 通過 U 盤、內網 FTP 或scp(如果服務器可臨時連接)傳輸:
服務器環(huán)境配置
安裝 Python
-
若服務器無 Python,需離線安裝:
從 Python 官網下載對應版本的二進制包(如
Python-3.8.12.tgz)。-
編譯安裝:
tar -xzvf Python-3.8.12.tgz cd Python-3.8.12 ./configure --prefix=/usr/local/python3 make && make install
安裝 Python 依賴
將本地下載的 offline_packages 文件夾復制到服務器,手動安裝:
pip install --no-index --find-links=./offline_packages -r requirements.txt
修改 Flask 配置
確保 config.py 或 .env 中的數據庫連接指向服務器地址:
# 示例配置
SQLALCHEMY_DATABASE_URI = 'mysql://root:password@localhost/flask_db'
部署 Flask 應用
使用 Gunicorn + Nginx(生產環(huán)境推薦)
-
Gunicorn
離線安裝(需提前下載包):
pip install --no-index --find-links=./offline_packages gunicorn -
啟動 Gunicorn:
gunicorn -w 4 -b 127.0.0.1:5000 app:app -
Nginx
離線安裝后配置反向代理:
server { listen 80; server_name your_domain.com; location / { proxy_pass http://127.0.0.1:5000; } }
直接運行(開發(fā)模式)
bash復制代碼
export FLASK_APP=app.py
flask run --host=0.0.0.0 --port=5000
pyinstaller打包
pip install pyinstaller
pyinstaller --onefile run.py