Перечислите все доступные маршруты в Flask, а также соответствующие docstrings - программирование
Подтвердить что ты не робот

Перечислите все доступные маршруты в Flask, а также соответствующие docstrings

Я пишу небольшой API и хотел распечатать список всех доступных методов вместе с соответствующим "текстом справки" (из функции docstring). Начиная с этого ответа, я написал следующее:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/api', methods = ['GET'])
def this_func():
    """This is a function. It does nothing."""
    return jsonify({ 'result': '' })

@app.route('/api/help', methods = ['GET'])
    """Print available functions."""
    func_list = {}
    for rule in app.url_map.iter_rule():
        if rule.endpoint != 'static':
            func_list[rule.rule] = eval(rule.endpoint).__doc__
    return jsonify(func_list)

if __name__ == '__main__':
    app.run(debug=True)

Есть ли лучше - более безопасный способ сделать это? Спасибо.

4b9b3361

Ответ 1

Существует app.view_functions. Я думаю, это именно то, что вы хотите.

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/api', methods = ['GET'])
def this_func():
    """This is a function. It does nothing."""
    return jsonify({ 'result': '' })

@app.route('/api/help', methods = ['GET'])
def help():
    """Print available functions."""
    func_list = {}
    for rule in app.url_map.iter_rules():
        if rule.endpoint != 'static':
            func_list[rule.rule] = app.view_functions[rule.endpoint].__doc__
    return jsonify(func_list)

if __name__ == '__main__':
    app.run(debug=True)

Ответ 2

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/api/help', methods=['GET'])
def help():
    endpoints = [rule.rule for rule in app.url_map.iter_rules() 
                 if rule.endpoint !='static']
    return jsonify(dict(api_endpoints=endpoints))

if __name__ == '__main__':
       app.run(debug=True)

Ответ 3

Здесь мое:

@app.route("/routes", methods=["GET"])
def getRoutes():
    routes = {}
    for r in app.url_map._rules:
        routes[r.rule] = {}
        routes[r.rule]["functionName"] = r.endpoint
        routes[r.rule]["methods"] = list(r.methods)

    routes.pop("/static/<path:filename>")

    return jsonify(routes)

дает:

{
    "/": {
        "functionName": "index",
        "methods": [
            "HEAD",
            "OPTIONS",
            "GET"
        ]
    },
    "/gen": {
        "functionName": "generateJobs",
        "methods": [
            "HEAD",
            "OPTIONS",
            "GET"
        ]
    },
    "/jobs": {
        "functionName": "getJobs",
        "methods": [
            "HEAD",
            "OPTIONS",
            "GET"
        ]
    },
    "/jobs/submit": {
        "functionName": "postJob",
        "methods": [
            "POST",
            "OPTIONS"
        ]
    },
    "/jobs/update/<id>": {
        "functionName": "updateJob",
        "methods": [
            "POST",
            "OPTIONS"
        ]
    },
    "/routes": {
        "functionName": "getRoutes",
        "methods": [
            "HEAD",
            "OPTIONS",
            "GET"
        ]
    }
}