172 lines
5.9 KiB
Markdown
172 lines
5.9 KiB
Markdown
# Flask에서 라우팅하는 방법
|
|
Flask에서 라우팅은 특정 URL에 어떤 함수를 연결하여 요청을 처리하는 것을 의미합니다. 즉, 사용자가 어떤 URL로 접속하면 그에 해당하는 함수가 실행되어 동적인 웹 페이지를 생성하게 됩니다.
|
|
|
|
## @app.route 데코레이터
|
|
Flask에서 라우팅은 @app.route 데코레이터를 사용하여 간단하게 정의할 수 있습니다. 이 데코레이터는 함수 위에 붙여서 해당 함수가 처리할 URL을 지정합니다.
|
|
|
|
```python
|
|
from flask import Flask
|
|
|
|
app = Flask(__name__)
|
|
|
|
@app.route('/')
|
|
def index():
|
|
return 'Hello, World!'
|
|
|
|
if __name__ == '__main__':
|
|
app.run()
|
|
```
|
|
위 코드에서 @app.route('/')는 루트 경로('/')에 대한 요청이 들어오면 index() 함수를 실행하도록 설정합니다.
|
|
|
|
## 다양한 라우팅 방법
|
|
### 정적 라우팅
|
|
특정 URL에 하나의 함수를 연결하는 방식입니다.
|
|
```python
|
|
@app.route('/about')
|
|
```
|
|
|
|
### 동적 라우팅
|
|
URL에 변수를 포함하여 다양한 요청을 처리할 수 있습니다.
|
|
```python
|
|
@app.route('/user/<username>')
|
|
```
|
|
```python
|
|
from flask import Flask
|
|
|
|
app = Flask(__name__)
|
|
|
|
@app.route('/user/<username>')
|
|
def show_user_profile(username):
|
|
# 사용자 정보를 조회하여 반환
|
|
return f'User {username}'
|
|
|
|
if __name__ == '__main__':
|
|
app.run()
|
|
```
|
|
위 코드에서 /user/<username> 라우트는 username이라는 변수를 포함하고 있습니다. 이를 통해 /user/john과 같은 URL에 접속하면 username 변수에 'john'이 할당되고, show_user_profile 함수에서 이 값을 사용하여 사용자 정보를 조회할 수 있습니다.
|
|
|
|
### HTTP 메서드
|
|
methods 인자를 사용하여 GET, POST, PUT 등 다양한 HTTP 메서드를 지원할 수 있습니다.
|
|
```python
|
|
@app.route('/login', methods=['GET', 'POST'])
|
|
```
|
|
|
|
|
|
## 다양한 변수 형식
|
|
Flask는 다양한 URL 변환기를 제공하여 URL에서 값을 추출하고 검증하는 기능을 제공합니다.
|
|
|
|
* `int:변수명`: 정수 값
|
|
* `float:변수명`: 부동소수점 값
|
|
* `path:변수명`: 슬래시(/)를 포함한 경로
|
|
* `uuid:변수명`: UUID 값
|
|
|
|
```python
|
|
@app.route('/post/<int:post_id>')
|
|
def show_post(post_id):
|
|
# post_id는 정수형으로 변환되어 사용됩니다.
|
|
return f'Post {post_id}'
|
|
```
|
|
|
|
* 변환기 사용자 정의: `Converter`를 상속하여 사용자 정의 변환기를 만들 수 있습니다.
|
|
* 기본값 설정: `default` 인자를 사용하여 변수에 기본값을 설정할 수 있습니다.
|
|
* 필수 파라미터: `required` 인자를 사용하여 필수 파라미터를 지정할 수 있습니다.
|
|
|
|
## URL 파라미터 값 가져오기
|
|
URL에 ?를 붙여 쿼리 파라미터를 전달할 수 있습니다. 예를 들어, /search?q=python과 같이 사용합니다. 이러한 쿼리 파라미터는 `request.args`를 통해 접근할 수 있습니다.
|
|
```python
|
|
from flask import Flask, request
|
|
|
|
app = Flask(__name__)
|
|
|
|
@app.route('/search')
|
|
def search():
|
|
query = request.args.get('q')
|
|
return f'You searched for: {query}'
|
|
```
|
|
|
|
## 응답 코드 지정
|
|
|
|
```python
|
|
from flask import Flask, make_response
|
|
|
|
app = Flask(__name__)
|
|
|
|
@app.route('/')
|
|
def index():
|
|
# 404 Not Found 응답
|
|
return make_response('Not Found', 404)
|
|
```
|
|
* make_response() 함수: 직접 응답 객체를 생성하여 응답 코드를 지정할 수 있습니다. 첫 번째 인자는 응답 내용, 두 번째 인자는 상태 코드입니다.
|
|
|
|
### Flask의 내장 함수 활용
|
|
* abort(code): 특정 상태 코드와 함께 예외를 발생시켜 응답을 중단합니다.
|
|
* redirect(location, code=302): 다른 URL로 리다이렉트합니다.
|
|
```python
|
|
from flask import abort, redirect, url_for
|
|
|
|
@app.route('/admin')
|
|
def admin_page():
|
|
if not is_admin:
|
|
abort(403) # 403 Forbidden
|
|
return 'Welcome, admin!'
|
|
```
|
|
|
|
### Jinja2 템플릿과 함께 사용
|
|
```python
|
|
from flask import render_template
|
|
|
|
@app.route('/error')
|
|
def error_page():
|
|
return render_template('error.html'), 404
|
|
```
|
|
|
|
### Response 객체
|
|
더 복잡한 응답을 생성하려면 Response 객체를 직접 사용할 수 있습니다.
|
|
```python
|
|
from flask import Response
|
|
|
|
@app.route('/custom_response')
|
|
def custom_response():
|
|
response = Response('Custom response', status=201, mimetype='text/plain')
|
|
response.headers['X-Custom-Header'] = 'custom value'
|
|
return response
|
|
```
|
|
|
|
## 파일 업로드
|
|
```python
|
|
from flask import Flask, request, render_template
|
|
|
|
app = Flask(__name__)
|
|
UPLOAD_FOLDER = 'static/uploads' # 업로드 파일 저장 경로
|
|
|
|
@app.route('/', methods=['GET', 'POST'])
|
|
def upload_file():
|
|
if request.method == 'POST':
|
|
if 'file' not in request.files:
|
|
flash('No file part')
|
|
return redirect(request.url)
|
|
file = request.files['file']
|
|
if file.filename == '':
|
|
flash('No selected file')
|
|
return redirect(request.url)
|
|
if file:
|
|
filename = secure_filename(file.filename)
|
|
file.save(os.path.join(UPLOAD_FOLDER, filename))
|
|
return 'Uploaded file successfully'
|
|
return render_template('upload.html')
|
|
|
|
if __name__ == '__main__':
|
|
app.run(debug=True)
|
|
```
|
|
* UPLOAD_FOLDER: 업로드된 파일을 저장할 폴더 경로를 설정합니다.
|
|
* request.files: enctype="multipart/form-data"로 설정된 폼에서 전송된 파일을 담고 있는 딕셔너리입니다.
|
|
* secure_filename: Flask에서 제공하는 함수로, 업로드 파일 이름을 안전하게 처리하여 디렉토리 트래버설 공격을 방지합니다.
|
|
* file.save(): 파일을 지정된 경로에 저장합니다.
|
|
|
|
## 추가적인 기능
|
|
* URL for: url_for 함수를 사용하여 URL을 생성할 수 있습니다.
|
|
* HTTP 메서드: GET, POST, PUT, DELETE 등 다양한 HTTP 메서드를 지원합니다.
|
|
* HTTP 상태 코드: return 문에서 상태 코드를 지정하여 응답할 수 있습니다.
|
|
* 템플릿 엔진: Jinja2를 사용하여 동적인 HTML 페이지를 생성할 수 있습니다.
|
|
|