[python] Flask 앱에 정의 된 모든 경로 목록 가져 오기

복잡한 플라스크 기반 웹 앱이 있습니다. 보기 기능을 가진 별도의 파일이 많이 있습니다. URL은 @app.route('/...')데코레이터 로 정의됩니다 . 내 앱에서 선언 된 모든 경로 목록을 얻는 방법이 있습니까? 아마도 app객체를 호출 할 수있는 방법이 있습니까?



답변

응용 프로그램의 모든 경로 app.url_map는의 인스턴스 인 에 저장됩니다 werkzeug.routing.Map. Rule다음 iter_rules방법 을 사용하여 인스턴스를 반복 할 수 있습니다 .

from flask import Flask, url_for

app = Flask(__name__)

def has_no_empty_params(rule):
    defaults = rule.defaults if rule.defaults is not None else ()
    arguments = rule.arguments if rule.arguments is not None else ()
    return len(defaults) >= len(arguments)


@app.route("/site-map")
def site_map():
    links = []
    for rule in app.url_map.iter_rules():
        # Filter out rules we can't navigate to in a browser
        # and rules that require parameters
        if "GET" in rule.methods and has_no_empty_params(rule):
            url = url_for(rule.endpoint, **(rule.defaults or {}))
            links.append((url, rule.endpoint))
    # links is now a list of url, endpoint tuples

조금 더 자세한 정보는 작성된 새 웹 페이지에 대한 링크 표시를 참조하십시오 .


답변

방금 같은 질문을 만났습니다. 위의 솔루션은 너무 복잡합니다. 프로젝트에서 새 쉘을 열기 만하면됩니다.

    python
    >>> from app import app
    >>> app.url_map

첫 번째 ‘ app ‘은 내 프로젝트 스크립트 app.py 이고 다른 하나는 내 웹 이름입니다.

(이 솔루션은 경로가 적은 작은 웹용입니다)


답변

내 도우미 방법을 만듭니다 manage.py.

@manager.command
def list_routes():
    import urllib
    output = []
    for rule in app.url_map.iter_rules():

        options = {}
        for arg in rule.arguments:
            options[arg] = "[{0}]".format(arg)

        methods = ','.join(rule.methods)
        url = url_for(rule.endpoint, **options)
        line = urllib.unquote("{:50s} {:20s} {}".format(rule.endpoint, methods, url))
        output.append(line)

    for line in sorted(output):
        print line

더미 옵션 세트를 작성하여 누락 된 인수를 해결합니다. 결과는 다음과 같습니다.

CampaignView:edit              HEAD,OPTIONS,GET     /account/[account_id]/campaigns/[campaign_id]/edit
CampaignView:get               HEAD,OPTIONS,GET     /account/[account_id]/campaign/[campaign_id]
CampaignView:new               HEAD,OPTIONS,GET     /account/[account_id]/new

그런 다음 실행하십시오.

python manage.py list_routes

manage.py 체크 아웃에 대한 자세한 내용은 http://flask-script.readthedocs.org/en/latest/


답변

Jonathan의 답변과 비슷하게 대신이 작업을 선택했습니다. 인수가 문자열이 아닌 경우 url_for를 사용하는 요점을 알 수 없습니다. 예 : float

@manager.command
def list_routes():
    import urllib

    output = []
    for rule in app.url_map.iter_rules():
        methods = ','.join(rule.methods)
        line = urllib.unquote("{:50s} {:20s} {}".format(rule.endpoint, methods, rule))
        output.append(line)

    for line in sorted(output):
        print(line)


답변

분명히 0.11 버전부터 Flask에는 CLI가 내장되어 있습니다. 내장 명령 중 하나가 경로를 나열합니다.

FLASK_APP='my_project.app' flask routes


답변

명령 행을 실행하도록 지정하지 않았으므로 대시 보드 또는 기타 비 명령 행 인터페이스에 대해 다음을 json으로 쉽게 리턴 할 수 있습니다. 결과와 결과가 실제로 디자인 관점에서 결합되어서는 안됩니다. 아주 작은 프로그램이라하더라도 잘못된 프로그램 디자인입니다. 그런 다음 아래 결과를 웹 응용 프로그램, 명령 줄 또는 json을 수집하는 다른 모든 항목에서 사용할 수 있습니다.

또한 각 경로와 관련된 파이썬 기능을 알아야한다고 지정하지 않았으므로 원래 질문에 더 정확하게 대답합니다.

아래를 사용하여 모니터링 대시 보드에 직접 출력을 추가합니다. 사용 가능한 라우트 방법 (GET, POST, PUT 등)을 원하는 경우 위의 다른 답변과 결합해야합니다.

Rule의 repr ()은 경로에서 필요한 인수를 변환합니다.

def list_routes():
    routes = []

    for rule in app.url_map.iter_rules():
        routes.append('%s' % rule)

    return routes

목록 이해를 사용하는 것과 같은 것 :

def list_routes():
    return ['%s' % rule for rule in app.url_map.iter_rules()]

샘플 출력 :

{
  "routes": [
    "/endpoint1",
    "/nested/service/endpoint2",
    "/favicon.ico",
    "/static/<path:filename>"
  ]
}


답변

보기 함수 자체에 액세스해야하는 경우 대신을 app.url_map사용하십시오 app.view_functions.

스크립트 예 :

from flask import Flask

app = Flask(__name__)

@app.route('/foo/bar')
def route1():
    pass

@app.route('/qux/baz')
def route2():
    pass

for name, func in app.view_functions.items():
    print(name)
    print(func)
    print()

위의 스크립트 실행 결과 :

static
<bound method _PackageBoundObject.send_static_file of <Flask '__main__'>>

route1
<function route1 at 0x128f1b9d8>

route2
<function route2 at 0x128f1ba60>

플라스크가 자동으로 생성하는 “정적”경로를 포함합니다.