수색…


소개

플라스크 (Flask)는 Pintrest, Twilio 및 Linkedin을 비롯한 주요 웹 사이트를 실행하는 데 사용되는 Python 마이크로 웹 프레임 워크입니다. 이 항목에서는 프런트 엔드 및 백엔드 웹 개발에 대해 Flask가 제공하는 다양한 기능을 설명하고 보여줍니다.

통사론

  • @ app.route ( "/ urlpath", methods = [ "GET", "POST", "DELETE", "PUTS", "HEAD", "OPTIONS"])
  • @ app.route ( "/ urlpath / <param>", methods = [ "GET", "POST", "DELETE", "PUTS", "HEAD", "OPTIONS"])

기본 사항

다음 예제는 기본 서버의 예입니다.

# Imports the Flask class
from flask import Flask
# Creates an app and checks if its the main or imported
app = Flask(__name__)

# Specifies what URL triggers hello_world()
@app.route('/')
# The function run on the index route
def hello_world():
    # Returns the text to be displayed
    return "Hello World!"

# If this script isn't an import
if __name__ == "__main__":
    # Run the app until stopped
    app.run()

모든 올바른 종속성이 설치된이 스크립트를 실행하면 로컬 서버가 시작됩니다. 호스트는 일반적으로 localhost 라고하는 127.0.0.1 입니다. 이 서버는 기본적으로 포트 5000에서 실행됩니다. 웹 서버에 액세스하려면 웹 브라우저를 열고 URL localhost:5000 또는 127.0.0.1:5000 입력하십시오 (차이는 없음). 현재 컴퓨터 만 웹 서버에 액세스 할 수 있습니다.

app.run() 에는 host , portdebug의 세 가지 매개 변수가 있습니다. 호스트는 기본적으로 127.0.0.1 이지만이 값을 0.0.0.0 설정하면 URL의 개인 IP 주소를 사용하여 네트워크의 모든 장치에서 웹 서버에 액세스 할 수 있습니다. 포트는 기본적으로 5000이지만 매개 변수가 포트 80 설정된 경우 브라우저는 기본적으로 포트 80을 사용하므로 포트 번호를 지정할 필요가 없습니다. 디버그 옵션의 경우 개발 프로세스 동안 (프로덕션에서는 사용하지 않음)이 매개 변수를 True로 설정하는 것이 도움이됩니다. 변경 사항이 Flask 프로젝트에 적용되면 서버가 다시 시작됩니다.

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

라우팅 URL

Flask에서는 URL 라우팅이 전통적으로 데코레이터를 사용하여 수행됩니다. 이 데코레이터는 매개 변수가있는 URL 라우팅뿐만 아니라 정적 라우팅에도 사용할 수 있습니다. 다음 예제에서는 Flask 스크립트가 www.example.com 웹 사이트를 실행하고 있다고 www.example.com 합니다.

@app.route("/")
def index():
    return "You went to www.example.com"

@app.route("/about")
def about():
    return "You went to www.example.com/about"

@app.route("/users/guido-van-rossum")
    return "You went to www.example.com/guido-van-rossum"

마지막 경로를 사용하면 / users / 및 프로필 이름이있는 URL이 제공되면 프로필을 반환 할 수 있습니다. Flask는 모든 사용자에 대해 @app.route() 를 포함시키는 것이 엄청나게 비효율적이며 지저분 할 @app.route() URL에서 매개 변수를 @app.route() 합니다.

@app.route("/users/<username>")
def profile(username):
    return "Welcome to the profile of " + username

cities = ["OMAHA", "MELBOURNE", "NEPAL", "STUTTGART", "LIMA", "CAIRO", "SHANGHAI"]

@app.route("/stores/locations/<city>")
def storefronts(city):
    if city in cities:
        return "Yes! We are located in " + city
    else:
        return "No. We are not located in " + city

HTTP 메소드

가장 일반적인 두 가지 HTTP 메소드는 GETPOST 입니다. Flask는 사용 된 HTTP 메소드에 따라 동일한 URL에서 다른 코드를 실행할 수 있습니다. 예를 들어 계정이있는 웹 서비스에서는 로그인 페이지와 로그인 과정을 동일한 URL을 통해 라우팅하는 것이 가장 편리합니다. POST 요청 (로그인 데이터 포함)은 별도로 처리해야하는 반면 브라우저에서 URL을 열 때 생성되는 GET 요청은 로그인 양식을 표시해야합니다. DELETE 및 PUT HTTP 메소드를 처리하기위한 라우트도 작성됩니다.

@app.route("/login", methods=["GET"])
def login_form():
    return "This is the login form"
@app.route("/login", methods=["POST"])
def login_auth():
    return "Processing your data"
@app.route("/login", methods=["DELETE", "PUT"])
def deny():
    return "This method is not allowed"

코드를 단순화하기 위해 플라스크에서 request 패키지를 가져올 수 있습니다.

from flask import request

@app.route("/login", methods=["GET", "POST", "DELETE", "PUT"])
def login():
    if request.method == "DELETE" or request.method == "PUT":
        return "This method is not allowed"
    elif request.method == "GET":
        return "This is the login forum"
    elif request.method == "POST":
        return "Processing your data"

POST 요청에서 데이터를 검색하려면 request 패키지를 사용해야합니다.

