Flask에 관하여
자바에서는 Spring framework , 파이썬에서는 django, 자바스크립트에서는 express와 같이 대표적인 언어별 프레임워크가 있는 것을 이미 알고계실 것입니다. Flask 또한 파이썬 기반의 웹프레임워크 중 하나입니다.
여기서 프레임워크란 라이브러리들의 뭉텅이로 이해하면 편하고, 웹개발을 빠르게 할 수 있도록 틀을 갖추어 놓은 것으로 알면됩니다.
백엔드에 관련해서는 정말 공부할게 많고 어려운 것도 많은데 우선 이번에는 데이터를 데이터베이스에서 꺼내주고 저장하는
<index.html>👇
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<title>Document</title>
<script>
function hey(){
alert('안녕!')
}
</script>
</head>
<body>
<button onclick="hey()">나는 버튼!</button>
</body>
</html>
from flask import Flask, render_template
app = Flask(__name__)
## URL 별로 함수명이 같거나,
## route('/') 등의 주소가 같으면 안됩니다.
@app.route('/') # localhost:5000 url 구조의 가장 기본으로 home 과 같은 페이지 역할
def home():
return render_template('index.html')
#render_template 메소드로 위에서 지정한 index.html 파일을 / 루트 경로로 보내서 열어 볼 수 있음
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)
Flask 적용
프로젝트로 만든 '나만의 영화 리스트'를 예로 들어 Flask를 적용시켜보겠습니다.
먼저 클라이언트 입장에서 어느 UI를 조작해서 어떤 기능을 낼 것인지를 기획하겠습니다.
👀 기획
위의 화면에서 영화기록하기 버튼을 누르면 jQuery show()함수에 의해 빨간 화살표처럼 박스가 나옵니다.
그럼 '영화 url 등록사이트가기'를 눌러서 네이버 영화 페이지로 이동 후, 영화를 검색 후 url을 복사해옵니다.
url을 붙여놓고 별점과 코멘트를 달아주면 알아서 아래와 같이 이미지, 영화제목, 짧은 설명이 추가로 기입됩니다.
결과👇
이를 구현하기 위해 크롤링 기술과 접목을 해야했고, 개발자 도구 참조는 다음 사진과 같이 영화 정보를 담고 있는 meta 태그를 스크래핑 했습니다.
네이버 영화에서 스크래핑한 meta 태그👇
그럼 이 크롤링된 결과들이 mongoDB에 저장되고 클라이언트에게 주는 정보는 그 데이터를 추출해서 보여주는 방식으로 마무리 될 것입니다.
👀 코드설명
클라이언트에게 보여주는 코드와 서버쪽 코드를 작성했으나 양이 다 올리기엔 지저분하게 많아서 따로 링크를 걸겠습니다. 여기에서는 부분부분만 보겠습니다.
GitHub 페이지👇
클라이언트에게 보여줄 front page 전체 코드보기
서버에서 다루는 back 전체 코드보기
<!--index.html 파일-->
function posting() {
let url=$('#url').val()
let star=$('#star').val()
let comment=$('#comment').val()
$.ajax({
type: 'POST',
url: '/movie',
data: {url_give:url, star_give: star, comment_give:comment},
success: function (response) {
alert(response['msg'])
window.location.reload()
}
});
}
@app.route('/movie', methods=["POST"])
def movie_POST():
url_receive = request.form['url_give']
star_receive = request.form['star_give']
comment_receive = request.form['comment_give']
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
url = url_receive #받아온 url 사용!
data = requests.get(url, headers=headers) #requests로 url페이지 내 정보 받아옴
soup = BeautifulSoup(data.text, 'html.parser') #받아온 정보를 html로 파싱
title = soup.select_one("meta[property='og:title']")['content']
image = soup.select_one("meta[property='og:image']")['content']
description = soup.select_one("meta[property='og:description']")['content']
#위의 코드와 이어지는 부분입니다.
doc = {
'url':url_receive,
'star': star_receive,
'comment': comment_receive,
'title': title,
'image': image,
'description': description
}
db.movie_posting.insert_one(doc)
# print(url, star_receive, comment_receive + '||' + title, image, description)
return jsonify({'msg':'영화가 등록 완료되었습니다.'}) #json 형식으로 클라이언트에게 정보 줌
@app.route('/movie', methods=["GET"])
def movie_GET():
movie_list=list(db.movie_posting.find({},{'_id': False}))
return jsonify({'movies':movie_list})
$(document).ready(function () {
listing();
});
function listing() {
$('#cards-box').empty()
$.ajax({
type: 'GET',
url: '/movie',
data: {},
success: function (response) {
let movies = response['movies']
for(let i =0; i<movies.length; i++){
let image=movies[i]['image']
let title=movies[i]['title']
let description=movies[i]['description']
let star="⭐".repeat(movies[i]['star'])
let comment=movies[i]['comment']
let temp_html=`<div class="col">
<div class="card h-100">
<img src="${image}"
class="card-img-top">
<div class="card-body">
<h5 class="card-title">${title}</h5>
<p class="card-text">${description}</p>
<p>${star}</p>
<p class="mycomment">${comment}</p>
</div>
</div>
</div>`
$('#cards-box').append(temp_html)
}
}
})
}
이렇게 한 결과가 위에 있던 사진입니다. 사실 Flask에 대해 굉장히 가볍게 배웠지만 분명 이것보다 더욱 다채롭게 쓸 수 있는 프레임워크 일 것입니다.