programing

플라스크 앱에 정의된 모든 경로 목록 가져오기

telecom 2023. 6. 9. 21:45
반응형

플라스크 앱에 정의된 모든 경로 목록 가져오기

저는 복잡한 플라스크 기반의 웹 앱을 가지고 있습니다.보기 기능이 있는 별도의 파일이 많이 있습니다.해당 URL은 다음을 사용하여 정의됩니다.@app.route('/...')장식가제 앱 전체에서 선언된 모든 경로의 목록을 얻을 수 있는 방법이 있나요?아마도 제가 전화할 수 있는 방법이 있을 것입니다.app목적어?

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

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

자세한 내용은 만들어진 새 웹 페이지에 대한 링크 표시를 참조하십시오.

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

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

첫 번째 ''은 제 프로젝트 스크립트인 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

관리에 대한 더 많은 정보.파이 체크아웃: http://flask-script.readthedocs.org/en/latest/

0.11 버전부터 플라스크에는 CLI가 내장되어 있습니다.기본 제공 명령 중 하나는 다음 경로를 나열합니다.

FLASK_APP='my_project.app' flask routes

조나단의 대답과 비슷하게 저는 대신 이것을 하기로 결정했습니다.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)

플라스크 프로젝트가 있는 디렉토리에서 cli 명령을 사용합니다.

flask routes

명령줄을 실행해야 한다고 지정하지 않았기 때문에 대시보드 또는 기타 비명령줄 인터페이스의 경우 json에서 다음을 쉽게 반환할 수 있습니다.어쨌든 결과와 결과는 디자인 관점에서 혼합되어서는 안 됩니다.그것은 작은 프로그램이라도 나쁜 프로그램 디자인입니다.그런 다음 아래의 결과를 웹 응용 프로그램, 명령줄 또는 json을 수집하는 다른 모든 프로그램에 사용할 수 있습니다.

또한 각 경로와 관련된 파이썬 함수를 알아야 한다고 지정하지 않았기 때문에, 이것은 당신의 원래 질문에 더 정확하게 답합니다.

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

규칙의 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사용하다

예제 스크립트:

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>

(플라스크에서 자동으로 생성되는 "정적" 경로가 포함되어 있습니다.)

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

플라스크 앱에서 다음을 수행합니다.

flask shell
>>> app.url_map
Map([<Rule '/' (OPTIONS, HEAD, GET) -> helloworld>,
 <Rule '/static/<filename>' (OPTIONS, HEAD, GET) -> static>])
print(app.url_map)

즉, 플라스크 애플리케이션 이름이 'app'인 경우입니다.

플라스크 앱 인스턴스의 속성입니다.

https://flask.palletsprojects.com/en/2.1.x/api/ #flask.Flask.url_map을 참조하십시오.

언급URL : https://stackoverflow.com/questions/13317536/get-list-of-all-routes-defined-in-the-flask-app

반응형