답변:
응용 프로그램의 모든 경로 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
조금 더 자세한 정보는 작성된 새 웹 페이지에 대한 링크 표시를 참조하십시오 .
DeleteEvent
에 필요한 매개 변수 가 있을 가능성이 높습니다. 다음 중 하나를 특별하게 처리하거나 규칙을 필터링 할 수 있습니다.len(rule.arguments) > len(rule.defaults)
url_for
매개 변수없이 해당 methid에 대한 URL을 생성 할 수 없습니다. 좋아,하지만 어쨌든 내 방법이 작동하는 것처럼 보입니다 .URL이 매개 변수 인 경우 해당 부분을 유지합니다. 감사!
url_for(rule.endpoint)
방법 대신 rule.rule
동일한 방법에 대해 둘 이상의 경로가있는 경우를 해결하는 것이 훨씬 좋습니다.
방금 같은 질문을 만났습니다. 위의 솔루션은 너무 복잡합니다. 프로젝트에서 새 쉘을 열기 만하면됩니다.
python
>>> from app import app
>>> app.url_map
첫 번째 ' app '은 내 프로젝트 스크립트 app.py 이고 다른 하나는 내 웹 이름입니다.
(이 솔루션은 경로가 적은 작은 웹용입니다)
Map
하는 데 시간이 오래 걸리며 인스턴스 를 반복 하거나 인스턴스의 속성에 액세스 하는 방법을 보여주지 Rule
않으면 실제로 유용한 작업을 수행 할 수 없습니다.
내 도우미 방법을 만듭니다 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/
urllib.unquote
에 urllib.parse.unquote
와 print line
에 print(line)
그것은뿐만 아니라 파이썬 3.x를 작동합니다.
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)
명령 행을 실행하도록 지정하지 않았으므로 대시 보드 또는 기타 비 명령 행 인터페이스에 대해 다음을 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>
플라스크가 자동으로 생성하는 "정적"경로를 포함합니다.
플라스크 앱 내부에서 수행하는 작업 :
flask shell
>>> app.url_map
Map([<Rule '/' (OPTIONS, HEAD, GET) -> helloworld>,
<Rule '/static/<filename>' (OPTIONS, HEAD, GET) -> static>])
url = url_for(rule.endpoint)
. 방금이 오류가 발생했습니다BuildError: ('DeleteEvent', {}, None)
. 대신 URL을 얻으려면 방금했습니다url = rule.rule
. 왜 당신의 방법이 저에게 효과적이지 않습니까?