ফ্লাস্কের একটি 'এন্ডপয়েন্ট' কী?


124

বোতল ডকুমেন্টেশন শো :

add_url_rule(*args, **kwargs)
      Connects a URL rule. Works exactly like the route() decorator.
      If a view_func is provided it will be registered with the endpoint.

     endpoint  the endpoint for the registered URL rule. Flask itself assumes the name of the view function as endpoint

একটি "শেষ পয়েন্ট" বলতে কী বোঝায়?

উত্তর:


267

ফ্লাস্ক রাউটিং কীভাবে কাজ করে

ফ্লাস্কের পুরো ধারণাটি (এবং অন্তর্নিহিত ওয়ার্কজেগ লাইব্রেরি) ইউআরএল পাথগুলি এমন কিছু যুক্তিতে ম্যাপ করা যা আপনি চালাবেন (সাধারণত, "ফাংশন দেখুন")। আপনার মূল দৃষ্টিভঙ্গি এরূপ সংজ্ঞায়িত করা হয়েছে:

@app.route('/greeting/<name>')
def give_greeting(name):
    return 'Hello, {0}!'.format(name)

মনে রাখবেন যে ফাংশনটি আপনি (add_url_rule) উল্লেখ করেছেন কেবলমাত্র ডেকরেটার স্বরলিপি ব্যবহার না করে একই লক্ষ্য অর্জন করে। অতএব, নিম্নলিখিতগুলি একই:

# No "route" decorator here. We will add routing using a different method below.
def give_greeting(name):
    return 'Hello, {0}!'.format(name)

app.add_url_rule('/greeting/<name>', 'give_greeting', give_greeting)

ধরা যাক আপনার ওয়েবসাইটটি 'www.example.org' এ অবস্থিত এবং উপরের দৃশ্যটি ব্যবহার করে। ব্যবহারকারী তাদের ব্রাউজারে নিম্নলিখিত URL টি প্রবেশ করে:

http://www.example.org/greeting/Mark

ফ্লাস্কের কাজ হ'ল এই ইউআরএলটি নেওয়া, ব্যবহারকারী কী করতে চায় তা নির্ধারণ এবং পরিচালনা করার জন্য এটি আপনার বহু অজগর ফাংশনগুলির মধ্যে একটিতে প্রেরণ করা। এটি পথ নেয় :

/greeting/Mark

... এবং এটি রুটের তালিকার সাথে মেলে। আমাদের ক্ষেত্রে, give_greetingফাংশনে যাওয়ার জন্য আমরা এই পথটি সংজ্ঞায়িত করেছি ।

তবে, ভিউ তৈরির বিষয়ে আপনি যেভাবে যেতে পারেন এটি আসলে আপনার কাছ থেকে কিছু অতিরিক্ত তথ্য এড়িয়ে যায় ab পর্দার আড়ালে, ফ্লাস্ক ইউআরএল থেকে ভিউ ফাংশনটিতে সরাসরি এই লিপটি করেনি যা এই অনুরোধটি পরিচালনা করতে পারে। এটি কেবল বলে না ...

