我使用Heroku Scheduler在我的应用程序之外运行脚本。该脚本与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 Danice 生成有效负载,并在应用程序本身的视图文件中接收有效负载。这在当地工作正常。但是,当我现场直播时,它会给我一个"内部服务器错误"。通过Print语句,我发现它触发了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_serializer
在应用之外的样子。
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)
我在应用程序之外单独创建它,但功能是相同的。我已经尝试了一个版本,我明确地称之为密钥,但这也没有用。我应该导入它而不是单独创建吗?
-----第二次更新-----
我通过提供get_serialize
个功能 - 应用程序中的一个和外部的功能 - 一个全新的`secret_key&#39;来实现这一点。
但是,当我在os.environ [&#34; APP_SECRET_KEY&#34;]和app.secret_key上运行repr
和==
时,值是相同的。有效载荷也匹配。
当我在终端中打印此密钥时,它显示没有反斜杠,例如abcdefghi(我认为是正确的行为)。实际上,秘密密钥具有反斜杠,例如AB / CD / EF / GH / IJ。我不确定这是否相关,但我想包括。