Flask Tutorial 1

woody·2019년 11월 26일
0
post-thumbnail

Flask

https://flask.palletsprojects.com/en/1.1.x/

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

클래스의 인스턴스를 만듭니다. 첫 번째 인수는 응용 프로그램 모듈 또는 패키지의 이름입니다.
route()데코레이터를 사용하여 Flask에게 어떤 URL함수트리거해야하는지 알려줍니다.
함수에는 특정 함수에 대한 URL을 생성하는 데 사용되는 이름이 제공되며 사용자 브라우저에 표시하려는 메시지를 반환합니다.

$ flask run
$ python -m flask

Routing

route()데코레이터를 사용하여 함수를 URL에 바인딩 하십시오.

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'

Variable Rules

<variable_name>로 섹션을 표시하여 가변 섹션을 URL에 추가 할 수 있습니다
함수 <variable_name>는 키워드 인수로을 받습니다 . -><converter:variable_name>.

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % escape(username)

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
    # show the subpath after /path/
    return 'Subpath %s' % escape(subpath)

string | (기본값)은 슬래시없이 텍스트를 허용합니다
int | 양의 정수를 받아들입니다
float | 양의 부동 소수점 값을 받아들입니다.
path | 같은 string뿐만 아니라 슬래시를 받아
uuid | UUID 문자열을 받아들입니다

Unique URLs / Redirection Behavior

다음 두 규칙은 후행 슬래시 사용이 다릅니다.

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'

projects엔드 포인트 의 표준 URL 에는 슬래시가 있습니다. 파일 시스템의 폴더와 비슷합니다. 후행 슬래시없이 URL에 액세스하면 Flask가 후행 슬래시가있는 표준 URL로 리디렉션합니다.
about엔드 포인트 의 표준 URL 에는 슬래시가 없습니다. 파일의 경로 이름과 비슷합니다. 슬래시가있는 URL에 액세스하면 404 "찾을 수 없음"오류가 발생합니다. 이렇게하면 이러한 리소스에 대한 URL을 고유하게 유지하여 검색 엔진이 동일한 페이지를 두 번 색인 생성하는 것을 피할 수 있습니다.

URL Building

특정 함수에 대한 URL을 작성하려면 url_for()함수를 사용하십시오
url_for()함수는 함수 이름으로 된 endpointURL을 생성합니다.

from flask import Flask, escape, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return 'index'

@app.route('/login')
def login():
    return 'login'

@app.route('/user/<username>')
def profile(username):
    return '{}\'s profile'.format(escape(username))

with app.test_request_context():
    print(url_for('index'))
    print(url_for('login'))
    print(url_for('login', next='/'))
    print(url_for('profile', username='John Doe'))
/
/login
/login?next=/
/user/John%20Doe

HTTP Methods

웹 애플리케이션은 URL에 액세스 할 때 다른 HTTP 메소드를 사용합니다. Flask로 작업 할 때 HTTP 메소드에 익숙해 져야합니다. 기본적으로 경로는 GET요청 에만 응답 합니다. route()데코레이터methods인수를 사용하여 다른 HTTP 메소드를 처리 할 수 있습니다.

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

Rendering Templates

Jinja2 템플릿 엔진이 자동으로 구성 됩니다.
템플릿을 렌더링하려면이 render_template() 방법을 사용할 수 있습니다 . 템플릿 이름과 템플릿 엔진에 전달할 변수를 키워드 인수로 제공하기 만하면됩니다.

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)

템플릿의 경우 Jinja2 템플릿의 모든 기능을 사용할 수 있습니다.

<!doctype html>
<title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1>
{% else %}
  <h1>Hello, World!</h1>
{% endif %}

Accessing Request Data

웹 응용 프로그램의 경우 클라이언트가 서버로 보내는 데이터에 반응하는 것이 중요합니다. Flask에서이 정보는 전역 request객체에 의해 제공됩니다.

Cookies

쿠키에 액세스하기 위해 cookies 속성을 사용할 수 있습니다 . 쿠키를 설정하기 위해 set_cookie응답 객체 의 방법을 사용할 수 있습니다. cookies요청 객체 의 속성은 클라이언트가 전송하는 모든 쿠키가 포함 된 사전입니다. 세션을 사용하려면 쿠키를 직접 사용하지 말고 대신 Flask 의 세션 을 사용하여 쿠키 위에 보안을 강화하십시오.
쿠키 읽기

from flask import request

@app.route('/')
def index():
    username = request.cookies.get('username')
    # use cookies.get(key) instead of cookies[key] to not get a
    # KeyError if the cookie is missing.

쿠키 저장

from flask import make_response

@app.route('/')
def index():
    resp = make_response(render_template(...))
    resp.set_cookie('username', 'the username')
    return resp

Redirects and Errors

사용자를 다른 엔드 포인트로 리디렉션하려면이 redirect()기능을 사용하십시오. 오류 코드로 요청을 일찍 중단하려면 다음 abort()함수를 사용하십시오.

from flask import abort, redirect, url_for

@app.route('/')
def index():
    return redirect(url_for('login'))

@app.route('/login')
def login():
    abort(401)
    this_is_never_executed()

기본적으로 각 오류 코드마다 흑백 오류 페이지가 표시됩니다. 오류 페이지를 사용자 정의하려면 errorhandler()데코레이터를 사용할 수 있습니다.

from flask import render_template

@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404

render_template() 이것은 Flask에게 해당 페이지의 상태 코드가 404 여야한다는 것을 알려줍니다.

APIs with JSON

API를 작성할 때 일반적인 응답 형식은 JSON입니다. Flask로 그러한 API를 작성하기 쉽습니다. dict뷰에서 a 를 반환 하면 JSON 응답으로 변환됩니다.

@app.route("/me")
def me_api():
    user = get_current_user()
    return {
        "username": user.username,
        "theme": user.theme,
        "image": url_for("user_image", filename=user.image),
    }

API 디자인에 따라 dict이외의 유형에 대한 JSON 응답을 만들 수 있습니다. 이 경우 jsonify()지원되는 모든 JSON 데이터 유형을 직렬화 하는 함수를 사용하십시오.

@app.route("/users")
def users_api():
    users = get_all_users()
    return jsonify([user.to_json() for user in users])

Sessions

요청 객체 외에도 session한 요청에서 다음 요청까지 사용자에게 특정한 정보를 저장할 수 있는 두 번째 객체 가 있습니다. 이것은 쿠키 위에 구현되어 쿠키에 암호로 서명합니다.

from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)

# Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

@app.route('/')
def index():
    if 'username' in session:
        return 'Logged in as %s' % escape(session['username'])
    return 'You are not logged in'

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return '''
        <form method="post">
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''

@app.route('/logout')
def logout():
    # remove the username from the session if it's there
    session.pop('username', None)
    return redirect(url_for('index'))

0개의 댓글