from flask import request
@app.route("/login", methods=["GET", "POST", "DELETE", "PUT"])
def login():
    if request.method == "DELETE" or request.method == "PUT":
        return "This method is not allowed"
    elif request.method == "GET":
        return "This is the login forum"
    elif request.method == "POST":
        return "Username was " + request.form["username"] + " and password was " + request.form["password"]

파일 및 템플릿

return 문에 HTML 마크 업을 입력하는 대신 render_template() 함수를 사용할 수 있습니다.

from flask import Flask
from flask import render_template
app = Flask(__name__)

@app.route("/about")
def about():
    return render_template("about-us.html")

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

이것은 우리의 템플릿 파일 about-us.html 을 사용할 것입니다. 응용 프로그램에서이 파일을 찾을 수있게하려면 디렉토리를 다음 형식으로 구성해야합니다.

- application.py
/templates
    - about-us.html
    - login-form.html
/static
    /styles
        - about-style.css
        - login-style.css
    /scripts
        - about-script.js
        - login-script.js

가장 중요한 점은 HTML에서 이러한 파일에 대한 참조가 다음과 같아야한다는 것입니다.

<link rel="stylesheet" type="text/css", href="{{url_for('static', filename='styles/about-style.css')}}">

정적 폴더 아래의 styles 폴더에서 about-style.css 를 찾도록 응용 프로그램에 지시합니다. 동일한 경로 형식이 이미지, 스타일, 스크립트 또는 파일에 대한 모든 참조에 적용됩니다.

Jinja 템플릿

Meteor.js와 마찬가지로 Flask는 프런트 엔드 템플릿 서비스와도 잘 통합됩니다. 플라스크는 기본적으로 진자 템플릿을 사용합니다. 템플릿을 사용하면 조건부 또는 루프와 같은 HTML 파일에 작은 코드 스 니펫을 사용할 수 있습니다.

템플릿을 렌더링 할 때 템플릿 파일 이름 이외의 매개 변수는 HTML 템플릿 서비스로 전달됩니다. 다음 경로는 사용자 이름과 결합 된 날짜 (다른 곳의 함수에서)를 HTML로 전달합니다.

@app.route("/users/<username>)
def profile(username):
    joinedDate = get_joined_date(username) # This function's code is irrelevant
    awards = get_awards(username) # This function's code is irrelevant
    # The joinDate is a string and awards is an array of strings
    return render_template("profile.html", username=username, joinDate=joinDate, awards=awards)

이 템플릿이 렌더링되면 render_template() 함수에서 전달 된 변수를 사용할 수 있습니다. profile.html 의 내용은 다음과 같습니다.

<!DOCTYPE html>
<html>
    <head>
        # if username
            <title>Profile of {{ username }}</title>
        # else
            <title>No User Found</title>
        # endif
    <head>
    <body>
        {% if username %}
            <h1>{{ username }} joined on the date {{ date }}</h1>
            {% if len(awards) > 0 %}
                <h3>{{ username }} has the following awards:</h3>
                <ul>
                {% for award in awards %}
                    <li>{{award}}</li>
                {% endfor %}
                </ul>
            {% else %}
                <h3>{{ username }} has no awards</h3>
            {% endif %}
        {% else %}
            <h1>No user was found under that username</h1>
        {% endif %}
        {# This is a comment and doesn't affect the output #}
    </body>
</html>

다음 구분 기호는 다른 해석에 사용됩니다.

  • {% ... %} 은 (는) 진술을 나타냅니다.
  • {{ ... }} 는 템플릿이 출력되는 표현식을 나타냅니다.
  • {# ... #} 은 주석을 나타냅니다 (템플릿 출력에 포함되지 않음)
  • {# ... ## 은 나머지 줄을 문장으로 해석해야 함을 의미합니다.

요청 개체

request 개체는 경로에 대한 요청에 대한 정보를 제공합니다. 이 객체를 사용하려면 flask 모듈에서 가져와야합니다.

from flask import request

URL 매개 변수

이전 예제에서는 request.methodrequest.form 이 사용되었지만 request.args 속성을 사용하여 URL 매개 변수의 키 / 값 사전을 검색 할 수도 있습니다.

@app.route("/api/users/<username>")
def user_api(username):
    try:
        token = request.args.get("key")
        if key == "pA55w0Rd":
            if isUser(username): # The code of this method is irrelevant
                joined = joinDate(username) # The code of this method is irrelevant
                return "User " + username + " joined on " + joined
            else:
                return "User not found"
        else:
            return "Incorrect key"
    # If there is no key parameter
    except KeyError:
        return "No key provided"

이 컨텍스트에서 올바르게 인증하려면 다음 URL이 필요합니다 (사용자 이름을 사용자 이름으로 바꿉니다.

www.example.com/api/users/guido-van-rossum?key=pa55w0Rd

파일 업로드

파일 업로드가 POST 요청에서 제출 된 양식의 일부인 경우 request 오브젝트를 사용하여 파일을 처리 할 수 ​​있습니다.

@app.route("/upload", methods=["POST"])
def upload_file():
    f = request.files["wordlist-upload"]
    f.save("/var/www/uploads/" + f.filename) # Store with the original filename

쿠키

요청은 URL 매개 변수와 유사한 사전에 쿠키를 포함 할 수도 있습니다.

@app.route("/home")
def home():
    try:
        username = request.cookies.get("username")
        return "Your stored username is " + username
    except KeyError:
        return "No username cookies was found")


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow