2021.12.17 - [Study/Flask] - [Flask] Flask에서 pymongo 사용하기!
저번 게시글에서 Flask를 만들었을 때는 정적 페이지 라우팅을 통해 작성했지만 이번 게시글에선 동적으로 바꾸면서 POST 요청으로 데어터를 받아보는 것을 해보겠습니다.
라우팅이란?
라우팅이라는 개념은 클라이언트로부터 요청받은 URL과 뷰를 매칭시키는 것으로 라우팅이라는 사전적인 의미 그대로 특정한 URL에 대해 특정한 뷰로 연결하는 역할입니다.
URL이라고 했지만 실제로 라우팅에 사용되는 정보는 호스트 이름을 제외하고 나머지 경로를 표시한 문자입니다.
저번 게시글의 정적 페이지 라우팅을 기준으로 했을때 http://localhost:3000/동남구 라고 했을 때 '동남구'에 해당하는 부분이 라우팅 대상이 됩니다.
POST Method
Flask에서 POST 요청을 하기 위해서는 아래 코드처럼 함수에서 Methods인자에 POST 값을 넣어주면 됩니다.
# app.py
from flask import Flask, render_template, request
from app import mongodb
app = Flask(__name__)
@app.route('/', methods=['POST']) # POST 요청을 위해 methods=['POST'] 추가
def shop_region():
region = request.form['region'] # 페이지에서 POST 요청한 값을 받아오기 위해 request.form['보내온 데이터 이름'] 추가
if region == '서북권':
users = mongodb.west_north()
elif region == '도심권':
users = mongodb.dosim()
elif region == '동북권':
users = mongodb.east_north()
elif region == '서남권':
users = mongodb.west_south()
elif region == '동남권':
users = mongodb.east_south()
else:
return render_template('index.html', region=region)
return render_template('index.html', region=region, datas=users)
{# index.html #}
<!doctype html>
<head>
<title>Index from Flask</title>
<style>
.button_region {
display: inline-block;
margin-top: 20px;
margin-bottom: 20px;
}
</style>
</head>
<body>
<h1>주소 뒤에 원하는 가게가 속하는 권을 써주세요!</h1>
<h2>ex)/동남권</h2>
<form action="{{ url_for('shop_region') }}" method="post">
<label for="input">권역: </label><input type="text" name="region" id="input">
<input type="submit" value="제출">
</form>
{% for reg in ['동남권','동북권','도심권','서북권','서남권'] %}
<div class="button_region">
<form action="{{ url_for('shop_region') }}" method="post">
<input type="submit" value="{{ reg }}" name="region">
</form>
</div>
{% endfor %}
{% if datas %}
<h1>{{ region }}가게 리스트</h1>
<ul>
{% for data in datas %}
<li><h3>상호명:{{ data['상호명'] }}</h3></li>
<li><h4>업종:{{ data['업종'] }}</h4></li>
<li><h4>자치구:{{ data['자치구'] }}</h4></li>
<li><h4>도로명주소:{{ data['도로명주소'] }}</h4></li>
<hr>
{% endfor %}
</ul>
{% else %}
<h3> 현재 검색 가능 권역</h3>
<ul>
{% for reg in ['동남권','동북권','도심권','서북권','서남권'] %}
<li>{{ reg }}</li>
{% endfor %}
</ul>
{% endif %}
</body>
위처럼 Methods 에 인자로 요청할 값 POST 혹은 GET을 넣어준 다음 request.form으로 받은 값을 사용할 수 있습니다.
이때 html을 보면 form에서 post값을 보내주기 위해서 name 인자값을 반드시 넣어주어야 합니다.
이때 쓰는 name 값이 app.py에서 request.form으로 불러올때 사용하는 이름이 됩니다.
<form action="{{ url_for('shop_region') }}" method="post">
<label for="input">권역: </label><input type="text" name="region" id="input">
<input type="submit" value="제출">
</form>
@app.route('/', methods=['POST']) # POST 요청을 위해 methods=['POST'] 추가
def shop_region():
region = request.form['region']
# 페이지에서 POST 요청한 값을 받아오기 위해 request.form ['보내온 데이터 이름'] 추가
이때 보면 form action = "{{ url_for('shop_region') }}" 부분이 있는데 이것이 동적 페이지 라우팅을 위한 것이다.
Flask 동적 페이지 라우팅 [ 변수 ]
동적 페이지 라우팅을 할 때는 원하는 위치에 "<변수>" 형태로 추가한다.
예를 들어 /<number> 라고 페이지를 지정해놓고 http://localhost:3000/1 이라고 입력하게 된다면
number값을 받아 해당 페이지로 동적으로 이동시켜주는 것이다.
Flask 동적 페이지 라우팅 [ url_for ]
url_for는 두 가지 경우로 사용할 수 있습니다.
하나는 인자 값이 없는 경우, 또 다른 하나는 인자값이 있는 경우입니다.
첫 번째인 인자 값이 없는 경우는 위에서 봤듯이 url_for(url에 연결된 함수 이름) 으로 사용합니다.
form action = "{{ url_for('shop_region') }}" 에서 보면 shop_region이라는 함수로 연결하라는 것으로 보면 된다.
두 번째로 인자가 있는 경우에는 url_for(url에 연결된 함수 이름, 전달할 인자 값)으로 사용할 수 있습니다.
'Study > Flask' 카테고리의 다른 글
[ Flask SQLAlchemy ] SQLAlchemy를 사용하여 엑셀파일 데이터를 DB에 넣기 (0) | 2021.12.30 |
---|---|
[ Flask SQLAlchemy ] SQLAlchemy를 사용하여 엑셀파일 데이터를 DB에 넣기 (0) | 2021.12.30 |
[ Flask ] Flask에서 SQLAlchemy 사용하기! [ Flask ORM ] (2) | 2021.12.30 |
[Flask] Flask에서 pymongo 사용하기! (0) | 2021.12.17 |
[Flask] Flask 시작하기 (0) | 2021.12.17 |