解决celery中用户密码带有特殊字符的问题

由于某些原因,我们会在密码中加入一些特殊字符,如标点符号等,来加强密码的强度,当在rabbitmq中使用这类包含问号等特殊字符的密码时,celery却遇到了处理错误的问题。

我们编写一个broker的url如下,我们需要连接一个rabbitmq服务器,使用的用户名为admin,密码为mypass?1234:

amqp://admin:mypass?1234@test.knktc.com//

把这个URL用于以下的代码中:

from celery import Celery
# config
RMQ_URL = 'amqp://admin:mypass?1234@test.knktc.com//'
app = Celery('tasks', broker=RMQ_URL)
 
@app.task
def add(x, y):
    return x + y

一运行就会报以下的错误:

ValueError: invalid literal for int() with base 10: 'mypass'

原因就是因为密码中带有问号,导致了程序出错。
此时解决的方案就是把这个密码用urlencode处理下,处理后的代码如下:

from celery import Celery
from urllib import quote
# config
PASSWORD = quote('mypass?1234')
RMQ_URL = 'amqp://admin:{}@test.knktc.com//'.format(PASSWORD)
app = Celery('tasks', broker=RMQ_URL)
 
@app.task
def add(x, y):
    return x + y

这次就可以欢快地运行了。

评论