首页 > 数据库 >flask-docker更新(mysql更新为容器)

flask-docker更新(mysql更新为容器)

时间:2024-09-09 22:52:32浏览次数:9  
标签:flask app db 更新 python mysql import docker


前言

之前用docker编写了一个flask的简单demo,但是里面的mysql用的本地的,当时是自己偷懒用了本地的,现在空余时间重新处理了mysql容器重新更新一下

一、docker-compose.yml示例

version: '3'

services:
  flask:
    build:
      context: ./app
    container_name: flask
    ports:
      - "5001:5000" # Flask's internal port mapped to host port 5001
    volumes:
      - D:\python\app:/home/app
    environment:
      PYTHONUNBUFFERED: 'true'
      DATABASE_URL: mysql://python:python_123456@mysql:3306/python_db
      REDIS_URL: redis://redis:6379/0
    networks:
      - app_network

  nginx:
    build:
      context: ./nginx
    container_name: nginx
    ports:
      - "5000:5000" # Nginx's internal port 5000 mapped to host port 5000
    depends_on:
      - flask
    volumes:
      - ./nginx/conf:/etc/nginx/conf.d
    networks:
      - app_network
  # 容器mysql
  mysql:
    build:
      context: ./mysql
    container_name: mysql
    ports:
      - "3307:3306" # MySQL's internal port 3306 mapped to host port 3307
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf:/etc/mysql/conf.d
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: python_db
      MYSQL_USER: python
      MYSQL_PASSWORD: python_123456
    networks:
      - app_network

  redis:
    build:
      context: ./redis
    container_name: redis
    ports:
      - "6380:6379" # Redis's internal port 6379 mapped to host port 6380

  supervisord:
    build:
      context: ./supervisord
    container_name: supervisord
    ports:
      - "9001:9001" # Supervisord's web interface port
    volumes:
      - ./supervisord/conf:/etc/supervisor/conf.d
    depends_on:
      - flask
      - nginx
    networks:
      - app_network

networks:
  app_network:
    driver: bridge

二、使用步骤

1.安装拓展

代码如下(示例):

# Use Python 3.8.6 base image
FROM python:3.8.6

# Set the working directory in the container
WORKDIR /home/app

# Copy requirements file to the container
COPY requirements.txt /home/app/

RUN apt-get update && apt-get install -y lsof

# Install the dependencies
# RUN pip install --no-cache-dir -r requirements.txt
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# RUN pip install Flask Flask-MySQLdb mysqlclient flask-login bcrypt Flask-SQLAlchemy PyMySQ
RUN pip install Flask Flask-MySQLdb mysqlclient flask-login bcrypt Flask-SQLAlchemy PyMySQL Flask-Migrate
# RUN pip install flask-restful

# 跨域访问
# RUN pip install flask-cors

# JWT
RUN pip install flask-jwt-extended

# SocketIO
RUN pip install eventlet flask-socketio

# requests
RUN pip install requests


# Copy the application code to the container
COPY . /home/app/

# Expose the Flask port
EXPOSE 5000

# Start the Flask application with Gunicorn
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--worker-class", "gthread", "--threads", "4", "wsgi:app"]

2.flask配置mysql连接

代码如下(示例):

from flask import Flask
from flask_login import LoginManager
# from .models import init_app as init_models
from .models import db
# 这里使用views.init_app()方法初始化视图蓝图,也可以把文件夹名称改成其他比如controller/api之类的
from .views import init_views
# from flask_mysqldb import MySQL
from flask_sqlalchemy import SQLAlchemy

#引入日志
import logging
from logging.handlers import RotatingFileHandler

# 引入数据库迁移扩展
from flask_migrate import Migrate

# 引入 restful 扩展
# from flask_restful import Api, Resource, reqparse

# 引入 JWT 扩展
from flask_jwt_extended import JWTManager, create_access_token, jwt_required

# mysql = MySQL()
# 初始化 SQLAlchemy
db = SQLAlchemy()

def create_app():
    app = Flask(__name__)

    # 初始化 restful 扩展
    # api = Api(app, default_mediatype="application/json")

    app.config['SECRET_KEY'] = 'test'  # 用于加密会话数据
    
    # 配置 MySQL 数据库连接 -- mysql+pymysql://用户名:密码@ip:端口/数据库名称
    # app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://python:[email protected]:3306/python_db'
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://python:python_123456@mysql:3306/python_db'

    # 禁用 SQLAlchemy 的修改追踪功能,这样可以提高性能
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

    # 初始化 db
    db.init_app(app)

    # 初始化数据库迁移扩展
    migrate = Migrate(app, db)

    # 初始化 JWT 扩展
    jwt = JWTManager(app)

    # login_manager = LoginManager()
    # login_manager.init_app(app)
    # login_manager.login_view = 'index.login'  # 定义登录视图的端点

    # 注册视图蓝图
    init_views(app)

    # 配置日志记录器
    if not app.debug:
        handler = RotatingFileHandler('app.log', maxBytes=1000000, encoding='utf-8', backupCount=3)
        handler.setLevel(logging.INFO)
        formatter = logging.Formatter(
            '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
        )
        handler.setFormatter(formatter)
        app.logger.addHandler(handler)
        app.logger.setLevel(logging.DEBUG)

    return app

