[Python] request.form[], 백엔드, 프론트엔드, 웹 애플리케이션 개발, MVC, 템플릿 엔진

공부한 내용 정리하는 공간입니다.

틀린 내용이 있을 수 있습니다.

모든 지적, 첨언 환영합니다.

오늘의 코드

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 루프 종료