【问题标题】:URL prefix in Flask Python deployed to Heroku using Blueprint使用蓝图部署到 Heroku 的 Flask Python 中的 URL 前缀
【发布时间】:2018-08-04 22:29:55
【问题描述】:

我正在尝试为我的网络应用程序的 api 创建一个 URL 前缀。我希望 api 在我输入 api.website.com/parameter 时返回。我正在使用 Flask 和 Blueprint

api_bp = Blueprint('api', __name__,                        
    template_folder='templates', 
    url_prefix='/api')

@api_bp.route("/")
def get_monkey_api():
    address = request.args.get('address', 
None)
    if address and is_a_banano_address(address):
        return monkey_api(banano_address)
    else:
        return render_template("NotABananoAddress.html"), 400

@api_bp.route("/<address>")
def monkey_api(address):
    monKey = monkey_data_generator.generate_monKey(address)
    if monKey.status is not 'Citizen':
        return "API data on vanity monKeys does not exist"
    return jsonify(monKey.serialize())

app = Flask(__name__)
app.register_blueprint(api_bp, url_prefix='/api')

大部分代码不相关。事实是当我进入时

api.website.com?address=xxx

或者当我进入时

api.website.com/xxx

我应该将我的 API 作为 JSON 取回,但我没有。在 localhost 上,它不返回任何内容,也不显示我什至插入到代码中的打印,当然在 Heroku 上,当我使用前缀时它无法识别项目。

【问题讨论】:

    标签: python api flask routing blueprint


    【解决方案1】:

    你给你的蓝图一个URL前缀

    api_bp = Blueprint('api', __name__,                        
        template_folder='templates', 
        url_prefix='/api')
    

    再用

    app.register_blueprint(api_bp, url_prefix='/api')
    

    这意味着您需要使用hostname/api/ 来获取get_monkey_api() 视图函数,或者使用hostname/api/xxxx 来获取monkey_api() 视图函数。

    如果您希望在站点根目录中找到路由,请删除 URL 前缀。如果您希望蓝图适用于单独的子域,请使用 subdomain='api' 选项,而不是 URL 前缀。

    请注意,要使子域正常工作,您需要配置SERVER_NAME config option 以便可以检测到子域。如果您想在本地进行测试,请编辑您的 /etc/hosts 文件以添加一些指向您的服务器的开发别名,然后将 SERVER_NAME 设置为匹配。

    【讨论】:

    • 如果我从不告诉应用程序此蓝图的前缀是 api,现在我希望它显示在 api.hostname.com 上吗?现在你是对的,它适用于 api/xx 或 api?address=xxx 但我可以在没有蓝图的情况下做到这一点。我希望 API 位于前缀上。我怎样才能做到这一点?谢谢
    • @Randomizer:这不是一个明确的问题。 api.hostname.com 是一个独立域名吗?然后设置subdomain 选项,而不是 URL 前缀!
    • 我想我混合了两者。我想我希望这是一个子域。就在我写 api.hostname.com 插入输入时,它会给我它的 json 元数据。我已更改为注册到 app.register_blueprint(api_bp, subdomain='/api') 但它仍然无法正常工作
    • 请阅读相关文档; subdomain 匹配要求设置SERVER_NAME 以便可以检测到子域。
    猜你喜欢
    • 2013-06-20
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2018-04-07
    相关资源
    最近更新 更多