Python3+Flask 開發(fā)部署web項目

開發(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
      

服務器環(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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容