3.简单使用

视图:

# 查询所有用户
@index_blueprint.route('/users', methods=['GET'])
#jwt修饰器,代表该接口需要使用token验证 格式 - Authorization:Bearer 
@jwt_required()
def get_all_users():
    logging.debug('This is a debug message')
    try:
        users = User.get_all_users()
        user_dicts = [user.to_dict() for user in users]
        return jsonify(user_dicts), 200
    except Exception as e:
        logging.error(f"Error fetching users: {e}")
        return jsonify({"error": "An error occurred"}), 500

# 创建新用户
@index_blueprint.route('/create_user', methods=['POST'])
def create_user():
    data = request.get_json()
    username = data.get('username')
    password = data.get('password')
    try:
        User.add_user(username, password)
        return jsonify({'message': 'User created successfully!'}), 201
    except Exception as e:
        logging.error(f"Error creating user: {e}")
        abort(500)

模型:

from app import db

import logging

class User(db.Model):
    # __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(255), unique=True, nullable=False)
    password = db.Column(db.String(255), nullable=False)

    def __init__(self, username, password):
        self.username = username
        self.password = password

    def __repr__(self):
        return f'<User {self.username}>'

    def to_dict(self):
        return {
            'id': self.id,
            'username': self.username
        }

    @staticmethod
    def get_all_users():
        return User.query.all()
    
    @staticmethod
    def add_user(username, password):
        new_user = User(username=username, password=password)
        db.session.add(new_user)
        db.session.commit()
        return new_user

蓝图注册:

def init_views(app):
    # 注册index蓝图
    from .index import index_blueprint
    app.register_blueprint(index_blueprint)

标签:flask,app,db,更新,python,mysql,import,docker
From: https://blog.csdn.net/weixin_42695345/article/details/142071170

相关文章

  • 记录JDK8到JDK17各个版本的更新重点
    虽然大多数公司还是用的JDK8但是也要去了解和学习一下新得东西##JDK8新特性(2014年初)(LTS版本)1、Lambda表达式2、函数式编程3、接口可以添加默认方法和静态方法,也就是定义不需要实现类实现的方法4、方法引用5、重复注解,同一个注解可以使用多次6、引入Optional来避免空指针7......
  • Docker必备命令大全:从安装到多容器管理
    浪浪云活动链接:https://langlangy.cn/?i8afa52文章目录安装Docker在Ubuntu上安装Docker在CentOS上安装DockerDocker常用命令1.检查Docker版本2.管理Docker容器2.1拉取镜像2.2列出本地镜像2.3运行容器2.4列出运行中的容器2.5停止容器2.6启动容器......
  • Linux系统上安装Docker的详细教程
    感谢浪浪云支持发布浪浪云活动链接:https://langlangy.cn/?i8afa52文章目录1.在Ubuntu/Debian系统上安装Docker1.1更新软件包1.2安装依赖包1.3添加DockerGPG密钥1.4添加Docker仓库1.5安装Docker引擎1.6启动并验证Docker2.在CentOS/RHEL系统上安装Docker2.1......
  • Docker 安装 Nacos 教程
    Nacos是一个易于使用的平台,用于服务发现和配置管理。它支持服务的注册与发现,同时提供动态配置管理功能。本文将介绍如何使用Docker快速安装Nacos,并提供相应的配置文件standalone-mysql-5.7.yaml用于设置Nacos与MySQL的集成。参考:https://nacos.io/docs/v2.3/quic......
  • 国内加速拉取docker镜像的几种方法
    参考首页快捷命令,使用本站代理拉取镜像,并修改回原始镜像名,在删除代理镜像名。参考以下dockercli和docker-compose.yml修改镜像名后,继续一直使用本站代理服务未启动或更新新镜像。参考下文修改daemon.json配置文件,来更便捷地使用代理服务。 源站替换为平台do......
  • 基于python+flask框架的月子会所管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着现代社会的快速发展和生活水平的提高,人们对母婴健康的重视程度日益增强。月子会所作为提供专业产后护理与恢复服务的机构,近年来在全球......
  • 基于python+flask框架的在线酒店管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和旅游业的蓬勃兴起,酒店行业正经历着前所未有的变革。传统酒店管理模式已难以满足市场快速响应和个性化服务的需......
  • 飞牛等nas下部署dweebUI,扩展安装119个精选docker应用
    简介dweebui是一个类似之前介绍的portainer-ce和dockge的docker管理器,但是他有个优点是和1panel一样自带了很多便捷安装的docker应用,缺点是英文界面,毕竟是国外软件,但是对于飞牛nas做个补充来说还是不错的官网:https://www.dweebui.com/预览效果:安装搭建本次部署还是一......
  • 基于python+flask框架的社区居民信息管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,社区作为城市的基本单元,其管理与服务水平直接关系到居民的生活质量和社会稳定。传统的社区管理方式往往依赖于纸质档......
  • 基于python+flask框架的志羽·羽场管理与智能推荐系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着全民健身热潮的兴起,羽毛球作为一项广受欢迎的运动项目,其场地需求日益增长。然而,传统羽场管理模式面临着诸多挑战,如场地利用率不均衡、......