Python3+Flask 开发部署web项目

开发

创建项目

创建目录结构
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
      

服务器环境配置

安装 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容