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


145

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

답변:


152

응용 프로그램의 모든 경로 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

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


단! 내가 라인에 문제가 있었다는 것을 제외하고 url = url_for(rule.endpoint). 방금이 오류가 발생했습니다 BuildError: ('DeleteEvent', {}, None). 대신 URL을 얻으려면 방금했습니다 url = rule.rule. 왜 당신의 방법이 저에게 효과적이지 않습니까?
J-bob

@ J-bob-관련 경로 DeleteEvent필요한 매개 변수 가 있을 가능성이 높습니다. 다음 중 하나를 특별하게 처리하거나 규칙을 필터링 할 수 있습니다.len(rule.arguments) > len(rule.defaults)
Sean Vieira

아, 알 겠어요 url_for매개 변수없이 해당 methid에 대한 URL을 생성 할 수 없습니다. 좋아,하지만 어쨌든 내 방법이 작동하는 것처럼 보입니다 .URL이 매개 변수 인 경우 해당 부분을 유지합니다. 감사!
J-bob

1
이것은 좋은 시작입니다. 모든 매개 변수 (예 :? spam = "eggs")가 나열된 완전 자체 문서화 플라스크 기반 웹 서비스를 작성하는 방법에 대한 제안 사항이 있습니까? 아마도이 정보는 구현 메소드의 docstring에서 추출 할 수 있습니다.
Leonid

2
사용 url_for(rule.endpoint)방법 대신 rule.rule동일한 방법에 대해 둘 이상의 경로가있는 경우를 해결하는 것이 훨씬 좋습니다.
Zini

84

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

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

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

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


1
이것은 아마도 질문에 직접 대답하지 않을 것입니다. 그러나 그것은 더 많은 투표를받을 가치가 있습니다.
UltraInstinct

이 답변은 응용 프로그램에 코드를 추가하지 않아도되기에 좋습니다. 코드를 다시 작성하지 않고 몇 초 만에 원하는 답변을 얻는 데 사용했습니다.
joshdick

"내 앱에서 선언 된 모든 경로 목록을 얻는 방법이 있습니까?" 나는 이것이 질문에 직접 대답하고 받아 들여지는 대답이어야한다고 생각합니다. 너무 쉽게. 감사.
andho

2
나는 이것이 어떻게 받아 들여지는 대답보다 더 간단하거나 분명한지 알지 못한다. 동일한 접근 방식을 제안하지만 요점을 파악 Map하는 데 시간이 오래 걸리며 인스턴스 를 반복 하거나 인스턴스의 속성에 액세스 하는 방법을 보여주지 Rule않으면 실제로 유용한 작업을 수행 할 수 없습니다.
Mark Amery

57

내 도우미 방법을 만듭니다 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/


5
위의 내용은 매우 잘 작동합니다. 그냥 변경 urllib.unquoteurllib.parse.unquoteprint lineprint(line)그것은뿐만 아니라 파이썬 3.x를 작동합니다.
스퀴지

1
문자열이 아닌 인수에는 작동하지 않습니다. 대신 John Jiang의 답변을 사용하는 것이 좋습니다.
nico

42

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)

32

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

FLASK_APP='my_project.app' flask routes

이것은 절대적으로 훌륭합니다!
pfabri

1
flask urls나를 위해 (0.12.1). 에서 보았다 flask --help하지만 난 CLI 페이지에서 경로 나 URL을 볼 수 없습니다
mrgnw

플라스크 1.1.2에서 경로가 제거 된 것으로 보입니다.
Jerry Ji

5

명령 행을 실행하도록 지정하지 않았으므로 대시 보드 또는 기타 비 명령 행 인터페이스에 대해 다음을 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>"
  ]
}

2

보기 함수 자체에 액세스해야하는 경우 대신을 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>

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


2

FLASK_APP 환경 변수를 내보내거나 설정 한 후 다음 명령을 실행하여 플라스크 쉘을 통해 모든 경로를 볼 수 있습니다. flask shell app.url_map


1

플라스크 앱 내부에서 수행하는 작업 :

flask shell
>>> app.url_map
Map([<Rule '/' (OPTIONS, HEAD, GET) -> helloworld>,
 <Rule '/static/<filename>' (OPTIONS, HEAD, GET) -> static>])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.