SoShin_
소신
SoShin_
전체 방문자
오늘
어제
  • 분류 전체보기
    • Study
      • HTML | CSS
      • JavaScript
      • Django
      • Python
      • Flask
      • Git
      • Project
      • 이것저것
      • 코딩테스트
      • NestJS
    • Review
      • Book
      • Movie & Drama

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 장고 제네릭뷰
  • 장고
  • JavaScript
  • Python
  • 유저기능
  • SQLite
  • 영화리뷰
  • Django
  • node.js
  • 파이썬
  • js
  • KakaoAPI
  • 플라스크
  • Django allauth
  • 장고 유저기능
  • MongoDB
  • 코딩테스트
  • openpyxl
  • 장고 allauth
  • db
  • flask orm
  • allauth
  • 자바스크립트
  • 문제풀이
  • 영화추천
  • SQLAlchemy
  • FLASK
  • 위도경도
  • orm
  • Django 유효성 검증

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
SoShin_

소신

[Flask] Flask에서 pymongo 사용하기!
Study/Flask

[Flask] Flask에서 pymongo 사용하기!

2021. 12. 17. 16:27
반응형

현재 진행 중인 팀 프로젝트에서 서울의 여러 구에 있는 음식점이 저장되어 있는 csv 파일을 이용해서 이것을 서울의 5개의 권역으로 따로 묶어주기로 했다. [ 서북권, 도심권, 동북권, 서남권, 동남권 ]


CSV 파일을 mongoDB에 저장하기

일단 csv로 저장되어 있는 데이터를 활용하기 위해 DB에 저장을 해야 한다!

# mongodb.py

import pandas as pd
from pymongo import MongoClient

data = pd.read_csv('VeganMap_csv.csv')
data.reset_index(inplace=True) ## index 생성
data_dict = data.to_dict("records") ## 데이터를 사전형으로 변환 to_dict

client = MongoClient('localhost', 27017)
db = client.vegan
collection = db['vegan']
collection.insert_many(data_dict)

위의 코드는 현재 가지고 있는 VeganMap_csv.csv 란 파일을 pandas와 pymongo를 이용하여 mongodb에 저장하는 코드이다.

pandas로 현재 가지고 있는 csv 파일을 읽는 read_csv를 사용해서 data에 값을 저장한 후,

reset_index를 이용해서 index를 생성해준다. ( 필수는 아니다!)

그 후 to_dict를 사용하는데 이때 orient 파라미터를 전해주는 것에 따라 저장되는 형식이 달라진다.

이때 사전 값의 유형을 정해주는 orient 값은 dict’, ‘list’, ‘series’, ‘split’, ‘records’, ‘index’로 총 6가지가 있다.

 

  • dict (defulat) : column 기준으로 딕셔너리 만들기 {column : {index: value}}
  • list : column 기준으로 리스트로 반환 {column : list}
  • series : column 기준으로 series로 반환 {column : series}
  • split : 각 row를 딕셔너리로 해서 리스트로 반환 [{column1 : value1, column2 : value2}]
  • records : 각 row를 딕셔너리로 해서 딕셔너리로 반환 {index : {column1 : value1, column2 : value2}}
  • index : 하나의 column을 key로 딕셔너리 반환 {value of column : []}

저는 mongodb에 넣어주기 위해 records를 파라미터로 넣어주어 각 row를 기준으로 딕셔너리 형태로 반환받도록 했습니다!

 

그 후 넣을 db를 선택하고, collection을 선택 (생성) 해줍니다.

collection.insert_many(data_dict)

그 후 pymongo의 명령어를 통해 data를 한꺼번에 넣어주면 pymongo와 pandas를 이용하여 mongodb에 데이터 넣기는 끝!


넣을 값들을 필터링하기!

# mongodb.py
def west_north():
    users = collection.find({"$or": [{'자치구': '은평구'}, {'자치구': '서대문구'}, {'자치구': '마포구'}, {'_id': False}]})
    return users


def east_north():
    users = collection.find({"$or": [{'자치구': '도봉구'}, {'자치구': '노원구'}, {'자치구': '중랑구'}, {'자치구': '광진구'}, {'자치구': '동대문구'},
                                     {'자치구': '성동구'}, {'자치구': '성북구'}, {'자치구': '강북구'}, {'_id': False}]})
    return users


def dosim():
    users = collection.find({"$or": [{'자치구': '종로구'}, {'자치구': '중구'}, {'자치구': '용산구'}, {'_id': False}]})
    return users


def east_south():
    users = collection.find({"$or": [{'자치구': '서초구'}, {'자치구': '강남구'}, {'자치구': '송파구'}, {'자치구': '강동구'}, {'_id': False}]})
    return users


def west_south():
    users = collection.find({"$or": [{'자치구': '강서구'}, {'자치구': '양천구'}, {'자치구': '구로구'}, {'자치구': '영등포구'}, {'자치구': '동작구'},
                                     {'자치구': '금천구'}, {'_id': False}]})
    return users

그 후 pymongo를 이용하여 각 권역으로 잘라내어 값을 반환해주게 했는데요.

이때 $or를 이용하여 조건을 여러 개 설정할 수 있습니다.


Flask main app

from flask import Flask, render_template
from app import mongodb
from pymongo import MongoClient

app = Flask(__name__)

@app.route('/')
def index():
    """route 데코레이션을 통해 어떤 URL 이 우리가 작성한 함수를 실행시키는지 알려준다."""
    return render_template('index.html')
    
@app.route('/<region>')
def shop_region(region=None):
    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('vegan.html', region=region)
    return render_template('vegan.html', region=region, datas=users)

그 후 app에 만든 함수를 이용하여 각 템플릿마다 별개의 값을 전달하도록 만들었습니다.

이때, 지정하지 않은 다른 지역을 region 값에 넣을 시에는 데이터를 전달하지 않고 일반 페이지만 나오도록 만들었습니다.

{# vegan.html #}
<!DOCTYPE html>
<title> {{ region }}</title>
{% 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 %}
    <h2>{{ region }}은 존재하지 않은 권역 입니다.</h2>
    <h3> 현재 검색 가능 권역</h3>
    <ul>
        <li>동북권</li>
        <li>동남권</li>
        <li>도심권</li>
        <li>서북권</li>
        <li>서남권</li>
    </ul>
{% endif %}

위 코드가 연결될 vegan.html의 코드인데요.

이때 if 문을 통해 datas 값이 전달됐을 때만 가게의 리스트가 나오도록 하고, 만약 데이터를 전달받은 게 없다면

잘못된 검색으로 가능 검색 권역을 알려주도록 만들었습니다.


실제 사용

첫 Index창 사용법을 알려준다!
동남권을 검색했을때의 페이지

 

존재하지 않는 권역을 검색했을때

 

반응형

'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] 플라스크 동적 페이지 라우팅과 요청 (POST)  (0) 2021.12.18
[Flask] Flask 시작하기  (0) 2021.12.17
    'Study/Flask' 카테고리의 다른 글
    • [ Flask SQLAlchemy ] SQLAlchemy를 사용하여 엑셀파일 데이터를 DB에 넣기
    • [ Flask ] Flask에서 SQLAlchemy 사용하기! [ Flask ORM ]
    • [Flask] 플라스크 동적 페이지 라우팅과 요청 (POST)
    • [Flask] Flask 시작하기
    SoShin_
    SoShin_
    직접 쓰는 개발 블로그

    티스토리툴바