Flask에서 url_for를 사용하여 동적 URL 만들기

Salman Mehmood 2022년8월18일
Flask에서 url_for를 사용하여 동적 URL 만들기

이 설명을 통해 url_for() 함수가 하는 일과 Flask에서 동적 URL을 만드는 방법을 배웁니다. 템플릿 내에서 url_for()를 사용하는 방법도 배웁니다.

Flask의 url_for() 함수를 사용하여 동적 URL 만들기

url_for()는 특정 보기 함수에 사용된 URL을 반환하는 Flask의 함수입니다. 그리고 해당 URL을 사용하여 사용자를 해당 페이지로 리디렉션하거나 해당 URL만 표시할 수 있습니다.

시연하기 위해 어떻게 하는지 보여드리겠습니다. 이제 url_forredirect와 함께 Flask 가져오기를 시작하겠습니다.

from flask import Flask, url_for, redirect

이것은 이 예제에서 사용할 두 가지 기능이며 BASE_FUNC() 보기에 경로가 있습니다.

@app.route("/")
def BASE_FUNC():
    return "Hi there,the base index page"

이제 FIRST_FUNC라고 하는 또 다른 경로를 만들고 다른 함수의 이름인 url_for('BASE_FUNC')를 반환합니다. url_for() 함수는 함수 이름을 취하고 url_for() 함수 내부에 전달한 해당 함수의 경로를 반환합니다.

@app.route("/first")
def FIRST_FUNC():
    return url_for("BASE_FUNC")

이 경로 /first에 액세스하려고 하면 BASE_FUNC() 함수와 연결된 URL을 얻게 됩니다. 즉, 해당 경로를 얻게 됩니다. 이것을 저장하고 서버를 실행해보자.

이 끝점 /first를 입력하면 슬래시만 표시됩니다.

Flask url_for 출력 1

다른 경로를 만들고 함수 이름이 SECOND_FUNC()/second라고 하면 url_for('THIRD_FUNC', user_name='Harry')를 반환합니다. Flask에서 경로는 매개변수와도 작동하므로 문자열이 될 매개변수를 사용하여 다른 경로를 생성해야 합니다.

/third/<string:user_name>과 같은 경로를 만들고 url_for() 함수를 전달할 때 경로 내에서 동일한 이름의 매개변수를 사용하고 있는지 확인합니다. 이제 THIRD_FUNC()라는 새 함수를 만들고 동일한 이름의 매개변수를 전달합니다.

user_name 매개변수를 반환하고 url_for() 함수를 사용하여 다른 함수의 경로에서 이 함수에 액세스합니다.

@app.route("/second")
def SECOND_FUNC():
    return url_for("THIRD_FUNC", user_name="Harry")


@app.route("/third/<string:user_name>")
def THIRD_FUNC(user_name):
    return "The user name is " + user_name

/second를 입력하면 THIRD_FUNC() 함수의 경로가 표시됩니다.

Flask url_for 출력 2

URL 또는 링크를 사용하여 사용자를 Flask 애플리케이션의 특정 페이지로 리디렉션할 수 있으며 이제 URL만 반환하는 대신 사용자를 특정 URL로 리디렉션할 수 있습니다. 사용자를 리디렉션하려는 URL을 가져오는 redirect() 함수를 호출해야 합니다.

redirect(url_for("THIRD_FUNC", user_name="Harry"))

이제 /second를 호출하면 /third/<string:user_name> 경로의 URL을 가져와서 세 번째 경로로 보냅니다.

Flask url_for 출력 3

이제 Jinja 템플릿을 사용하여 템플릿 내에서 url_for()를 사용하는 방법을 보여줍니다. render_template()을 가져와 index.html이라는 HTML 파일을 렌더링하는 데 사용합니다. 우리는 문자열을 반환할 다른 경로를 사용할 것입니다.

@app.route("/")
def BASE_FUNC():
    return render_template("index.html")


@app.route("/page")
def Page_FUNC():
    return "Hello"

템플릿 폴더 안에 index.html 파일을 만들고 /page 경로에 대한 링크를 추가합니다. 링크를 전달하는 대신 url_for() 내부에 Page_FUNC를 전달합니다.

<a href="{{url_for('Page')}}">Page</a>

페이지를 저장하고 새로고침해 보겠습니다.

Flask url_for 출력 4

이제 우리는 그것을 조금 더 복잡하게 만들 것입니다. 매개변수가 될 /page와 함께 전달할 수 있는 동적 요소를 추가합니다. 두 번째 키워드 인수가 해당 경로 함수에 전달해야 하는 인수가 될 수 있도록 템플릿 내부에서 이 매개변수를 사용합니다.

이 경우 user_nameJosh와 같습니다.

<a href="{{ url_for('Page_FUNC',user_name='Josh') }}">Page</a>

출력:

Flask url_for 출력 5

완전한 Python 소스 코드:

from flask import Flask, url_for, render_template

app = Flask(__name__)

# @app.route("/")
# def BASE_FUNC():
#    return "Hi there,the base index page"

# @app.route("/first")
# def FIRST_FUNC():
#    return url_for('BASE_FUNC')

# @app.route("/second")
# def SECOND_FUNC():
#    return redirect(url_for('THIRD_FUNC', user_name='Harry'))


# @app.route("/third/<string:user_name>")
# def THIRD_FUNC(user_name):
#    return "The user name is " + user_name


@app.route("/")
def BASE_FUNC():
    return render_template("index.html")


@app.route("/page/<string:user_name>")
def Page_FUNC(user_name):
    return "Hello " + user_name


if __name__ == "__main__":
    app.run(debug=True)

완전한 HTML 소스 코드:

<html>
    <head>
        <body>
            <h1>Hi User, this is Base page</h1>
            <a href="{{ url_for('Page_FUNC',user_name='Josh') }}">Page</a>
        </body>
    </head>
</html>
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn