과거공부모음
나의 개발일지 TIL(Today I learned) - 미니프로젝트 (4일)
MUJA
2022. 12. 8. 10:17
Today I learned
- 페이지네이션
- 이미지업로드
페이지네이션
페이지네이션이란 Paginatio = page + navigation으로 페이징하는 것을 말한다
페이지네이션을 하려면 필요한 것들이 있다 총 데이터의 개수, 한 페이지에 뽑아줄 데이터의 개수, 마지막 페이지
페이지 버튼 블럭의 사이즈, 총 블럭의 개수 조금 복잡하다
# 페이지 값 (디폴트값 = 1)
page = request.args.get("page", 1, type=int)
# 한 페이지 당 몇 개의 게시물을 출력할 것인가
limit = 8
db = pymysql.connect(host='localhost', user='root', db='yogurt', password='0000', charset='utf8')
curs = db.cursor()
# 데이터 총 개수 세기
curs.execute("SELECT COUNT(*) FROM board;")
all_count = curs.fetchall()[0][0]
if all_count == 0:
response = {'boards': {}, 'page': page, 'total_page': all_count}
return jsonify({'response': response})
curs.execute("SELECT * FROM board ORDER BY `date` DESC LIMIT %s OFFSET %s;", (limit, (page - 1) * limit))
data_list = curs.fetchall()
# 마지막 페이지의 수 구하기
last_page_num = math.ceil(all_count / limit) # 반드시 올림을 해줘야함
# 페이지 블럭을 5개씩 표기
block_size = 5
# 현재 블럭의 위치 (첫 번째 블럭이라면, block_num = 0)
block_num = int((page - 1) / block_size)
# 현재 블럭의 맨 처음 페이지 넘버 (첫 번째 블럭이라면, block_start = 1, 두 번째 블럭이라면, block_start = 6)
block_start = (block_size * block_num) + 1
# 현재 블럭의 맨 끝 페이지 넘버 (첫 번째 블럭이라면, block_end = 5)
block_end = block_start + (block_size - 1)
우리는 flask에서 제공하는 패키지를 이용해서 조금 더 쉽게 만들어 봤다
per_page = 8
page, _, offset = get_page_args(per_page=per_page)
db = pymysql.connect(host='localhost', user='root', db='yogurt', password='0000', charset='utf8')
curs = db.cursor()
curs.execute("SELECT COUNT(*) FROM board;")
all_count = curs.fetchall()[0][0]
curs.execute("SELECT * FROM board ORDER BY `date` DESC LIMIT %s OFFSET %s;", (per_page, offset))
data_list = curs.fetchall()
db.commit()
db.close()
pagination = Pagination(page=page, per_page=per_page, total=all_count, record_name='board', css_framework='foundation', bs_version=5)
if "id" not in session:
id = None;
name = None;
return render_template('main.html', data_lists=data_list, pagination=pagination, id=id, name=name)
return render_template('main.html', data_lists=data_list, pagination=pagination, id=session["id"], name=session["name"], css_framework='foundation', bs_version=5)
flask-pagenate를 사용하면 get_page_args()를 이용해서 현재 페이지와 시작점을 쉽게 얻을 수 있어 데이터의 총 개수만 잘 구해주면 쉽게 구현할 수 있다
이미지업로드
이미지 파일을 선택하면 미리보기를 보여주고 확인을 누르면 이미지가 static안에 img폴더에 저장이 진행되고
DB에는 이미지 이름이 저장이 된다
$("input[type=file]").change(function (event) {
let tmpPath = URL.createObjectURL(event.target.files[0]);
$("#user_image").attr("src", tmpPath);
console.log(tmpPath)
});
$(".upload").click(function () {
const imageInput = $("#imageInput")[0];
const name = $("#name").val();
console.log("imageInput: ", imageInput.files)
if (imageInput.files.length === 0) {
alert("파일은 선택해주세요");
return;
}
const formData = new FormData();
// <input type="file" name="file" value="선택한 파일">
formData.append("file", imageInput.files[0]);
formData.append("name", name)
$.ajax({
type: "POST",
url: "/upload",
processData: false,
contentType: false,
data: formData,
success: function (rtn) {
}
})
})
UPLOAD_FOLDER = 'static/img'
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# 생략
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
print(file.filename)
# if user does not select file, browser also
# submit an empty part without filename
if file.filename == '':
flash('No selected file')
return redirect(request.url)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return redirect("/")
return jsonify({"msg": "good"})
느낀 점
페이지네이션을 하면서 SQL에서 ORDER BY, DESC, LMIT, OFFSET등을 학습할 수 있었다
SQL을 잘 사용한다면 데이터를 관리하기 더 편할 거 같다