Apa yang dimaksud dengan 'titik akhir' di Flask?


125

The Flask dokumentasi menunjukkan :

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

Apa sebenarnya yang dimaksud dengan "titik akhir"?

Jawaban:


267

Cara Kerja Flask Routing

Ide keseluruhan dari Flask (dan pustaka Werkzeug yang mendasari) adalah untuk memetakan jalur URL ke beberapa logika yang akan Anda jalankan (biasanya, "fungsi tampilan"). Tampilan dasar Anda didefinisikan seperti ini:

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

Perhatikan bahwa fungsi yang Anda rujuk (add_url_rule) mencapai tujuan yang sama, hanya tanpa menggunakan notasi penghias. Oleh karena itu, berikut ini adalah sama:

# 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)

Katakanlah situs web Anda terletak di 'www.example.org' dan menggunakan tampilan di atas. Pengguna memasukkan URL berikut ke browser mereka:

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

Tugas Flask adalah mengambil URL ini, mencari tahu apa yang ingin dilakukan pengguna, dan meneruskannya ke salah satu dari banyak fungsi python Anda untuk ditangani. Itu mengambil jalan :

/greeting/Mark

... dan mencocokkannya dengan daftar rute. Dalam kasus kami, kami menentukan jalur ini untuk menuju ke give_greetingfungsi.

Namun, meskipun ini adalah cara umum yang Anda lakukan untuk membuat tampilan, ini sebenarnya mengabstraksi beberapa info tambahan dari Anda. Di balik layar, Flask tidak melakukan lompatan langsung dari URL ke fungsi tampilan yang seharusnya menangani permintaan ini. Itu tidak hanya mengatakan ...

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

Sebenarnya, ini adalah langkah lain, yaitu memetakan URL ke titik akhir:

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"

Pada dasarnya, "titik akhir" adalah pengenal yang digunakan untuk menentukan unit logis apa dari kode Anda yang harus menangani permintaan tersebut . Biasanya, titik akhir hanyalah nama dari fungsi tampilan. Namun, Anda sebenarnya dapat mengubah titik akhir, seperti yang dilakukan pada contoh berikut.

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

Sekarang, ketika Flask merutekan permintaan, logikanya terlihat seperti ini:

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"

Bagaimana Anda Menggunakan Titik Akhir

Titik akhir biasanya digunakan untuk "pencarian terbalik". Misalnya, dalam satu tampilan aplikasi Flask Anda, Anda ingin mereferensikan tampilan lain (mungkin saat Anda menautkan dari satu area situs ke situs lain). Daripada membuat kode keras URL, Anda dapat menggunakan url_for(). Asumsikan yang berikut ini

@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)

Ini menguntungkan, karena sekarang kita dapat mengubah URL aplikasi kita tanpa perlu mengubah baris tempat kita mereferensikan sumber daya itu.

Mengapa tidak selalu menggunakan nama fungsi tampilan?

Satu pertanyaan yang mungkin muncul adalah sebagai berikut: "Mengapa kita membutuhkan lapisan tambahan ini?" Mengapa memetakan jalur ke titik akhir, lalu titik akhir ke fungsi tampilan? Mengapa tidak melewati langkah tengah itu saja?

Alasannya karena cara ini lebih kuat. Misalnya, Flask Blueprints memungkinkan Anda untuk membagi aplikasi Anda menjadi beberapa bagian. Saya mungkin memiliki semua sumber daya sisi admin saya dalam cetak biru yang disebut "admin", dan semua sumber daya tingkat pengguna saya di titik akhir yang disebut "pengguna".

Cetak biru memungkinkan Anda untuk memisahkan ini menjadi ruang nama. Sebagai contoh...

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!'

Perhatikan bahwa di kedua cetak biru, rute '/ salam' adalah fungsi yang disebut "salam". Jika saya ingin merujuk ke fungsi "salam" admin, saya tidak bisa hanya mengucapkan "salam" karena ada juga fungsi "salam" pengguna. Titik akhir memungkinkan semacam namespacing dengan meminta Anda menentukan nama cetak biru sebagai bagian dari titik akhir. Jadi, saya bisa melakukan hal berikut ...

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

1
Bagaimana dengan url_forroot? Saya menangkap kesalahanCould not build url for endpoint ''
TomSawyer

Saya sangat menyukai penjelasan Anda, dan itu memberi saya ide bagus tentang cara kerja titik akhir ini. Namun, sekarang setelah saya memahami konsep ini, saya pikir Anda kehilangan satu poin tentang titik akhir, khususnya di Flask. Jika Anda tidak menentukan titik akhir, aturan Anda dalam url_for()fungsi tersebut dapat rusak dengan mengubah nama fungsi / kelas karena alasan X atau Y (seseorang mengubah kode dan menemukan nama yang lebih sesuai, dll ...). Endpoint yang dibuat secara otomatis oleh Flask membantu Anda menangani perubahan url. Titik akhir eksplisit membantu Anda menangani perubahan url dan perubahan nama dari func Anda.
IMCoins

1
Ini benar-benar memperjelas pemahaman saya tentang fungsionalitas titik akhir Flask dan bahkan mungkin definisi titik akhir secara umum. Saya juga menemukan beberapa kesalahan ketik. Tidak harus Lihat fungsi Anda menjadi give_greetingbukan my_greeting? Saya tidak melihat di my_greetingmana pun ..
steveohmn

23

Endpoint adalah nama yang digunakan untuk mencari-balik aturan url dengan url_fordan defaultnya adalah nama fungsi tampilan.

Contoh kecil:

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')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.