फ्लास्क ऐप में परिभाषित सभी मार्गों की सूची प्राप्त करें


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 - सबसे अधिक संभावना है कि जिस रूट से जुड़ा हुआ है DeleteEventउसके पास एक आवश्यक पैरामीटर है - आप या तो विशेष-केस कर सकते हैं कि कोई एक नियम या जहां कोई नियम फ़िल्टर करेंlen(rule.arguments) > len(rule.defaults)
Sean Vieira

ओह मुझे लगता है कि मैं समझ गया। url_forबिना पैरामीटर के उस मेथिड के लिए URL उत्पन्न नहीं किया जा सकता है, है ना? ठीक है, लेकिन ऐसा लगता है कि मेरा तरीका वैसे भी काम करता है, यह सिर्फ उस हिस्से को रखता है यदि URL एक पैरामीटर के रूप में। धन्यवाद!
जे-बॉब

1
यह एक महान शुरूआत है। पूरी तरह से स्व-दस्तावेजीकरण फ्लास्क-आधारित वेब सेवा बनाने के लिए कोई सुझाव, जहां सभी पैरामीटर (जैसे? स्पैम = "अंडे") सूचीबद्ध हैं? शायद यह जानकारी एक कार्यान्वयन विधि के डॉकस्ट्रिंग से निकाली जा सकती है।
लियोनिद

2
उपयोग के url_for(rule.endpoint)उपयोग के बजाय जो rule.ruleकि बेहतर बीकॉज के मामलों को हल करता है जहां आपके पास एक ही विधि के लिए एक से अधिक मार्ग हैं।
जिनी

84

मैं बस एक ही सवाल से मुलाकात की। उपरोक्त समाधान बहुत जटिल है। बस अपनी परियोजना के तहत एक नया खोल खोलें:

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

पहला ' ऐप ' मेरी प्रोजेक्ट स्क्रिप्ट है: app.py , दूसरा मेरे वेब का नाम है।

(यह समाधान छोटे मार्ग के साथ छोटे वेब के लिए है)


1
यह शायद सीधे सवाल का जवाब नहीं देता है। लेकिन यह यकीन है कि कई और upvotes के हकदार हैं।
अल्ट्राइंस्टिंक्ट

यह उत्तर आपको अपने आवेदन में किसी भी कोड को जोड़ने की आवश्यकता नहीं है। मैंने इसका उपयोग अपने कोड को फिर से बनाए बिना उत्तर में प्राप्त करने के लिए किया।
joshdick

"क्या उन सभी मार्गों की सूची प्राप्त करने का एक तरीका है जो मेरे पूरे ऐप में घोषित किए गए हैं?" मुझे लगता है कि यह सीधे प्रश्न का उत्तर देता है और स्वीकृत उत्तर होना चाहिए। इतना आसान। धन्यवाद।
औरो

2
मैं वास्तव में यह नहीं देखता कि स्वीकार किए गए उत्तर की तुलना में यह कितना सरल या स्पष्ट है। यह एक ही दृष्टिकोण का सुझाव दे रहा है, लेकिन इस बिंदु पर पहुंचने में अधिक समय लगता है और यह नहीं दिखाता है कि इसमें मौजूद Mapकिसी भी गुण के उदाहरण पर या उस पर कैसे पहुंचा Ruleजा सकता है, जिसके बिना आप वास्तव में कुछ भी उपयोगी नहीं कर सकते।
मार्क अमेरी

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

प्रबंधित करें और अधिक जानकारी के लिए: http://flask-script.readthedocs.org/en/latest/


5
उपरोक्त बहुत अच्छी तरह से काम करता है। बस बदलने urllib.unquoteके लिए urllib.parse.unquoteऔर print lineकरने के लिए print(line)है और यह अच्छी तरह से अजगर 3.x में काम करता है।
निचोड़

1
यह गैर-स्ट्रिंग तर्क के लिए काम नहीं करता है, मैं इसके बजाय जॉन जियांग के जवाब का उपयोग करने की सलाह देता हूं।
निको

42

जोनाथन के जवाब के समान मैंने इसके बजाय ऐसा करने का विकल्प चुना। मुझे url_for का उपयोग करने की बात नहीं दिखती क्योंकि यह टूट जाएगा यदि आपके तर्क स्ट्रिंग जैसे फ्लोट नहीं हैं

@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_APP='my_project.app' flask routes

यह बिल्कुल शानदार है!
पीफब्री

1
flask urlsमेरे लिए (0.12.1)। देखा कि flask --helpलेकिन मुझे CLI पृष्ठ पर रूट या यूआरएल दिखाई नहीं दे रहे हैं
mrgnw

मार्गों को फ्लास्क 1.1.2 में हटाया गया लगता है
जेरी जी

5

चूंकि आपने यह निर्दिष्ट नहीं किया था कि इसे कमांड-लाइन चलाया जाना है, इसलिए डैशबोर्ड या अन्य गैर-कमांड-लाइन इंटरफ़ेस के लिए निम्नलिखित को आसानी से json में लौटाया जा सकता है। परिणाम और आउटपुट वास्तव में किसी भी तरह से डिजाइन के नजरिए से कम नहीं होना चाहिए। यह खराब प्रोग्राम डिज़ाइन है, भले ही यह एक छोटा प्रोग्राम हो। नीचे दिए गए परिणाम का उपयोग वेब एप्लिकेशन, कमांड-लाइन या किसी और चीज में किया जा सकता है जो कि जन्स को अंतर्ग्रहण करता है।

आपने यह भी निर्दिष्ट नहीं किया कि आपको प्रत्येक मार्ग से जुड़े अजगर फ़ंक्शन को जानना है, इसलिए यह आपके मूल प्रश्न का सटीक उत्तर देता है।

मैं खुद को मॉनिटरिंग डैशबोर्ड में आउटपुट जोड़ने के लिए नीचे का उपयोग करता हूं। यदि आप उपलब्ध मार्ग विधियाँ (GET, POST, PUT, इत्यादि) चाहते हैं, तो आपको इसे अन्य उत्तरों के साथ संयोजित करना होगा।

नियम के पुनर्मुद्रण () मार्ग में आवश्यक तर्कों को परिवर्तित करने का ध्यान रखता है।

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>])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.