关于superset邮件发送所遇到的坑
最近公司做superset二次开发,鉴于网上资料比较少,特意把开发中遇到的bug做一下记录,希望留给有用的人
1,vim config.py
ENABLE_SCHEDULED_EMAIL_REPORTS = True #开启邮件发送功能
#----------
##配置自己邮件发送服务器地址,邮箱用户密码
EMAIL_NOTIFICATIONS = True
SMTP_HOST = "email-smtp.eu-west-1.amazonaws.com"
SMTP_STARTTLS = True
SMTP_SSL = False
SMTP_USER = "smtp_username"
SMTP_PORT = 25
SMTP_PASSWORD = os.environ.get("SMTP_PASSWORD")
SMTP_MAIL_FROM = "insights@komoot.com"
#---------------------
##配置哪个用户有权限发送,这个用户要拥有最高权限,一般用admin
EMAIL_REPORTS_USER = "admin"
## 浏览器类型改成chrome,firefox截图有缺陷不建议使用,
WEBDRIVER_TYPE = "chrome"
WEBDRIVER_OPTION_ARGS = [##需要特别注意google浏览器这里不需要再配置其它额外的,否则报各种错误,自己被坑了很久
"--no-sandbox",#由于我用的是root账户,google必须加上才可以root账户访问
"--force-device-scale-factor=2.0",
"--high-dpi-support=2.0",
"--headless",##linux中chrome浏览器无头模式访问
]
##要定时发送需要配置celery
class CeleryConfig(object):
BROKER_URL = 'redis://localhost:6379/0'##改成自己的redis服务器地址
CELERY_IMPORTS = (
'superset.sql_lab',
'superset.tasks',
)
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'##改成自己的redis服务器地址
CELERYD_LOG_LEVEL = 'DEBUG'
CELERYD_PREFETCH_MULTIPLIER = 10
CELERY_ACKS_LATE = True
CELERY_ANNOTATIONS = {
'sql_lab.get_sql_results': {
'rate_limit': '100/s',
},
'email_reports.send': {
'rate_limit': '1/s',
'time_limit': 120,
'soft_time_limit': 150,
'ignore_result': True,
},
}
CELERYBEAT_SCHEDULE = {
'email_reports.schedule_hourly': {
'task': 'email_reports.schedule_hourly',
'schedule': crontab(minute=1, hour='*'),
},
}
CELERY_CONFIG = CeleryConfig
## 下面是redis配置,同样host改成自己的redis服务器地址
from cachelib.redis import RedisCache
RESULTS_BACKEND = RedisCache(
host='localhost', port=6379, key_prefix='superset_results')
CACHE_CONFIG = {
'CACHE_TYPE': 'redis',
'CACHE_DEFAULT_TIMEOUT': 60 * 60 * 24, # 1 day default (in secs)
'CACHE_KEY_PREFIX': 'superset_results',
'CACHE_REDIS_URL': 'redis://localhost:6379/0',
}
##修改成你superset部署的服务器地址,端口号可以自定义,当然也可以直接用下面的配置
WEBDRIVER_BASEURL = "http://0.0.0.0:8080/"
2,进入superset环境,
执行:source activate superset —激活superset环境
执行superset init命令后可以看到多了两个按钮
3,安装google 浏览器和chromedriver,记住版本一定要对上
本人chromedriver版本: ChromeDriver 87.0.4280.88 查看驱动版本命令:chromedriver
google浏览器版本:Google Chrome 87.0.4280.88 查看浏览器版本命令:google-chrome —version
至于安装google浏览器和缺少的依赖详见本人另一篇博客:https://blog.csdn.net/qq_36881106/article/details/110637950,,https://blog.csdn.net/weixin_45010467/article/details/107490043
4,重要由于我们的superset是二次开发,在用户登录的时候往全局session中放入了用户的工号,和访问级别导致我后面的邮件发送一直报keyword error错误,这个问题困惑了我很久,下面说说我的解决方法:
害人的两个key
session['job_level'] = job_l
session['job_number'] = job_n
由于这两个key是在全局session中,后面发送邮件时是重新调用的login方法,会根据用户工号查询数据,从而导致header中找不到这两个key,我的解决方法是:重写
get_auth_cookies这个方法给起个别名,在重写的这个方法中加入这两个key,一定不要在原来的方法中修改,否则会报错
如果发送的是data原数据需要在task/schedules.py中做以下修改,把调用get_auth_cookies方法改成get_auth_cookies2方法,如下图:
如果发送的是dashbord需要在utils/machine_auth.py中做以下修改,把调用get_auth_cookies方法改成get_auth_cookies2方法,如下图:
在收到的邮件中,中文可能是乱码,需要在utils/core.py中做两处修改:修改完成后需要清除浏览器cookie或者用无痕模式重新打开一个浏览器:ctrl+shift+n
当然以上是自己发送邮件为附件,需要下载源数据的配置,其它online,什么的就更简单了,最后献上自己发送完的一张截图,如果有不明白的欢迎评论留言:
如果附件中的中文乱码,请在linux中安装中文字体,导入csv中文乱码参考:https://blog.csdn.net/zhouyan8603/article/details/107484249
还没有评论,来说两句吧...