URL (http://www.example.org/greeting/Mark) should be handled by View Function (the function "give_greeting")

প্রকৃতপক্ষে, এটির আরও একটি পদক্ষেপ রয়েছে, যেখানে এটি URL টি একটি শেষ পয়েন্টে মানচিত্র করে:

URL (http://www.example.org/greeting/Mark) should be handled by Endpoint "give_greeting".
Requests to Endpoint "give_greeting" should be handled by View Function "give_greeting"

মূলত, "এন্ডপয়েন্ট" হ'ল একটি শনাক্তকারী যা আপনার কোডের কোন যৌক্তিক ইউনিটের অনুরোধটি পরিচালনা করতে হবে তা নির্ধারণে ব্যবহৃত হয় । সাধারণত, একটি শেষ পয়েন্ট হ'ল ফাংশনটির নাম। তবে, আপনি আসলে শেষের অবস্থানটি পরিবর্তন করতে পারেন, যেমন নীচের উদাহরণে করা হয়েছে।

@app.route('/greeting/<name>', endpoint='say_hello')
def give_greeting(name):
    return 'Hello, {0}!'.format(name)

এখন, যখন ফ্লাস্ক অনুরোধটি প্রস্থান করবে, যুক্তিটি এই রকম দেখাচ্ছে:

URL (http://www.example.org/greeting/Mark) should be handled by Endpoint "say_hello".
Endpoint "say_hello" should be handled by View Function "give_greeting"

আপনি কীভাবে শেষ পয়েন্টটি ব্যবহার করেন

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

@app.route('/')
def index():
    print url_for('give_greeting', name='Mark') # This will print '/greeting/Mark'

@app.route('/greeting/<name>')
def give_greeting(name):
    return 'Hello, {0}!'.format(name)

এটি সুবিধাজনক, এখন যেমন আমরা সেই সংস্থানটি উল্লেখ করি সেখানে লাইনটি পরিবর্তন করার প্রয়োজন ছাড়াই আমাদের অ্যাপ্লিকেশনগুলির URL গুলি পরিবর্তন করতে পারি।

কেন সবসময় ভিউ ফাংশনটির নাম ব্যবহার করবেন না?

একটি প্রশ্ন আসতে পারে যা নিম্নলিখিতটি হ'ল: "আমাদের এই অতিরিক্ত স্তরটির প্রয়োজন কেন?" কেন একটি শেষ বিন্দুতে কোনও পাথ মানচিত্র, তারপরে একটি দর্শন ফাংশনটির একটি শেষ পয়েন্ট? কেন কেবল সেই মাঝের পদক্ষেপটি এড়িয়ে যাবেন না?

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

ব্লুপ্রিন্টগুলি আপনাকে এটিকে नेम স্পেসে আলাদা করতে দেয়। উদাহরণ স্বরূপ...

main.py:

from flask import Flask, Blueprint
from admin import admin
from user import user

app = Flask(__name__)
app.register_blueprint(admin, url_prefix='admin')
app.register_blueprint(user, url_prefix='user')

admin.py:

admin = Blueprint('admin', __name__)

@admin.route('/greeting')
def greeting():
    return 'Hello, administrative user!'

user.py:

user = Blueprint('user', __name__)
@user.route('/greeting')
def greeting():
    return 'Hello, lowly normal user!'

নোট করুন যে উভয় ব্লুপ্রিন্টগুলিতে, '/ গ্রিটিং' রুটটি "শুভেচ্ছা" বলে একটি ফাংশন। আমি যদি অ্যাডমিনকে "গ্রিটিং" ফাংশনটি উল্লেখ করতে চাইতাম, তবে আমি কেবল "গ্রিটিং" বলতে পারি না কারণ সেখানে একটি ব্যবহারকারী "গ্রিটিং" ফাংশন রয়েছে। এন্ডপয়েন্টগুলি প্রান্তের অংশ হিসাবে ব্লুপ্রিন্টের নাম নির্দিষ্ট করে আপনাকে এক ধরণের নেমস্পেসিংয়ের অনুমতি দেয়। সুতরাং, আমি নিম্নলিখিতগুলি করতে পারি ...

print url_for('admin.greeting') # Prints '/admin/greeting'
print url_for('user.greeting') # Prints '/user/greeting'

1
মূল সম্পর্কে url_forকেমন? আমি ত্রুটিটি পেয়েছিCould not build url for endpoint ''
টমসওয়ার

আমি আপনার ব্যাখ্যাটি সত্যই পছন্দ করেছি এবং এগুলি শেষের দিকগুলি কীভাবে কাজ করে সে সম্পর্কে এটি আমাকে একটি দুর্দান্ত ধারণা দিয়েছে। যাইহোক, এখন আমি এই ধারণাটি বুঝতে পেরেছি বলে আমি মনে করি যে আপনি ফ্লাস্কে বিশেষভাবে শেষ পয়েন্টগুলি নিয়ে একটি পয়েন্ট মিস করছেন। আপনি যদি শেষ পয়েন্টগুলি নির্দিষ্ট না করেন তবে url_for()এক্স বা ওয়াই কারণে কোনও ফাংশন / শ্রেণির নাম পরিবর্তন করে ফাংশনে আপনার নিয়মটি ভেঙে দেওয়া যেতে পারে (কেউ কোডটি রিফ্যাক্ট করেছেন এবং আরও উপযুক্ত নাম খুঁজে পেয়েছেন ইত্যাদি ...)। ফ্লাস্ক দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন শেষ পয়েন্টগুলি আপনাকে url- এর পরিবর্তনগুলি পরিচালনা করতে সহায়তা করে। সুস্পষ্ট শেষ পয়েন্ট আপনাকে ইউআরএল পরিবর্তন এবং আপনার ফানকের নাম পরিবর্তনগুলি মোকাবেলায় সহায়তা করে।
IMCoins

1
এটি ফ্লাস্কের শেষ পয়েন্টের কার্যকারিতা এবং সাধারণভাবে এমনকি শেষের দিকের সংজ্ঞাটি সম্পর্কে আমার বোঝার বিষয়টি পরিষ্কার করে দেয়। এছাড়াও কিছু টাইপও পেয়েছি। আপনার ভিউ ফাংশনটির give_greetingপরিবর্তে হওয়া উচিত নয় my_greeting? আমি my_greetingকোথাও দেখছি না ...
স্টিভোহ্মন

23

এন্ডপয়েন্টটি হ'ল নামটি যা ইউআরএল নিয়মের সাথে উল্টে-দেখার জন্য ব্যবহৃত হয় url_forএবং এটি ভিউ ফাংশনটির নামে ডিফল্ট হয়।

ছোট উদাহরণ:

from flask import Flask, url_for

app = Flask(__name__)

# We can use url_for('foo_view') for reverse-lookups in templates or view functions
@app.route('/foo')
def foo_view():
    pass

# We now specify the custom endpoint named 'bufar'. url_for('bar_view') will fail!
@app.route('/bar', endpoint='bufar')
def bar_view():
    pass

with app.test_request_context('/'):
    print url_for('foo_view')
    print url_for('bufar')
    # url_for('bar_view') will raise werkzeug.routing.BuildError
    print url_for('bar_view')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.