Flask Yönlendirme Nasıl Çalışır?
Flask'ın (ve temeldeki Werkzeug kitaplığının) tüm fikri, URL yollarını çalıştıracağınız bir mantıkla (tipik olarak, "görünüm işlevi") eşlemektir. Temel görüşünüz şu şekilde tanımlanır:
@app.route('/greeting/<name>')
def give_greeting(name):
return 'Hello, {0}!'.format(name)
Bahsettiğiniz işlevin (add_url_rule), sadece dekoratör gösterimini kullanmadan aynı hedefe ulaştığını unutmayın. Bu nedenle, aşağıdaki aynıdır:
# 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)
Web sitenizin "www.example.org" adresinde bulunduğunu ve yukarıdaki görünümü kullandığını varsayalım. Kullanıcı, tarayıcısına aşağıdaki URL'yi girer:
http://www.example.org/greeting/Mark
Flask'ın görevi, bu URL'yi almak, kullanıcının ne yapmak istediğini anlamak ve onu işlemesi için birçok python işlevinizden birine iletmektir. Şu yolu alır :
/greeting/Mark
... ve onu rota listesiyle eşleştirir. Bizim durumumuzda, give_greetingişleve gitmek için bu yolu tanımladık .
Bununla birlikte, bir görünüm oluşturmanın tipik yolu bu olsa da, aslında sizden bazı ekstra bilgiler çıkarır. Perde arkasında, Flask doğrudan URL'den bu isteği yerine getirmesi gereken görüntüleme işlevine sıçrama yapmadı. Basitçe şunu söylemiyor ...
URL (http://www.example.org/greeting/Mark) should be handled by View Function (the function "give_greeting")
Aslında, URL'yi bir uç noktaya eşlediği başka bir adım daha var:
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"
Temel olarak, "uç nokta", kodunuzun hangi mantıksal biriminin isteği işleyeceğini belirlemede kullanılan bir tanımlayıcıdır . Normalde, bir uç nokta yalnızca bir görünüm işlevinin adıdır. Ancak, aşağıdaki örnekte yapıldığı gibi aslında uç noktayı değiştirebilirsiniz.
@app.route('/greeting/<name>', endpoint='say_hello')
def give_greeting(name):
return 'Hello, {0}!'.format(name)
Şimdi, Flask isteği yönlendirdiğinde mantık şöyle görünür:
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"
Uç Noktayı Nasıl Kullanıyorsunuz?
Uç nokta genellikle "geriye doğru arama" için kullanılır. Örneğin, Flask uygulamanızın bir görünümünde, başka bir görünüme başvurmak istiyorsunuz (belki sitenin bir alanından diğerine bağlanırken). URL'yi sabit kodlamak yerine kullanabilirsiniz url_for(). Aşağıdakileri varsayın
@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)
Bu avantajlıdır, çünkü artık bu kaynağa referans verdiğimiz satırı değiştirmeye gerek kalmadan uygulamamızın URL'lerini değiştirebiliriz.
Neden her zaman görünüm işlevinin adını kullanmıyorsunuz?
Akla gelebilecek bir soru şudur: "Bu ekstra katmana neden ihtiyacımız var?" Neden bir uç noktaya bir yol, ardından bir görünüm işlevine bir uç nokta eşlemelisiniz? Neden bu orta adımı atlamıyorsunuz?
Nedeni, bu şekilde daha güçlü olmasıdır. Örneğin, Flask Blueprints , uygulamanızı çeşitli bölümlere ayırmanıza izin verir. Yönetici tarafı kaynaklarımın tümü "yönetici" adlı bir planda ve kullanıcı düzeyindeki tüm kaynaklarım "kullanıcı" adlı bir uç noktada olabilir.
Taslaklar bunları ad alanlarına ayırmanıza izin verir. Örneğin...
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!'
Her iki planda da "/ selamlama" rotasının "selamlama" adı verilen bir işlev olduğuna dikkat edin. Yönetici "karşılama" işlevine başvurmak isteseydim, yalnızca "selamlama" diyemezdim çünkü bir kullanıcı "karşılama" işlevi de var. Uç noktalar, planın adını uç noktanın bir parçası olarak belirtmenizi sağlayarak bir tür ad aralığına izin verir. Yani aşağıdakileri yapabilirim ...
print url_for('admin.greeting') # Prints '/admin/greeting'
print url_for('user.greeting') # Prints '/user/greeting'
url_forkök için? Hata yakaladımCould not build url for endpoint ''