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_for
루트? 나는 오류 사로 잡았Could not build url for endpoint ''