공부한 내용 정리하는 공간입니다.
틀린 내용이 있을 수 있습니다.
모든 지적, 첨언 환영합니다.
오늘의 코드
1. 웹 애플리케이션 생성
2. 루트 URL에 HTML 템플릿 적용
3. RSS 피드에서 데이터 수집
4. 데이터 정리해서 표시
from flask import Flask, render_template, request
import feedparser
app = Flask(__name__)
@app.route("/")
def index():
return render_template('index.html')
@app.route("/rss", methods=['GET', 'POST'])
def rss():
rss_url = request.form['rss_url']
print(rss_url)
feed = feedparser.parse(rss_url)
return render_template('rss.html', feed=feed)
if __name__ == '__main__':
app.run(debug=True)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RSS 서비스</title>
</head>
<body>
<h1>RSS 리더 페이지</h1>
<form method="post" action="{{url_for('rss')}}">
<b>RSS 주소를 입력하세요.</b></br>
<input type="text" name="rss_url" size="40">
<button type="submit">확인</button>
</form>
</body>
</html>
rss.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RSS 조회 결과</title>
<link rel="stylesheet" type="text/css" href="{{url_for('static', filename='style.css')}}">
</head>
<body>
<h1>RSS 결과 페이지</h1>
<table border="1">
<tr>
<td>제목</td>
<td>링크</td>
<td>요약</td>
</tr>
{% for entry in feed.entries %}
<tr>
<td>{{entry.title}}</td>
<td>{{entry.link}}</td>
<td>{{entry.description}}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
request.form[]
클라이언트로부터 제출된 HTML 폼 데이터를 가져올 때 사용
폼 필드의 값을 딕셔너리 형식으로 제공
POST 요청에서 데이터를 처리할 때 사용 (method="post")
폼 필드의 이름에 매핑된 값을 반환
request.form['필드이름'] 형식으로 사용
지원하는 데이터 형식 : application/x-www-form-urlencoded, multipart/form-data
오늘의 코드
1. 웹 애플리케이션 생성
2. 루트 URL에 HTML 템플릿 적용하기
3. RSS 피드에서 데이터 가져오기
4. 데이터 정리해서 표시하기
from flask import Flask, render_template, request
import feedparser
app = Flask(__name__)
@app.route("/")
def index():
return render_template('index.html')
@app.route("/rss", methods=['GET', 'POST'])
def rss():
rss_url = request.form['rss_url']
print(rss_url)
feed = feedparser.parse(rss_url)
return render_template('rss.html', feed=feed)
if __name__ == '__main__':
app.run(debug=True)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RSS 서비스</title>
</head>
<body>
<h1>RSS 리더 페이지</h1>
<form method="post" action="{{url_for('rss')}}">
<b>RSS 주소를 입력하세요.</b></br>
<input type="text" name="rss_url" size="40">
<button type="submit">확인</button>
</form>
</body>
</html>
rss.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RSS 조회 결과</title>
<link rel="stylesheet" type="text/css" href="{{url_for('static', filename='style.css')}}">
</head>
<body>
<h1>RSS 결과 페이지</h1>
<table border="1">
<tr>
<td>제목</td>
<td>링크</td>
<td>요약</td>
</tr>
{% for entry in feed.entries %}
<tr>
<td>{{entry.title}}</td>
<td>{{entry.link}}</td>
<td>{{entry.description}}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
오늘의 코드 설명
1. 웹 애플리케이션 생성
app = Flask(__name__)
현재 파이썬 파일에서 flask 애플리케이션 객체 app 생성
2. 루트 URL에 HTML 템플릿 적용하기
@app.route("/")
def index():
return render_template('index.html')
루트 URL에 대한 요청을 처리하는 데코레이터
템플릿 파일 'index.htm'을 렌더링하여 반환하는 함수 index를 정의
브라우저에는 index.html 내용 표시
3. RSS 피드에서 데이터 가져오기
@app.route("/rss", methods=['GET', 'POST'])
/rss 경로에 대한 GET 요청과 POST 요청을 모두 처리하는 데코레이터
rss_url = request.form['rss_url']
본문에 포함된 name 속성이 rss_url인 form 데이터를 가져와서 rss_url에 저장
>name 속성이 rss_url인 form은 index.html에 있는 <input> 태그
>index.html 의 <form> 태그는 서버에있는 이름이 rss 라우터에 POST 요청을 보냄
print(rss_url)
사용자가 입력한 RSS URL을 터미널에 출력
feed = feedparser.parse(rss_url)
사용자가 입력한 RSS URL을 파싱해서 데이터를 feed에 저장
4. 데이터 정리해서 표시하기
return render_template('rss.html', feed=feed)
rss.html에 데이터가 저장된 feed를 전달
rss.html에 전달된 내용은 태그에 맞춰서 브라우저로 표시
index.html
<title>RSS 서비스</title>
<head> 부분에 위치하며, 브라우저 탭이나 검색 엔진 결과에 표시될 웹 페이지의 제목
브라우저 탭에 "RSS 서비스"라고 표시

