flask는 파이썬 기반 웹 프레임워크이다.
먼저 설치를 위해 cmd창에서
pip install flask
이 명령어를 쳐주면 준비는 끝이다.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
기본적인 flask의 어플리케이션 구조이다.
run()을 이용해 서버를 실행시키면, 코드가 변경 되었을 때 수동으로 재시작을 해줘야 반영이 된다.
디버그 모드를 사용하면, 코드가 바뀌었을 때 서버가 알아서 재시작된다.
app.debug = True
app.run()
app.run(debug=True)
두 방법 중 하나를 사용하면 된다.
<라우팅>
route() 는 함수와 url을 연결시켜주는 역할을 한다.
@app.route(‘/hello’) def hello():
return ‘Hello World’
이렇게 url을 지정해서, 함수가 해당 url에서 실행되게끔 연결해준다.
<변수 규칙>
url에 변수를 추가하기 위해서는 <변수_이름> 또는, <converter: 변수_이름>을 사용해야 한다.
@app.route('/user/<username>')
def show_user_profile(username):
return 'User %s' % username
@app.route('/post/<int:post_id>')
def show_post(post_id):
return 'Post %d' % post_id
converter에는 int, float, path가 있다.
<url 생성>
url 생성은 url_for 함수를 이용해 할 수 있다.
@app.route('/user/<username>')
def profile(username): pass
print url_for('profile', username='John Doe')
url_for 함수는 첫번째 인자로 함수 이름, 두번째부터는 변수 인자를 입력으로 받는다.
/user/John%20Doe
이렇게 출력으로 url을 생성해준다.
<HTTP 메소드>
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
HTTP 메소드는 클라이언트가 서버에게 요청된 페이지를 통해서 무엇을 하도록 원하는지 말해준다.
1. GET
브라우저가 어떤 페이지에 저장된 정보를 단지 얻기 위해 서버에 요청하고 서버는 그 정보를 보낸다.
가장 일반적인 메소드다.
2. HEAD
브라우저가 어떤 페이지에 저장된 내용이 아니라 헤더라 불리는 정보를 요청한다.
어떤 어플리케이션이 GET 요청을 받은것 처럼 처리하나, 실제 내용이 전달되지 않는다. 하부에 있는 Werkzeug 라이브러리들이 그런 처리를 하기 때문에 flask에서는 그런 처리는 전혀 할 필요가 없다.
3. POST
브라우저는 서버에게 새로운 정보를 전송하도록 특정 URL에 요청하고 그 정보가 한번 저장되는것을 보장하도록 한다.
이것이 보통 HTML폼을 통해서 서버에 데이터 전송하는 방식이다.
4. PUT
POST 와 유사하지만 서버가 오래된 값들을 한번 이상 덮어쓰면서 store procedure를 여러번 실행할 수 있다.
5. DELETE
주어진 위치에 있는 정보를 제거한다
6. OPTIONS
클라이언트에게 요청하는 URL이 어떤 메소드를 지원하는지 알려준다. Flask 0.6부터 이 기능은 자동 구현된다.
<정적 파일>
static 이라는 폴더를 패키지 아래에 만들거나 모듈 옆에 위치시키면 개발된 어플리케이션에서 /static 위치에서 정적 파일을 제공할 것이다.
url_for('static', filename='style.css')
이렇게 정적파일에 대한 url을 얻어낼 수 있다.
<템플릿 보여주기>
템플릿을 뿌려주기 위해, 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)
이렇게 하면 flask가 templates 폴더에서 html파일을 찾는다.
<요청 데이터 접근하기>
컨택스트 로컬
test_request_context()를 이용해서 Context Manager를 사용할 수 있다.
from flask import request
with app.test_request_context('/hello', method='POST'):
# now you can do something with the request until the
# end of the with block, such as basic assertions:
assert request.path == '/hello'
assert request.method == 'POST'
이렇게 할 수도 있고
from flask import request
with app.request_context(environ):
assert request.method == 'POST'
이렇게 WSGI 환경변수를 인자로 넘겨줄 수도 있다.
요청 객체 (request)는 사용자의 요청과 관련된 메소드들이 있는 모듈이다.
from flask import request
이렇게 import해서 사용할 수 있고,
@app.route('/login', methods=['POST', 'GET'])
def login():
error = None
if request.method == 'POST':
if valid_login(request.form['username'],
request.form['password']):
return log_the_user_in(request.form['username'])
else:
error = 'Invalid username/password'
# 아래의 코드는 요청이 GET 이거나, 인증정보가 잘못됐을때 실행된다.
return render_template('login.html', error=error)
request.method 함수를 이용해 요청 방법을 지정해 줄 수 있다.
<파일 업로드>
enctype="multipart/form-data"
파일을 업로드 하기 위해서는 html form에 이 코드를 꼭 넣어주어야 한다.
from flask import request
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['the_file']
f.save('/var/www/uploads/uploaded_file.txt')
...
이런 식으로 request.files와 .save 함수로 파일을 업로드 받을 수 있다.
<쿠키>
쿠키는 cookies속성을 이용해 접근할 수 있다.
request 객체의 cookie 속성은 클라이언트의 모든 쿠키 정보를 담은 딕셔너리이다.
from flask import request
@app.route('/')
def index():
username = request.cookies.get('username')
이렇게 request.cookies.get으로 username의 쿠키를 가져올 수 있다.
from flask import make_response
@app.route('/')
def index():
resp = make_response(render_template(...))
resp.set_cookie('username', 'the username')
return resp
set_cookie 함수로 쿠키를 저장할 수도 있다.
<리다이렉션과 에러>
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()
사용자가 다른 엔드포인트로 가는 것을 의도하려면 redirect 함수를 사용할 수 있다.
또한, 에러를 가지고 요청을 중단시키려면 abort 함수를 사용하면 된다.
<응답>
view 함수로부터 반환되는 값은 자동으로 response 객체로 변환된다.
- 만약 정확한 유형의 response객체가 반환된다면 그 객체는 그대로 view로부터 반환된다.
- 만약 문자열이 반환된다면, response객체는 해당 데이터와 기본 파라미터들을 갖는 reponse객체가 생성된다.
- 만약 튜플이 반환된다면 튜플 안에 있는 아이템들이 추가적인 정보를 제공할 수 있다. 그런 튜플들은 지정된 form (response, status, headers) 이여야 하며, 그 중 적어도 하나의 아이템이 튜플 안에 있어야 한다. status 값은 status code를 오버라이드하면 ` headers` 는 추가적인 정보의 list, dictionary가 될 수 있다.
- 만약 위의 것들이 아무것도 적용되지 않는다면, Flask는 반환값이 유효한 WSGI application 이라고 가정하고 WSGI application을 response객체로 변환할 것이다.
반환되는 값은 이러한 과정을 통해 response 객체로 변환된다.
@app.errorhandler(404)
def not_found(error):
resp = make_response(render_template('error.html'), 404)
resp.headers['X-Something'] = 'A value'
return resp
make_response 함수를 통해 view안의 객체를 찾을 수 있다.
<세션>
세션은 쿠키보다 상위개념이다. 암호화를 사용하여 쿠키를 서명한다.
사용자는 쿠키의 내용을 볼 수는 있지만 서명을 위해 사용된 비밀키를 알지 못한다면 쿠키의 내용을 변경할 수 없다는 것을 의미한다.
from flask import Flask, session, redirect, url_for, escape, request
app = Flask(__name__)
@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 action="" 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'))
# set the secret key. keep this really secret:
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
app.secret_key로 비밀키를 생성하면 된다.
완전히 랜덤한 비밀키를 생성하기 위해서는
>>> import os
>>> os.urandom(24)
'\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<!\xd5\xa2\xa0\x9fR"\xa1\xa8'
os.urandom 함수를 사용하면 된다.
<로깅>
app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')
어떤 에러가 발생하는지 로깅을 하고 싶다면 이렇게 로그를 출력할 수 있다.
<웹 배포>
https://devcenter.heroku.com/articles/getting-started-with-python
이 곳에서 flask를 이용한 웹 배포를 할 수 있다.
'웹개발' 카테고리의 다른 글
게시판-CRUD (0) | 2023.10.24 |
---|---|
flask - mySQL 연동 (0) | 2023.10.22 |
점프 투 파이썬 5장 - 파이썬 날개 달기 (0) | 2023.10.19 |
점프 투 파이썬 4장 - 파이썬의 입출력 (0) | 2023.10.19 |
점프 투 파이썬 3장 - 제어문 (0) | 2023.10.19 |