gpt4 book ai didi

python - Flask:如何在应用程序上下文之外使用 url_for()?

转载 作者:行者123 更新时间:2023-12-04 11:33:46 26 4
gpt4 key购买 nike

我正在编写一个脚本来收集那些没有收到电子邮件确认电子邮件的用户的电子邮件并将其重新发送给他们。该脚本显然在 Flask 应用程序上下文之外工作。我想使用 url_for() 但无法正确使用。

def resend(self, csv_path):
self.ctx.push()
with open(csv_path) as csv_file:
csv_reader = csv.reader(csv_file)
for row in csv_reader:
email = row[0]
url_token = AccountAdmin.generate_confirmation_token(email)
confirm_url = url_for('confirm_email', token=url_token, _external=True)
...
self.ctx.pop()

我要做的第一件事是在配置中设置 SERVER_NAME。但后来我收到此错误消息:

werkzeug.routing.BuildError: Could not build url for endpoint 'confirm_email' with values ['token']. Did you mean 'static' instead?



这是它的定义方式,但我认为它甚至找不到这个,因为它在作为脚本运行时没有注册:
app.add_url_rule('/v5/confirm_email/<token>', view_func=ConfirmEmailV5.as_view('confirm_email'))

有没有办法挽救 url_for() 还是我必须建立自己的网址?
谢谢

最佳答案

从应用程序上下文中获取 URL 更容易也更合适。
您可以导入应用程序并使用 app_context 手动推送上下文
https://flask.palletsprojects.com/en/2.0.x/appcontext/#manually-push-a-context

from flask import url_for
from whereyoudefineapp import application
application.config['SERVER_NAME'] = 'example.org'
with application.app_context():
url_for('yourblueprint.yourpage')
或者您可以重新定义您的应用程序并注册所需的蓝图。
from flask import Flask, url_for
from whereyoudefineyourblueprint import myblueprint
application = Flask(__name__)
application.config['SERVER_NAME'] = 'example.org'
application.register_blueprint(myblueprint)
with application.app_context():
url_for('myblueprint.mypage')
我们也可以想象没有应用程序的不同方法来做到这一点,但我没有看到任何足够/适当的解决方案。
尽管如此,我仍然会建议这个肮脏的解决方案。
假设您在 routes.py 中有以下蓝图和以下路线。
from flask import Blueprint

frontend = Blueprint('frontend', __name__)

@frontend.route('/mypage')
def mypage():
return 'Hello'

@frontend.route('/some/other/page')
def someotherpage():
return 'Hi'

@frontend.route('/wow/<a>')
def wow(a):
return f'Hi {a}'
您可以使用库 inspect 获取源代码,然后对其进行解析以构建 URL。
import inspect
import re

BASE_URL = "https://example.org"

class FailToGetUrlException(Exception):
pass

def get_url(function, complete_url=True):
source = inspect.getsource(function)
lines = source.split("\n")

for line in lines:
r = re.match(r'^\@[a-zA-Z]+\.route\((["\'])([^\'"]+)\1', line)
if r:
if complete_url:
return BASE_URL + r.group(2)
else:
return r.group(2)

raise FailToGetUrlException


from routes import *
print(get_url(mypage))
print(get_url(someotherpage))
print(get_url(wow).replace('<a>', '456'))
输出:
https://example.org/mypage
https://example.org/some/other/page
https://example.org/wow/456

关于python - Flask:如何在应用程序上下文之外使用 url_for()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62445139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com