[python] Flask에서 ‘종점’이란 무엇입니까?

플라스크 문서 쇼 :

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

“종점”이란 정확히 무엇을 의미합니까?



답변

Flask 라우팅 작동 방식

Flask (및 기본 Werkzeug 라이브러리)의 전체 개념은 URL 경로를 실행할 로직 (일반적으로 “보기 기능”)에 매핑하는 것입니다. 기본보기는 다음과 같이 정의됩니다.

@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

Flask의 역할은이 URL을 가져 와서 사용자가 원하는 작업을 파악한 다음 처리를 위해 많은 Python 함수 중 하나에 전달하는 것입니다. 그것은 걸리는 경로를 :

/greeting/Mark

… 경로 목록과 일치시킵니다. 이 경우 give_greeting함수 로 이동하기 위해이 경로를 정의했습니다 .

그러나 이것이 뷰를 만드는 일반적인 방법이지만 실제로는 추가 정보를 추상화합니다. 이면에서 Flask는 URL에서이 요청을 처리해야하는 뷰 함수로 직접 도약하지 않았습니다. 단순히 말하지 않습니다 …

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)

이제 Flask가 요청을 라우팅 할 때 논리는 다음과 같습니다.

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"

엔드 포인트 사용 방법

끝점은 일반적으로 “역방향 조회”에 사용됩니다. 예를 들어 Flask 애플리케이션의 한보기에서 다른보기를 참조하려고합니다 (사이트의 한 영역에서 다른 영역으로 링크하는 경우). 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을 변경할 수 있으므로 이점이 있습니다.

항상 뷰 함수의 이름을 사용하지 않는 이유는 무엇입니까?

제기 될 수있는 한 가지 질문은 다음과 같습니다. “이 추가 레이어가 왜 필요한가요?” 경로를 엔드 포인트에 매핑 한 다음 엔드 포인트를 뷰 함수에 매핑하는 이유는 무엇입니까? 왜 중간 단계를 건너 뛰지 않습니까?

그 이유는이 방법이 더 강력하기 때문입니다. 예를 들어 Flask Blueprints를 사용하면 애플리케이션을 다양한 부분으로 분할 할 수 있습니다. “admin”이라는 청사진에 모든 관리자 측 리소스가 있고 “user”라는 엔드 포인트에 모든 사용자 수준 리소스가있을 수 있습니다.

블루 프린트를 사용하면이를 네임 스페이스로 분리 할 수 ​​있습니다. 예를 들면 …

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

두 청사진에서 ‘/ greeting’경로는 “greeting”이라는 기능입니다. 관리자 “인사”기능을 참조하고 싶을 때 사용자 “인사”기능도 있기 때문에 “인사”라고만 말할 수는 없습니다. 엔드 포인트는 블루 프린트의 이름을 엔드 포인트의 일부로 지정함으로써 일종의 네임 스페이스를 허용합니다. 그래서 다음을 할 수 있습니다 …

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


답변

끝점은 URL 규칙을 역 검색하는 데 사용되는 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')


답변