在我的生产服务器上,我收到以下错误
“ init () 得到了意外的关键字参数 'apikey'”
开发服务器上的相同代码正在运行。
我的生产服务器正在运行gunicorn,我已将环境变量SENDGRID_API_KEY添加到gunicorn.service文件中。我已经重新启动了gunicorn和nginx。我可以看到环境变量已加载。
我调用发送电子邮件的方法如下:
def sendtestemail(to):
sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY'))
from_email = Email("<myemail>@<mydomain>.com")
to_email = Email(to)
subject = "Sending with SendGrid is Fun"
content = Content("text/plain", "and easy to do anywhere, even with Python")
mail = Mail(from_email, subject, to_email, content)
response = sg.client.mail.send.post(request_body=mail.get())
return [response.status_code, response.body, response.headers]
错误信息 "
init
() got an unexpected keyword argument 'apikey'" 说明你正在使用的 SendGrid 库版本不支持将
apikey
作为
SendGridAPIClient
构造函数中的关键字参数。这可能是由于生产服务器和开发服务器上的 SendGrid 库版本不同造成的。
以下是如何解决这个问题的步骤:
1. 检查 SendGrid 库版本:
-
在你的生产服务器和开发服务器上,分别运行以下命令,检查 SendGrid 库版本:
bash pip freeze | grep sendgrid
-
确保两个版本相同。如果不是,请在你的生产服务器上更新 SendGrid 库:
bash pip install --upgrade sendgrid
2. 如果 SendGrid 库版本相同,尝试将 API 密钥传递为位置参数,而不是关键字参数:
-
将
sendtestemail
函数中的这行代码:python sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY'))
-
替换为:
python sg = sendgrid.SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
3. 重启 Gunicorn 和 Nginx:
-
完成上述任何更改后,请确保重启 Gunicorn 和 Nginx 以使更改生效。
bash sudo systemctl restart gunicorn sudo systemctl restart nginx
其他建议:
- 虚拟环境: 为了避免此类版本冲突,最好在开发和生产环境中使用虚拟环境。
- 错误处理: 考虑在你的代码中添加错误处理机制,以更好地诊断和处理 API 调用期间可能出现的任何问题。
如果问题仍然存在,请提供以下信息,以便我进一步帮助:
- 生产服务器和开发服务器上 SendGrid 库的确切版本。
- 你正在使用的 SendGrid 库文档链接。
- 完整的错误跟踪信息。