开发
创建项目
创建目录结构

image-20260112111932389.png
创建虚拟环境
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
执行命令安装依赖库:
pip install -r requirements.txt
现有项目生成完整的依赖文件:
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)
打包
离线环境准备
-
在本地模拟服务器环境(只有在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
项目打包与传输
-
压缩项目目录(排除虚拟环境和缓存文件):
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(如果服务器可临时连接)传输:
服务器环境配置
安装 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(生产环境推荐)
-
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; } }
直接运行(开发模式)
bash复制代码
export FLASK_APP=app.py
flask run --host=0.0.0.0 --port=5000
pyinstaller打包
pip install pyinstaller
pyinstaller --onefile run.py