Flask'ta bir 'uç nokta' nedir?


125

Matara dokümantasyon gösterileri :

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

"Son nokta" ile tam olarak ne kastedilmektedir?

Yanıtlar:


267

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'

1
Nasıl url_forkök için? Hata yakaladımCould not build url for endpoint ''
TomSawyer

Açıklamanızı gerçekten beğendim ve bu uç noktaların nasıl çalıştığına dair bana güzel bir fikir verdi. Ancak, şimdi bu kavramı anladığıma göre, özellikle Flask'ta uç noktalar ile ilgili bir noktayı kaçırdığınızı düşünüyorum. Uç noktaları belirtmezseniz, url_for()işlevdeki kuralınız, X veya Y nedenleriyle bir işlevin / sınıfın adı değiştirilerek bozulabilir (birisi kodu yeniden düzenledi ve daha uygun bir ad buldu vb ...). Flask tarafından otomatik olarak oluşturulan uç noktalar, url değişikliklerini yönetmenize yardımcı olur. Açık uç nokta, işlevinizin url değişiklikleri ve ad değişiklikleri ile başa çıkmanıza yardımcı olur.
IMCoins

1
Bu, Flask'ın uç nokta işlevselliği konusundaki anlayışımı ve belki de genel olarak uç noktanın tanımını gerçekten temizliyor. Ayrıca bazı yazım hatası buldum. Bunun give_greetingyerine Görünüm işleviniz olmamalı my_greetingmı? Hiçbir my_greetingyerde
görmüyorum

23

Uç nokta, url kurallarını geriye doğru aramak için kullanılan addır url_forve varsayılan olarak görünüm işlevinin adıdır.

Küçük örnek:

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')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.