flask redis mysql_Docker下Python Flask+Redis+MySQL+RQ队列简单配置

田马鲁
2023-12-01

本篇博文主要讲解Docker下使用RQ队列的通信配置,主要是网上的部分文章写的不太清楚,特写一篇

作者使用docker-compose.yml文件调度各部分文件Dockerfile,起初是这样写的

version: ‘3‘

services:

redis:

image: "redis"

restart: always

environment:

- TZ=Asia/Shanghai

mysql:

build: ./mysql

environment:

- TZ=Asia/Shanghai

- MYSQL_DATABASE=SZheScan

- MYSQL_ROOT_PASSWORD=root

ports:

- "3306:3306"

restart: always

command: [

‘--character-set-server=utf8mb4‘,

‘--collation-server=utf8mb4_unicode_ci‘,

]

?

web:

build: .

ports:

- "5000:5000"

links:

- mysql:mysql

- redis:redis

depends_on:

- mysql

restart: always

environment:

- TZ=Asia/Shanghai

rq:

build: .

depends_on:

- redis

- web

command: "rq worker"

restart: always

environment:

- TZ=Asia/Shanghai

关键点在于rq部分:

rq:

build: .

depends_on:

- redis

- web

command: "rq worker"

restart: always

environment:

- TZ=Asia/Shanghai

使用command命令启动RQ队列:

command: "rq worker"

在Flask的配置文件config.py中如下编写:

import os

import redis

from rq import Queue

‘‘‘

配置文件:

debug=true

secret_key,session中的24位随机盐值

MySQL数据库配置

数据库名为SZheScan

python3:https://blog.csdn.net/qq562029186/article/details/81325074

‘‘‘

DEBUG = False

SECRET_KEY = os.urandom(24)

HOSTNAME=‘mysql‘

# HOSTNAME=‘127.0.0.1‘

PORT = ‘3306‘

DATABASE = ‘SZheScan‘

USERNAME = ‘root‘

PASSWORD = ‘root‘

# SQLALCHEMY_DATABASE_URI = ‘mysql+pymysql://root:[email protected]/tushare?charset=utf8‘

SQLALCHEMY_DATABASE_URI = ‘mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8‘.format(USERNAME, PASSWORD, HOSTNAME, PORT,

DATABASE)

SQLALCHEMY_TRACK_MODIFICATIONS = False

HOST = ‘redis‘

# HOST = ‘127.0.0.1‘

redisPool = redis.ConnectionPool(host=HOST, port=6379, db=0, decode_responses=True)

db = redis.Redis(host=HOST, port=6379, db=0, decode_responses=True)

queue = Queue(connection=db)

除了引入关键的库文件之外,RQ队列关键代码在:

db = redis.Redis(host=HOST, port=6379, db=0, decode_responses=True)

queue = Queue(connection=db)

注意,这里链接的HOST不能是本地127.0.0.1,而是redis,而redis实际上是docker-compose.yaml文件里面redis的服务名,也就是redis服务,这样才能正常通信。

接着使用docker-compose up 启动服务,但是出现了报错为:

Error 99 connecting to localhost:6379. Cannot assign requested address

事实上,这个解决方案,解决的问题是前面我们提到的,HOST主机修改为redis服务名的问题,但是当我这样修改了之后,并且重新建立了镜像,还是会出现同样的报错。

在查阅了相关的资料之后,作者才发现,原来RQ队列默认链接的就是本地的Redis数据库,即localhost:6379,虽然我们在配置文件,即config.py里面写了:

db = redis.Redis(host=HOST, port=6379, db=0, decode_responses=True)

但是RQ队列并不会智能到自动链接redis Docker服务,最终还是一次又一次去尝试链接localhost:6379,这也是为什么Docker的报错里面会出现localhost:6379的原因。

解决方法为,docker-compose.yml启动文件中,RQ队列启动command命令指定配置文件启动

简单介绍一下咋编写配置文件及启动服务,更详细的可以去查看其他博主的RQ队列配置文件编写

首先编写一个rqsettings.py文件:

?

# 你也可以指定使用的redis数据库

REDIS_HOST = ‘redis‘

REDIS_PORT = 6379

REDIS_DB = 0

# REDIS_PASSWORD = ‘very secret‘

# 监听的队列

QUEUES = [‘high‘, ‘default‘, ‘low‘]

可以看到在这里我们指定的是redis主机,即docker-compose.yml文件中redis docker的服务名,在stackoverflow解决方案上,也是想表达改为docker redis的服务名。

接着在config.py中,还是象征性改一下:

import os

import redis

from rq import Queue

import rqsettings

‘‘‘

配置文件:

debug=true

secret_key,session中的24位随机盐值

MySQL数据库配置

数据库名为SZheScan

python3:https://blog.csdn.net/qq562029186/article/details/81325074

‘‘‘

DEBUG = False

SECRET_KEY = os.urandom(24)

HOSTNAME=‘mysql‘

# HOSTNAME=‘127.0.0.1‘

PORT = ‘3306‘

DATABASE = ‘SZheScan‘

USERNAME = ‘root‘

PASSWORD = ‘root‘

# SQLALCHEMY_DATABASE_URI = ‘mysql+pymysql://root:[email protected]/tushare?charset=utf8‘

SQLALCHEMY_DATABASE_URI = ‘mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8‘.format(USERNAME, PASSWORD, HOSTNAME, PORT,

DATABASE)

SQLALCHEMY_TRACK_MODIFICATIONS = False

HOST = ‘redis‘

# HOST = ‘127.0.0.1‘

redisPool = redis.ConnectionPool(host=HOST, port=6379, db=0, decode_responses=True)

db = redis.Redis(host=rqsettings.REDIS_HOST, port=rqsettings.REDIS_PORT, db=rqsettings.REDIS_DB, decode_responses=True)

queue = Queue(connection=db)

其实这个改不改都行,RQ指定host和端口改为了调用rqsettings文件而已。

最关键的在于指定配置文件启动,修改docker-compose.yml文件为

version: ‘3‘

services:

redis:

image: "redis"

restart: always

environment:

- TZ=Asia/Shanghai

mysql:

build: ./mysql

environment:

- TZ=Asia/Shanghai

- MYSQL_DATABASE=SZheScan

- MYSQL_ROOT_PASSWORD=root

ports:

- "3306:3306"

restart: always

command: [

‘--character-set-server=utf8mb4‘,

‘--collation-server=utf8mb4_unicode_ci‘,

]

?

web:

build: .

ports:

- "5000:5000"

links:

- mysql:mysql

- redis:redis

depends_on:

- mysql

restart: always

environment:

- TZ=Asia/Shanghai

rq:

build: .

depends_on:

- redis

- web

command: "rq worker -c rqsettings"

restart: always

environment:

- TZ=Asia/Shanghai

关键代码为:

command: "rq worker -c rqsettings"

即使用

rq worker -c rqsettings

-c 参数指定配置文件

需要注意的是,配置文件实际上为rqsettings.py,是存在.py后缀的,但是在-c指定的时候,是不需要加上.py后缀指定的。

然后删除掉之前错误建立的镜像,重新更新一下本地的docker,对于这个问题,即:

Error 99 connecting to localhost:6379. Cannot assign requested address

应该就可以正常解决了。

祝好

原文:https://www.cnblogs.com/Cl0ud/p/13286379.html

 类似资料: