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_greeting
fungsi.
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'
url_for
root? Saya menangkap kesalahanCould not build url for endpoint ''