[211011]
10์์ ์ฒ์์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์ด๋ณด๋ฉด์ ๊ฐ๋ตํ๊ฒ ์ ์๋ ๊ธฐ๋ก๋ค์ด๋ค. ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ๋ฅผ ๊ฐ์คํ๋ฉด์ ๊ทธ๋๋ก ์ฎ๊ธด ๊ธ. ์ด๋๋ ์ด์ฌํ ์ข ์ธ๊ฑธ ๊ทธ๋ฌ๋ค.
์ด๋ฏธ์ง ์ ๋ก๋
SNS ํผ๋์ฒ๋ผ ์ ๋ก๋ํ ์ด๋ฏธ์ง๋ค์ ๋ณผ ์ ์๋๋ก ํ๋ค. ์ด๋ฏธ์ง๋ฅผ ์๋ฒ์ชฝ์ ์ ์ฅํ๋ ค๊ณ ํ์ง๋ง ์ด๋๋ค ์ ์ฅํ ์ง๊ฐ ๊ณ ๋ฏผ. ๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ํ๋ ํ๋ก์ ํธ๋ผ, ์๋ง์กดs3 ๊ฐ์ ์คํ ๋ฆฌ์ง ์๋น์ค๋ฅผ ์ฐ๊ธฐ์ ๊ตณ์ด ๋ผ๋ ๋๋์ด ๋ค์๋ค. ์๋ฒ์ ๋ก์ปฌ ๋๋ ํ ๋ฆฌ์ ํ์ผ์ ์ ์ฅํ๊ธฐ๋ก ํ๋ค.
@app.route('/api/upload', methods=['POST'])
def post_topster():
now = datetime.now()
now2 = now.strftime("%D_%H%M_%S")
date = now2.replace('/', '-')
try:
data = request.get_json()
userid = request.args.get('user')
absolute_path = os.path.abspath(__file__)
path = os.path.dirname(absolute_path)
path_root = os.path.dirname(path)
path_user = path_root + '/images/' + userid
if not os.path.exists(path_user):
os.makedirs(path_user)
dataValue = str(data['topsterimage'])
dataBin=dataValue.split(',')[1]
imgdata = base64.b64decode(dataBin)
filename = path_user + '/' + date +'.png'
data = {"userid":userid, "filename":filename, "like":0,"likeuser": [None], "date":now}
db.posts.insert_one(data)
with open(filename, 'wb') as f:
f.write(imgdata)
return jsonify({'msg':"upload succeeded"})
except:
return jsonify({'msg':"error"})
images/'์ ์ id'/'์ฌ๋ฆฐ์๊ฐ'.png ๋๋ ํ ๋ฆฌ์ ํ์ผ์ ์ ์ฅํ๋ค. ํด๋๊ฐ ์์ผ๋ฉด ์์ฑํ ํ์ ์ ์ฅํ๋ค. ์๊พธ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ด๋๋ฆฌ ํํ๋ก ๋ฐ์์ ธ์ (์ ์ง ๋ชจ๋ฅด๊ฒ ๋ค..) ๋ค์ base64๋ก ์ธ์ฝ๋ฉํด์ ์ ์ฅํ๋ค.
์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ
const getPost = async () => {
let userid;
try {
.
.
.
const response = await axios({
method: "GET",
url: `http://***:5000/api/feed?user=${userid}&search=all&offset=${offset}&limit=5`,
});
const results = response.data.feedData;
results.map((result, index) => {
.
.
.
);
//๋ ๋ถ๋ฌ์ค๊ธฐ
if (results.length === 5) {
setOffset((prev) => prev + 5);
} else {
setOffset(false);
}
} catch (error) {
console.log(error);
}
};
ํ๋ก ํธ์์ offset๊ณผ limit ๊ฐ์ ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ค๋ค. ๊ฐ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์์ค๋ฉด offset์ limit๋งํผ ํค์์ ๋๊ฒจ์ค.
#-------ํผ๋ ๊ฐ์ ธ์ค๊ธฐ-------
@app.route('/api/feed', methods=['GET'])
def get_feed():
user = request.args.get('user')
search = request.args.get('search', None)
offset = request.args.get('offset', None)
limit = request.args.get('limit', None)
print("user:", user,"search:", search,"offset:", offset, "limit:", limit)
if search :
if search == "all": #์ ์ฒด ํผ๋
data = list(db.posts.find({}).sort("_id",-1).skip(int(offset)).limit(int(limit)))
else: #๋ด๊ฐ ์ด ํผ๋
data = list(db.posts.find({'userid':search}).sort("_id",-1)) #์๊ฑฐ๋ถํฐ ๋งจ ์๋ก
newdata = list()
for i in data:
#์ด๋ฏธ์ง ํ์ผ ๊ฐ์ ธ์ค๊ธฐ
with open(i['filename'], "rb") as f:
filedata = f.read()
encoded = base64.b64encode(filedata)
topsterimage = "data:image/png;base64," + encoded.decode('utf-8')
#ํผ๋ ์ข์์ ์ฌ๋ถ ๊ฐ์ ธ์ค๊ธฐ
likeuser = i['likeuser']
if user in likeuser:
likebool = 1
else:
likebool = 0
doc = {'userid':i['userid'], 'topsterImage':topsterimage, 'date':i['date'], '_id':str(i["_id"]), "like":i['like'], "likebool":likebool }
newdata.append(doc)
return jsonify({"feedData":newdata})
return jsonify({'msg':"received"})
๋ชจ๋ฌ
๋ด ํฌ์คํธ๋ฅผ ์ญ์ ํ๊ธฐ ์ ์ ํ๋ฒ ๋ ๋ฌผ์ด๋ณด๋ ๋ชจ๋ฌ ์ฐฝ์ ๋ง๋ค์๋ค.
const openModal = (e) => {
this_modal.current.classList.remove("hidden");
const data = e.currentTarget.getAttribute("postid");
setDelPostID(data);
};
const closeModal = () => {
this_modal.current.classList.add("hidden");
};
.
.
.
<div class="modal hidden" ref={this_modal}>
<div class="modal_overlay" ref={overlay} onClick={closeModal}>
</div>
<div class="modal_content">
<ModalFeed
closeModal={closeModal}
delPostID={delPostID}
setDelSucceeded={setDelSucceeded}
/>
</div>
</div>
ํด๋น ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ชจ๋ฌ์ฐฝ์ด ๋ณด์ฌ์ง๊ณ , ๋ณด์ฌ์ง๋ ์ปดํฌ๋ํธ ์์ ๋ก๊ทธ์์ ํจ์๋ฅผ ๋ฃ์ด ๋จ๋ค.
/*๋ชจ๋ฌ*/
.modal {
border: 1px solid black;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 100;
display: flex;
justify-content: center;
align-items: center;
}
.modal_overlay {
background-color: rgba(0, 0, 0, 0.6);
width: 100%;
height: 100%;
position: absolute;
}
.modal_content {
background-color: white;
position: relative;
top: 0px;
width: 270px;
height: 120px;
text-align: center;
border-radius: 20px;
}
.hidden {
display: none;
}
์ธ์คํ๊ทธ๋จ ์น ํ์ด์ง์ ๋์์ธ์ ์ฐธ๊ณ ํด์ ๋ง๋ค์๋ค. 3๋ท ๋ฉ๋ด ๋ฒํผ์ ํด๋ฆญํ๋ฉด,
๋ค์๊ณผ ๊ฐ์ ๋ชจ๋ฌ์ฐฝ์ด ํ๋ฉด์ ๋์จ๋ค. ๋ชจ๋ฌ์ฐฝ์ด ๋์จ ๊ฒฝ์ฐ์๋ ํ๋ฉด ์คํฌ๋กค์ด ๋์ง ์๋๋ก ํ๋ค.
๊ฒฐ๊ณผ
๋๋ฆ ๋ง์กฑ์ค๋ฌ์ด ๊ฒฐ๊ณผ๋ฌผ์ด ๋์๋ค. EC2๊ฐ ๊ฐ์๊ธฐ ๊ฒฐ์ ๋ผ์ ๋ฌด์์์ ๋ฐ๋ก ์๋ฒ ๋ด๋ฆฌ๊ธด ํ์ง๋ง... ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ๋์กํ๊ฒ ๋จธ๋ฆฟ์์ ์๋ ๋ฆฌ์กํธ ์ง์๋ค์ด ์ด๋์ ๋ ์ ๋ฆฌ๋๋ ๊ฒ ๊ฐ๋ค.