ফ্লাস্ক অ্যাপে সংজ্ঞায়িত সমস্ত রুটের তালিকা পান


145

আমার কাছে একটি জটিল ফ্লাস্ক-ভিত্তিক ওয়েব অ্যাপ্লিকেশন রয়েছে। ভিউ ফাংশন সহ আলাদা আলাদা ফাইল রয়েছে। তাদের ইউআরএলগুলি @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। কোনও ধারণা কেন আপনার পদ্ধতিটি আমার পক্ষে কাজ করে না?
জে-বব

@ জে-বব - সম্ভবত এর সাথে সম্পর্কিত রুটটির DeleteEventএকটি প্রয়োজনীয় প্যারামিটার রয়েছে - আপনি বিশেষ বিশেষ ক্ষেত্রে এটি করতে পারেন বা যে কোনও নিয়ম ফিল্টার করে দিতে পারেনlen(rule.arguments) > len(rule.defaults)
সান ভিইরা

ওহ আমি মনে করি এটি পেয়েছি। url_forকোনও পরামিতি ছাড়াই সেই মেথিডের জন্য ইউআরএল তৈরি করতে পারে না? ঠিক আছে, তবে দেখে মনে হচ্ছে যে আমার পদ্ধতিটি যাইহোক কাজ করে, এটি পরামিতি হিসাবে যদি URL টি থাকে তবে কেবল সেই অংশটি রাখে। ধন্যবাদ!
জে-বব

1
এই একটি দুর্দান্ত শুরু। সম্পূর্ণ স্ব-ডকুমেন্টিং ফ্লাস্ক-ভিত্তিক ওয়েব পরিষেবা কীভাবে তৈরি করা যায় তার জন্য কোনও পরামর্শ, যেখানে সমস্ত পরামিতি (যেমন? স্প্যাম = "ডিম") তালিকাভুক্ত করা হয়েছে? সম্ভবত এই তথ্যটি একটি প্রয়োগকারী পদ্ধতির একটি ডাস্ট্রিং থেকে বের করা যেতে পারে।
লিওনিড

2
পরিবর্তে ব্যবহারের url_for(rule.endpoint)ব্যবহার rule.ruleযে অনেক ভালো beacause ক্ষেত্রে যেখানে আপনি একই পদ্ধতির জন্য একটির বেশি রুট আছে সমাধানের জন্য।
জিনি

82

আমি সবেমাত্র একই প্রশ্নের সাথে দেখা করেছি। উপরে সমাধানগুলি খুব জটিল। আপনার প্রকল্পের অধীনে কেবল একটি নতুন শেল খুলুন:

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

প্রথম ' অ্যাপ ' হ'ল আমার প্রকল্প স্ক্রিপ্ট: app.py , অন্যটি আমার ওয়েবের নাম।

(এই সমাধানটি একটি সামান্য রুটের ছোট্ট ওয়েবের জন্য)


1
এটি সম্ভবত সরাসরি প্রশ্নের উত্তর দেয় না। তবে এটি অবশ্যই আরও অনেকগুলি উপার্জনের দাবিদার।
আল্ট্রা ইন্টিস্টিন্ট

এই উত্তরটি আপনাকে আপনার অ্যাপ্লিকেশনটিতে কোনও কোড যুক্ত করার প্রয়োজন নেই তার জন্য দুর্দান্ত। আমি আমার কোডটি পুনর্নির্মাণ না করে সেকেন্ডে চেয়েছিলাম উত্তর পেতে এটি ব্যবহার করেছি।
জোশডিক

"আমার অ্যাপ্লিকেশন জুড়ে ঘোষণা করা সমস্ত রুটের একটি তালিকা পাওয়ার কী উপায় আছে?" আমি মনে করি এটি সরাসরি প্রশ্নের উত্তর দেয় এবং এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। খুব সহজ. ধন্যবাদ।
andho

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 কাজ করে।
squeegee

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

এটি একেবারে উজ্জ্বল!
pfabri 22'19

1
flask urlsআমার জন্য (0.12.1)। দেখেছি flask --helpকিন্তু আমি সিএলআই পৃষ্ঠায় রুট বা url দেখতে পাচ্ছি না
mrgnw

রুটগুলি ফ্ল্যাশ 1.1.2-এ সরানো হয়েছে বলে মনে হচ্ছে
জেরি জি

5

যেহেতু আপনি এটি নির্দিষ্ট করেননি যে এটি কমান্ড-লাইনটি চালিত হতে হবে, নীচে সহজেই ড্যাশবোর্ড বা অন্যান্য নন-কমান্ড-লাইন ইন্টারফেসের জন্য জসন-এ ফিরে আসা যেতে পারে। ফলাফল এবং আউটপুটটি কোনওভাবেই ডিজাইনের দৃষ্টিকোণ থেকে একত্রিত হওয়া উচিত নয়। এটি একটি ছোট প্রোগ্রাম হলেও এটি খারাপ প্রোগ্রাম ডিজাইন। এরপরে নীচের ফলাফলটি ওয়েব অ্যাপ্লিকেশন, কমান্ড-লাইন বা জেসনকে আটকানো অন্য যে কোনও কিছুতে ব্যবহার করা যেতে পারে।

আপনি প্রতিটি রুটের সাথে যুক্ত অজগর ফাংশনটি জানা দরকার তাও নির্দিষ্ট করেননি, সুতরাং এটি আপনার মূল প্রশ্নের আরও স্পষ্টভাবে উত্তর দেয়।

আমি নিজে একটি পর্যবেক্ষণ ড্যাশবোর্ডে আউটপুট যুক্ত করতে নীচে ব্যবহার করি। আপনি যদি উপলভ্য রুট পদ্ধতিগুলি (জিইটি, পোষ্ট, পুট, ইত্যাদি) চান তবে আপনার উপরের অন্যান্য উত্তরগুলির সাথে এটি একত্রিত করতে হবে।

রুল এর 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.