Python 不识别有效载荷是危险的

Python 不识别有效载荷是危险的,python,heroku,flask,Python,Heroku,Flask,我正在使用Heroku调度程序在我的应用程序之外运行脚本。脚本与run.py和procfile位于同一文件夹中 @manager.command def run_purge(): candidates = models.Candidate.query.all() print "SECRET KEY --------->", os.environ["APP_SECRET_KEY"] people_purged = [] for candidate in can

我正在使用Heroku调度程序在我的应用程序之外运行脚本。脚本与run.py和procfile位于同一文件夹中

@manager.command
def run_purge():
    candidates = models.Candidate.query.all()
    print "SECRET KEY --------->", os.environ["APP_SECRET_KEY"]
    people_purged = []
    for candidate in candidates:
        if candidate.status != 0 and candidate.approved == True and over_30_days(candidate.last_status_change):
            payload = reactivate_account_link(candidate.email, 'reactivate_account')
            send_email("Your account is innactive", "TalentTracker", [candidate.email], payload)
            candidate.status = 0
            db.session.commit()
            people_purged.append(candidate.email)
        else:
            pass    
    return send_email("Purge Completed", "TalentTracker", email_to_admin, "purge completed --> {0}".format(people_purged))
该脚本使用Flask的It's Danger生成有效负载,该有效负载在应用程序本身的视图文件中接收。这在当地很管用。然而,当我运行live时,它会给我一个内部服务器错误。通过打印语句,我发现它触发了BadSignature异常,我完全确定了原因。我的直觉是,这与应用程序外的密钥有关,但当我打印密钥时,它就存在了

@app.route('/candidates/reactivate_account/<payload>/')
def reactivate_account(payload):
    s = get_serializer()
    try: 
        candidate_email = s.loads(payload)[0]
    except BadSignature:
        print "BAD SIGNATURE", payload, s.loads(payload)
        raise   
    candidate = Candidate.query.filter_by(email=candidate_email).first()
    candidate.status += 1
    candidate.last_status_change = datetime.datetime.now()  
    db.session.commit()
    commit_to_analytics(candidate.candidate_id, None, 4)
    return render_template("test.html")
我在应用程序外部单独创建它,但内部的功能相同。我已经尝试过这样一个版本,我显式地调用了密钥,但也没有成功。我应该导入它而不是单独创建它吗

---第二次更新---

我通过向应用程序中的get_serialize函数和应用程序外部的get_serialize函数提供一个全新的“secret_密钥”来实现这一点

但是,当我在os.environ[APP_SECRET_KEY]和APP.SECRET_KEY上运行repr和==时,值是相同的。有效载荷也匹配


当我在终端中打印此密钥时,它不会出现反斜杠,例如abcdefghi,我认为这是正确的行为。实际上,密钥有反斜杠,例如ab/cd/ef/gh/ij。我不确定这是否相关,但我想我会包括在内。

get\u序列化程序是什么样子的?您在两端使用完全相同的序列化程序吗?@MartijnPieters添加了一个更新,thx!您是否100%确定os.environ['APP\u SECRET\u KEY']和APP.SECRET\u KEY的内容是逐字节的相同值?是的,我从os.environ中提取了这两个内容,并使用print语句进行了检查。不,这还不够。对它们使用repr,并==断言它们确实相等。接下来,验证reactivate_account_链接中的负载是否与reactivate_account中的负载值完全相同。
def get_serializer(secret_key=None):
    if secret_key is None:
        secret_key = app.secret_key
    return URLSafeSerializer(secret_key)

# for getting serialized urls
def reactivate_account_link(candidate_email, path):
    s = get_serializer(os.environ["APP_SECRET_KEY"])
    loads = [candidate_email]
    payload = s.dumps(loads)
    return url_for(path, payload=payload, _external=True)