<h1>RSS 리더 페이지</h1>
제목 태그 <h1>을 사용해 제목으로 "RSS 리더 페이지"를 설정

<form method="post" action="{{url_for('rss')}}">
<form> : 데이터를 입력받아 서버로 전송하기 위한 태그
method="post" : 데이터를 POST 방식으로 서버에 전송
action="{{url_for('rss')}}" : 서버에서 rss라는 이름의 라우터에 요청을 보냄
> type="submit" 으로 전송된 내용을 서버의 rss 라우터로 전송
<b>RSS 주소를 입력하세요.</b></br>
"RSS 주소를 입력하세요." 를 굵게 표시하고 줄바꿈

<input type="text" name="rss_url" size="40">
<input> : 사용자가 데이터를 입력할 수 있는 입력 필드
type="text" : 텍스트를 입력받는 필드
name="rss_url" : 입력된 데이터를 서버에서 식별하기 위하여 이름 지정
size="40" : 입력 필드의 너비를 40자로 설정
>서버에서 request.form['rss_url']으로 입력된 내용을 받아서 rss_url에 저장

<button type="submit">확인</button>
<button> : 폼 데이터를 전송하기 위한 버튼
type="submit" : 버튼 클릭 시 폼 데이터를 action 경로로 전송
> action을 통해 서버의 라우터 rss로 데이터 전송
버튼 텍스트는 "확인"으로 설정

rss.html
<title>RSS 조회 결과</title>

<link rel="stylesheet" type="text/css" href="{{url_for('static', filename='style.css')}}">
<link> : 외부 리소스를 HTML 문서에 연결하는 태그
rel="styesheet" : 연결할 파일이 스타일시트임을 명시
type="text/css" : 연결할 파일의 MIME 타입을 나타냄
href : 연결할 스타일시트 파일의 경로
{{url_for{'static', filename='파일이름'}}} : static 폴더에 위치한 파일의 URL 경로를 자동으로 생성해 줌
<h1>RSS 결과 페이지</h1>

<table border="1">
<table> : 테이블 데이터를 표시하는 태그
border="1" : 테이블에 얇은 외곽선(1픽셀) 추가
<tr>
<td>제목</td>
<td>링크</td>
<td>요약</td>
</tr>
<tr> : 테이블의 행을 나타내는 태그
<td> : 테이블 데이터를 나타내는 태그, 한 개의 셀
{% for entry in feed.entries %}
{& for A in B %} : 반복문
feed.entries : 서버에서 return render_template('rss.html', feed=feed) 으로 전달받은 feed의 개별 항목들(아이템들)
<tr>
<td>{{entry.title}}</td>
<td>{{entry.link}}</td>
<td>{{entry.description}}</td>
</tr>
{{ }} : 안에 변수를 넣으면 처리 내용을 HTML로 변환
{% endfor %}
for 루프 종료
