파일 업로드 코드는 다른 데이터를 저장하는 거와는 조금 다른 코드가 쓰인다고 한다.
mongo DB에 파일 자체를 저장하는 것이 아니라 파일 이름을 저장해야하는데
이 때 변환 하는 작업이 필요하다.
먼저,
from werkzeug.utils import secure_filename
from datetime import datetime
추가해준다.
file = request.files["file_give"]
save_to = 'static/my.jpg'
file.save(save_to)
파일을 저장하는 과정에서 이름을 바꿔줘야한다.
이때 변환하는 코드가 필요하다.
먼저, 확장자를 빼줘야한다.
extension = file.filename.split('.')[-1]
저장되는 날짜와 시간으로 새로운 이름을 만들어준다.
today = datetime.now()
mytime = today.strftime('%Y-%m-%d-%H-%M-%S')
filename = f'file-{mytime}'
새로운 이름이 만들어졌으면 저장을 해야한다.
맨 윗 코드에서 약간 변경이 되었다.
save_to = f'static/{filename}.{extension}'
file.save(save_to)
doc 부분에 "'img': f'{filename}.{extension}',"를 추가해주고
db에 doc을 추가해주는 문구 밑에 "f.save(secure_filename(f.filename))"를 추가해주면 마무리가 된다.
doc = {
'img': f'{filename}.{extension}',
'title': title_receive,
'ncity': ncity_receive,
'story': story_receive,
'address': address_receive
}
db.sgalls.insert_one(doc)
f.save(secure_filename(f.filename))
Mongo DB에서 이미지 파일이 어떻게 저장되는지 확인해본다.
날짜와 저장되는 시간으로 이름이 변경되어 저장이 된다.
나는 도시별로 각 페이지로 분류해서 출력하고 싶다.
post 페이지에서 글과 사진을 입력하면 Mongo DB에 ncity 가 어떻게 저장되는지 확인한다.
먼저 예를 들어 Newyork html 확인해본다.
function cardpic() {
$.ajax({
type: "GET",
url: `/gall?ncity=newyork`,
/gall 에 저장한 데이터를 나는 가져올 거고, 그 중에 ncity가 newyork으로 저장된 데이터만 가져와서 출력할 거다.
그래서 /gall 뒤에 분류하기 위해 url 부분에는 ?ncity=newyork 이라고 임의로 나만의 id값을 준다.
cardpic 이라는 함수를 만들어줬다.
@app.route('/gall', methods=['GET'])
def cardpic():
ncity = {'newyork': 'Newyork', 'la': 'LosAngeles', 'seattle': 'Seattle'}
sgalls = list(db.sgalls.find({'ncity': ncity[request.args['ncity']]}))
for elem in sgalls:
elem['_id'] = str(elem['_id'])
return jsonify({'sgalls':sgalls})
cardpic 을 살펴보면 ncity 안에 'newyork 은 db 에 저장되는 Newyork 이야!' 라는 식으로 저장을 한다. 이렇게 하면 /gall?ncity=(도시이름) 으로 설정해놓은 페이지에 해당되는 데이터만 골라서 보여주게된다.
이 모든 데이터는 sgalls 안에 저장되어 있으므로 그 중에
db.sgalls.find 라는 코드를 이용해 sgalls 안의 ncity 를 요청한다.
Mongo DB는 각 데이터마다 id 값을 준다.
이렇게 _id는 ObjectId 로 표시가 된다.
각 데이터 마다 붙어있는 이 id를 서버 주소 뒤에 붙여 카드 템플릿의 사진이나 제목을 누르면 해당 상세 페이지로 나오게 하려 했다.
하지만 ObjectId는 그냥 바로 사용하면 안되고,
string 문자열로 변환하여 url 뒤 id 값으로 받은 후
그 id 를 다시 ObjectId 변환하여 해당하는 데이터를 페이지에 출력해야한다.
그리고 find_one을 이용하여 그 데이터 중에 하나만 찾기, 를 한다.
여기서도 먼저
from bson import ObjectId
윗 부분에 추가해준다.
@app.route('/coll', methods= ['GET'])
def viewpic():
sgall = db.sgalls.find_one({'_id': ObjectId(request.args['id'])})
sgall['_id'] = str(sgall['_id'])
return jsonify ({'sgall':sgall})
Mongo DB에서 받은 ObjectId를 이용하여 url id 값을 추출하는 방법을 이번 기회를 통해 알게 되었다.
각 페이지별 서버주소를 만들어주어야, view.py 를 실행했을때 모든 페이지가 실행이 된다.
@app.route('/')
def main():
return render_template('SGmain.html')
@app.route('/gohome')
def home():
return render_template('SGhome.html')
@app.route('/posting')
def posting():
return render_template('SGpost.html')
@app.route('/view/1')
def picture_view():
return render_template('SGnyc.html')
@app.route('/view/2')
def picture_view01():
return render_template('SGla.html')
@app.route('/view/3')
def picture_view02():
return render_template('SGsea.html')
@app.route('/gall1')
def load():
return render_template('SGgall01.html')