[S GALLERY] 데이05

sooj·2021년 7월 5일
0

파일 업로드해서 저장하기.

파일 업로드 코드는 다른 데이터를 저장하는 거와는 조금 다른 코드가 쓰인다고 한다.

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에서 이미지 파일이 어떻게 저장되는지 확인해본다.

날짜와 저장되는 시간으로 이름이 변경되어 저장이 된다.

savepic, 도시별로 저장하기.

나는 도시별로 각 페이지로 분류해서 출력하고 싶다.
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 를 요청한다.

id 값을 찾기.

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')
profile
개발일지 모음집

0개의 댓글