작은 메모장
6. 파일 속성 리스트와 중요 정보 탐지 본문
< 프레임워크란? >
Frame + work, 즉 어떤 틀에 맞춰서 동작하는 작업
왜 이게 필요한가?
어떤 커다란 프로젝트나 계획에서 개발자들이 서로 다른 환경에서 개발한다면 충돌, 오류의 위험이 커짐.
때문에 이러한 변수들을 통제하기 위해, 체계적으로 정해진 환경에서 개발한다면 이러한 요인을 최대한으로 줄일 수 있음.
그런 목적으로 기초적인 환경이 정해져 있는 것을 프레임워크라고 함.
파이썬 웹 프레임 워크
- Django (어려움, 용이함)
- Flask API (쉬움, 가벼움)
- Fast API (백엔드, 요즘 뜨고 있음)
< 사용한 라이브러리 >
pip install flask
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "Hello Flask"
if __name__ == "__main__":
app.run(debug=True)
기본 Flask 연습
<!DOCTYPE html>
<html>
<head>
<title>Download Page</title>
</head>
<body>
<h1>Download Page for translate result</h1>
<p>Translating Complete.</p>
<label>{{file_name}} </br>You can download result</label>
<form action="{{url_for('download_report')}}">
<input type="submit" value="Download result">
</form>
</body>
</html>
result.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>RSS Reading&Translating Site</title>
</head>
<body>
<h1>Upload RSS Site URL</h1>
<form method="post" action="{{url_for('process')}}" enctype="multipart/form-data">
<input type="text" name="input_url">
<input type="submit" value="submit">
</form>
</body>
</html>
upload.html
from flask import Flask, render_template, request
from flask import send_file
from googletrans import Translator
from datetime import datetime
import pandas as pd
import feedparser
import openpyxl
import time
app = Flask(__name__)
def rss_get(url):
feed = feedparser.parse(url)
now = datetime.now()
file_name = f"{now.strftime('%Y-%m-%d')}_result.xlsx"
file_path = f"static/{file_name}"
titles = []
links = []
descriptions = []
authors = []
pubDatas = []
for entry in feed.entries:
titles.append(entry.title)
links.append(entry.link)
descriptions.append(entry.description)
authors.append(entry.author)
pubDatas.append(entry.published)
data = {
"Title": titles,
"Link": links,
"Description": descriptions,
"Author": authors,
"Publish": pubDatas,
}
df = pd.DataFrame(data)
df.to_excel(file_path, index=False)
return [file_name, file_path]
@app.route("/")
def index():
return render_template("upload.html")
@app.route("/process", methods=["POST"])
def process():
url = request.form["input_url"]
file_info = rss_get(url)
workbook = openpyxl.load_workbook(file_info[1])
sheet = workbook.active
# 구글 번역
translator = Translator()
for row in sheet.iter_rows():
for cell in row:
translated_text = translator.translate(cell.value, dest="en").text
cell.value = translated_text
time.sleep(1)
workbook.save("transrated_excel.xlsx")
return render_template("result.html", file_name=[file_info[0]])
@app.route("/download_report")
def download_report():
return send_file("transrated_excel.xlsx", as_attachment=True)
if __name__ == "__main__":
app.run(debug=True)
app.py
RSS 링크를 올리면 정보를 저장 후 번역해서 그걸 사용자에게 돌려줌
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Result Page</title>
<link rel="stylesheet" type="text/css" href="{{url_for('static', filename='style.css')}}">
</head>
<body>
<h1>Result Page</h1>
<form method="post" action="{{url_for('compress')}}">
<table border="1">
<thead>
<tr>
<th>File name</th>
<th>File size</th>
<th>File date</th>
<th>File Select</th>
</tr>
</thead>
<tbody>
{% for file in files%}
<tr>
<td>{{file[0]}}</td>
<td>{{file[1]}}</td>
<td>{{file[2]}}</td>
<td><input type="checkbox" name="files" value="{{file[0]}}"></td>
</tr>
{% endfor %}
</tbody>
</table>
<button type="submit">Compress File</button>
</form>
</body>
</html>
list.html
from flask import Flask, render_template, request, send_file
import os
from datetime import datetime
import zipfile
app = Flask(__name__)
@app.route("/")
def list():
upload_path = "uploads"
files = []
for file in os.listdir(upload_path):
file_path = os.path.join(upload_path, file)
ctime_datetime = datetime.fromtimestamp(os.path.getctime(file_path)).strftime(
"%Y-%m-%d %H:%M:%S"
)
files.append((file, os.path.getsize(file_path), ctime_datetime))
return render_template("list.html", files=files)
@app.route("/compress", methods=["POST"])
def compress():
upload_path = "uploads"
files = request.form.getlist("files")
zip_path = os.path.join(upload_path, "compress.zip")
with zipfile.ZipFile(zip_path, "w") as zip_file:
for file in files:
file_path = os.path.join(upload_path, file)
zip_file.write(file_path, file)
if __name__ == "__main__":
app.run(debug=True)
app.py
특정 디랙토리(static)에 있는 파일 정보를 긁어오고, 이를 선택해 압축하는 프로그램
'실더스 루키즈 교육' 카테고리의 다른 글
8. 네트워크 개요 (0) | 2023.12.04 |
---|---|
7. CriminalIP API 활용 및 doc 파일 문서 자동화 (0) | 2023.11.29 |
5. RSS, FTP, API를 이용한 서비스 자동화 (0) | 2023.11.27 |
4. 파일 입출력, 메일 자동화, 웹 서비스 크롤링 (0) | 2023.11.24 |
3. 인프라 활용을 위한 파이썬 (0) | 2023.11.23 |