关于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值