codestates / codestates/ds-blog
[이동훈] Solo Project 3
- Dominant language
- No language data
- Stars
- 2
- Forks
- 4
- PR merge metrics
- No merged PRs in 30d
Description
## 섹션 3 Twitter API
## 개요
이번 프로젝트에서는 섹션 3 에서 배웠던 것을 종합하여, 웹 환경에서 사용할 수 있는 애플리케이션을 만드는 것이었다.
애플리케이션의 기능은 Twitter에서 제공하는 API를 사용하여,
1. 유저를 아이디를 입력하면, 유저의 고유넘버, 유저네임, 스크린네임 그리고, 지역을 데이터베이스에 저장하는 기능 (구현성공)
2. 입력된 유저를 선택하여, 유저의 최근 트윗을 조회하는것. (구현성공)
3. 그동안 유저가 트윗에 사용했던 단어를 분석하여, 새로운 단어나 문장이 주어 졌을때, 어느 유저가 주어진, 문장이나, 단어를 사용할지 예측하는 모델. (구현실패)
## basic app file structure
```
project
│ .env
│ __init__.py
│ models.py
│ tweety_api.py
│ tweety_model.py
│
└───route (.py files)
│ │ basic_routes.py
│ └ func_routes.py
│
└───templates - (.html files for pages)
│ index.html
│ base.html
│ add.html
│ delete.html
│ update.html
│ users.html
│ get.html
│ gettweets.html
└ compare.html
```
내가 만든 앱은 위와 같은, 디렉토리를 가지고 있다.
디렉토리는 프로그램을 디자인 하는 사람마다, 다른 구조를 가질수 있지만
적어도 아래왜 같은 디렉토리 같이,
.html파일들은 templates 폴더에, .html 파일과 상호작용을 하는 .py파일들은 route 폴더에 있어야한다.
```
project
│ .env
│ __init__.py
│ models.py
│ ...
│
└───routes (for .py files which interacts with .html files)
│ │ basic_routes.py
│ │ func_routes.py
│ │ ...
│
└───templates - (.html files which interacts with .py files in route files.)
│ index.html
│ compare.html
│ ...
```
## __init__.py
Flask 를 사용하여, 앱의 기본 구성, 환경설정을 해야 한다.
어떤 Flask_Alchemy가 sql파일을 로컬에 저장을 할 것인가, 또는 온라인 sql 서버에 저장을 할 것인지 경로설정등을 해주고, 변수 설정을 해주어야 한다.
Blueprint 한국말로는 청사진, 설계도, init 파일에서 앱이 어떻게 구성이 되는지 설정해 주어야 한다.
routes 폴더에 있는 파일 마다. 아래와 같이 설정 해주어야 한다.
app.register_blueprint(*1_routes.*1_routes)
app.register_blueprint(*2_routes.*2_routes)
app.register_blueprint(*3_routes.*3_routes)
## models.py
파일 이름에서 알 수 있듯이, 앱의 기본이 되는 것들은 여기서 만들어야 한다.
embedding_as_service_client 를 통해, 만들어진 서버에 접속 할 수 있다.
나의 경우엔, 문자열을 vec화 시켜주는, 서버에 연결 하였다.
flask_sqlalchemy 를 통해 어떠한 테이블을 만들 것이지, 각 테이블에는 어떤 column/특성 만들것인지. 각 column들은 숫자열인지, 문자열인지, 고유 id (PK) 숫자인지, FK인지 sql에서 사용했던 코드 대신에 조금 더 간결한 코드를 만들 수 있다. 또한, 각 테이블 간의 관계도. 아주 간단 하게 설정할 수 있다.
이후 기본 적인 설정을 마치고.
앞으로 프로그램에서 쓰일 함수들을 여기에 다 작성해도 되고, 필요에 route 폴더에 있는 *_route.py 파일에 함수를 작성할 수도 있다.
## routes 폴더
위에서 한번 서술 하였지만, routes 폴더에는 html 파일들와 상호작용을 하여 api의 기능을 구현하는 .py파일을 저장하였다.
각 기능마다 따로, *_routes.py 처럼, 각 기능을 따로 만들어서 구현 할 수도 있지만. 본인은 모든 기능을 한가지 .py 파일에 작성하였다.
다만, models 에서 만들어 두었던, 테이블 class, 함수들을 불러와야한다.
```py
import os
import pickle
from flask import Blueprint, render_template, request
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from tweety_app.models import db, en, Users, Tweets, parse_records, get_all_data #models에서 작성한 함수들을, 현재 작성중인 *_routes.py에서 사용 할 수 있게 불러와야 한다.
from tweety_app.tweety_api import api # 프로젝트 폴더 안에 작성된, tweety_api.py에서 선언한 api 함수/ 인스턴스를 현재 파일에서 사용할 수 있게 불러 오는 것.
```
## templates 폴더
templates 폴더에는 각 페이지를 구현하는 .html 파일들이 저장 된다.
이번 과제를 하면서 정말 흥미로왔던 점은 Jinja 2라는… 기술?/ 스킬?/문법?을 사용하여, .html에서도 파이썬과 비슷한 문법을 작성할 수 있었다.
폴더이름에서 알 수 있듯이, .html 파일들은 단순히 탬플릿 역활만 하였고. 인터넷 브라우져 상에서 보이는 데이터들은, 모두 Flask_sqlalchemy를 통하여, 만들어진 sql 데이터 베이스 상의 자료들을 보여주었다.
## 사용된 파이썬 라이브러리
Flask, Flask_alchemy, Flask_migrate, os, pickle, dot_env, tweepy, (jinja2… a way to write), (embedding as service client).
- Flask : 마이크로 서브프레임 (로컬환경에서 web을 구현해준다)
- Flask_sqlalchemy : ORM (Object relative mapping) : sql코드를 사용하지 않더라고, 이런 저런 다른 데이터베이스와 파이썬이어 주는 라이브러리. 파이썬코드로 데이터베이스를 조작할 수 있다.
- Flask migrate : 데이터 마이그레이션을 도와주는 flask 익스텐션
- os : 작성중인 파일간, 필요한 파일을 불러오거나, 내보내거나... 할 수 있는 기본내장 라이브러리.
- dot_env : API 접근 인증키나, 아이디, 비밀번호, URI 와 같은 민감한 정보를 따로 저장한 (.env)파일에 저장하여, 작성하고 있는 파일에 민감 정보를 포함하지 않게 해준다 보안목적.
- tweepy : Twitter API를 파이썬에서 좀더 쉽게 사용할 수 있게 해주는 라이브러리
- jinja 2 : HTML 파일에서도 파이썬 코드를 사용하여 html을 표현할수 있게 해주는 코딩 스킬(?)
- embedding as service client : 코드스테이츠에서 만든 단어를 벡터로 바꾸어주는 서버를 트위터 앱에 연결하게 해주는 라이브러리. Client 쪽에선 아주 손쉽게 연결 할 수 있다.
- pickle : (기본내장) let us to save code / instance in byte files and let us to load even after turn off the program.
This would have been very useful. Especially when we were doing machine learning. Because machine learning took very long time to train. and after the note is closed. all the instance informations were erased.
with pickle I can elegantly dump and load .pkl and didn’t have to spend like 16 min ~30 min training the computer every time I shutdown the computer. Anyway, since I know now. I should make use of it.
gunicorn : magically make more servers, to help other clients, with flask you only has one work. if I 배포, publish, my api without g unicorn, the api only has one worker, but g unicorn creates many workers, so in case if there are multiple clients… clients does not have to wait in line, but each workers will be able to serve each clients.
## 이번 프로젝트를 하면서 마주친 Technical Difficulties and thoughts.
### 1. Database Initialize failed error
환경변수 설정, 모델, routes 파일들의 작성이 끝났다고, 생각하여 이제 FLASK_APP=project_folder flask run으로 실행하면
`sqlalchemy.orm.exc.UnmappedInstanceError: Class 'flask_sqlalchemy.model.DefaultMeta' is not mapped; was a class (tweety_app.models.Users) supplied where an instance was required?`
이라는 에러가 나오면서 내가 만든 앱은 죽어도 실행 되지 않았다.
구글링을 했을때, `db init`을 하라고 했지만, 뭘 어떻게 진행해야 하는지 몰라서 벽에 부딛혔지만.
`FLASK_APP = xxxxx flask db init` : 으로 데이터베이스를 만들고,
`FLASK_APP = xxxxx flask db migrate` : 변경사항을 업데이트
`FLASK_APP = xxxxx flask db upgrade` : 변경사항을 적용
하지 않아서 생겼던 오류였다.
### 2. 오타오류 (AttributeError: 'NoneType' object has no attribute 'username’)
유저를 Add 하는 기능을 구현 하려는 와중에, 동기의 코드를 그대로~ 복붙을 하니. 위와 같은 오류를 내보내었다.
내 딴에는 Table 이름도 맞게 변경해서 정상 작동할 것 같았지만.
코드의 이해 없이 그냥 복사 붙혀 넣기 했던 코드 였기 때문에, 함수이름의 오류, 오타, 헷갈리는 이름으로 되어 있기 때문에 오는 오류였다.
오타에서 발생하는 오류가 정말 많았다. 개인마다, 테이블 이름이나, 함수명을 다르게 지정하게되니까
무턱대고 동기의 코드를 복붙하게 되면, 미칠듯한 오류의 행진을 볼 수 있다.
목요일에 산님께 긴급 도움을 요청하여 해결 할 수 있었다.
사실 이번 프로젝트에서 단순한 변수이름과 파일 스트럭쳐를 제외하고는 만은 부분 동기들의 코드를 참고 하였다.
프로젝트를 처음 시작 할때는 내가 어떻게 코드어떻게 써야 할 지 모르겠에서, 동기들의 코드를 그냥 가지고 왔지만, 어느순간 왜 이런 코드를 썼는지, 이 코드는 무엇을 의미하는지 어렴풋이 알 수 있게 되었다.
### 3. NoneType Error, subscript error 등…
*_route.py 파일에서 database 불러오는 방식의 차이였던것 같다.
### 4. 유저 삭제 페이지
앱에서 데이터베이스에 등록한 트위터 사용자를 삭제하기 위해선, username을 입력해야 했는데, 공교롭게도 대소문자를 구분하였다, (모두 소문자로 넣어야 했다.) 그리고 혹시나 앱 사용자가 오타를 낸다면, 해결하기 매우 까다로워 보이는 에러를 나에게 던져 줬는데. 위와 같은 것들을 피하기 위해선, 앱 사용자들의 선택권을 제한 해야했다.
그 방법으로는, 드롭다운 메뉴를 사용하는 것이 있었다.
드롭다운 메뉴에 데이터 베이스에 추가된 트위터 유저네임만 표시되게 한다면, 앱 사용자들은 타이핑 할 필요없이 자신이 지우고 싶은 데이터만 선택을 할 수 있게 된다.
처음에는 혼자의 힘으로, html 파일을 내가 원하는 대로 작동하게 수정하는데는 성공했지만, 드롭다운 메뉴에 데이터베이스에 추가되어 있는 사용자를 불러 오는데서 많은 어려움이 있었다.
여기선 가연님의 도움과 설명으로 *_routes.py 와 *.html 파일이 어떻게 서로 상호작용하는지 좀 더 잘 알 수 있게 되었다.
### 5. 트윗 비교하기.
유저들을 선택하는 부분은 구현을 완료했지만. 막상 compare를 하게 되면 제대로 작동이 되지 않는다.
제일 큰 문제로는, logisticRegression 모델링을, 어떻게 구현하면 되는가… (csv로 머신러닝을 돌릴수는 있는데 데이터베이스를 조작하는 부분에서 아직까지 많이 미숙한 부분이 있다…)
그리고 logisticRegression으로 모델을 만들더라도… 그 모델을 사용하여 기능을 구현하는데서 많은 어려움이 있다.
스프린트 리뷰시간이나, 자유시간이 더 주어지면 flask_sqlalchemy, 또는 데이더베이스를 생각한 대로 데이터 베이스를 조작 할 수 있을때. 다시 되돌아 오면 좋을것 같다.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.