Bibi's DevLog ๐ค๐
TIL - [20.08.26] ๋ณธ๋ฌธ
์ค๋์ ํ๊ต ๊ฐ์ ์กธ์ ์ฅ ๋ฐ์์จ ๋ ! ์ ๋ ์๋ ์คํ๋ฅดํ ์์ ๋ ์๋ค. ๊ทธ ์ฌ์ด์ ๊ณต๋ถ๊ณต๋ถ
์ค๋ ํ ์ผ
-ํํฐ๋์ด ์์ ํด ์ฃผ์ ๋ถ๋ถ๋ค์ ์ฐพ๊ณ , ๊ตฌ๊ธ๋งํด์ ์ ๋ฆฌํด๋๊ธฐ
-์ผ์ ํธ์งAPI - ํธ์ง๋ ๋ด์ฉ ์ ์ฅํ๋ ๋ถ๋ถ ๋ง๋ค๊ธฐ
-(์์
์๊ฐ์ ์ด์ด์ ํ๊ธฐ) ๋ ์จ์กฐํ API ์ค๊ณํ๊ณ ๋ง๋ค๊ธฐ
TIL
-ํํฐ๋์ด ์์ ํด ์ฃผ์ ๋ถ๋ถ๋ค์ ์ฐพ๊ณ , ๊ตฌ๊ธ๋งํด์ ์ ๋ฆฌํด๋๊ธฐ
(1)
DB์์ '_id' ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ ์ฌ์ฉํ๊ธฐ ์ํด ๊ธฐ์กด์ ์ฐ๋ jsonify๋ฐฉ์์ด ์๋ dumps๋ฐฉ์์ ์ฐพ์์ ๋ด ์ฝ๋์ ์ ์ฉํด ์ฃผ์
จ๋ค.
dumps๋ฐฉ์์ด ๋ฌด์์ธ์ง ๊ตฌ๊ธ๋งํ๋๋ฐ ์์ด ์๋ฃ๊ฐ ์ ๋ง ๋ง๊ณ ๊ตฌ๊ธ๋ฒ์ญ์ผ๋ก ๋ด๋ ๋ชจ๋ฅด๋ ์ฉ์ด๊ฐ ๋ง๋ค(ใ
ใ
)
์์ด๊ณต๋ถ์ ์ปดํจํฐ๊ณตํ ๊ธฐ์ด ๊ณต๋ถ์ ํ์์ฑ์ด ์ ์คํ๊ฒ ๋๊ปด์ง๋ ์๊ฐ์ด๋ค.ใ
๊ทธ๋๋ง ๋ด๊ฐ ์ฐพ๋ ๋ด์ฉ์ ๋ค๋ฃจ๋ stackoverflow์๋ฃ๊ฐ ์์ด์ ๊ตฌ๊ธ๋ฒ์ญ์ด๋ผ๋ ํด ๋ณด์๋ค.
(.dumps์ .jsonify ๋ฐฉ์์ ์ฐจ์ด)
https://stackoverflow.com/questions/7907596/json-dumps-vs-flask-jsonify
The jsonify() function in flask returns a flask.Response() object that already has the appropriate content-type header 'application/json' for use with json responses. Whereas, the json.dumps() method will just return an encoded string, which would require manually adding the MIME type header.
See more about the jsonify() function here for full reference.
Edit: Also, I've noticed that jsonify() handles kwargs or dictionaries, while json.dumps() additionally supports lists and others.
comment : jsonify() handles lists now. See this commit.
ํด์ ๋ฐ ์์ฝ :
jsonify() ๋ Flask์ ๋ด์ฅํจ์ ์ค ํ๋์ด๋ฉฐ, ์๋ต์ ์ฌ์ฉํ ์ ์ ํ ์ฝํ ์ธ ์ ํ ํค๋ 'application / json'๊ฐ ์ด๋ฏธ ์๋ flask.Response() ๊ฐ์ฒด(object)๋ฅผ ๋ฐํํ๋ค.
๋ฐ๋ฉด json.dumps()๋ ๋ฉ์๋์ด๋ฉฐ, MIMEํ์ ํค๋๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํด์ผ ํ๋ "์ธ์ฝ๋ฉencoded ๋ ๋ฌธ์์ด" ๋ง ๋ฐํํฉ๋๋ค.
jsonify()๋ kwargs, dictionary(๋์
๋๋ฆฌ) ํ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
๋ฐ๋ฉด .dumps()๋ kwargs, dictionary, list ์ ๊ทธ๋ฐ์ ํ์์ ๋ฐ์ดํฐ๋ ๋ค๋ฃฐ ์ ์๋ค.
+ ์ถ๊ฐ : ์ด์ .jsonify()๋ list(๋ฆฌ์คํธ) ํ์์ ์ง์ํ๋ค.
*kwargs : ํ์ด์ฌ์์์ ๊ฐ๋
์ผ๋ก keyword argument์ ์ค์๋ง์ด๋ค. ํค์๋๋ฅผ ์ ๊ณตํ๋ฉฐ, ํค์๋=ํน์ ๊ฐ ํํ๋ก ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค. ์ด๊ฒ์ {'ํค์๋' : 'ํน์ ๊ฐ'} ์ ๋์
๋๋ฆฌ ํํ ๊ทธ๋๋ก ํจ์ ๋ด๋ถ๋ก ์ ๋ฌ๋๋ค.
์ฐธ๊ณ ํ ๋งํฌ : https://brunch.co.kr/@princox/180
-> ์์ง ๋ชจ๋ฅด๋ ์ฉ์ด๋ค์ด ๋ง์ง๋ง (application/json, MIMEํ์
์ด ๋ญ์ง. ์ธ์ฝ๋ฉ๋encoded์ ๊ฐ๋
)
๊ทธ๋๋ ๋ด ์์ค์์ ์ดํดํ์๋ฉด..
.dumps๊ฐ .jsonify๋ณด๋ค ๋ ๋ง์ ๋ฐ์ดํฐํ์
์ ๋ค๋ฃฐ ์ ์์ง๋ง .jsonify๊ฐ ๋ด์ฅํจ์๋ผ์ ๋ ์ฐ๊ธฐ ํธํ ๋ฏ ํ๋ค.
(์์
์ค์ ๋ค๋ฃฌ ๋ฐ์ดํฐ๋ค์ ์ ๋ถ .jsonify๋ก ๋ค๋ฃฐ ์ ์๋ ์ ํ์ด์๊ณ , mongoDB์ _id๊ฐ์ ์ฒ๋ฆฌ๋์ง ์์ ์๋ฌ๊ฐ ๋จ๊ธฐ ๋๋ฌธ์ DB๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ๋ ์ ์ธ์กฐ๊ฑด์ผ๋ก ํญ์ {'_id' : 0}์ ๋ฃ์์๋ค.
->๋ .dumps๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ์ด์ฌ ํ์ผ ๋งจ ์์
from bson.json_util import dumps
from bson.objectid import ObjectId
์ด ๊ตฌ๋ฌธ์ ์ถ๊ฐํ์๋๋ฐ, ์๋ง dumps์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๊ฒ ๊ฐ๋ค.
(2)
์๋ฐ์คํฌ๋ฆฝํธ : this ์ e
(์ผ์ ์กฐํํจ์-readsche)๊ฐ ์ผ์ ์ db์์ ๋ถ๋ฌ์ appendํ๋ card์ ํธ์ง ๋ฒํผ์ ์จํด๋ฆญํจ์์ ์ธ์๋ก this๋ฅผ ๋ฃ๊ณ - fixsche(this) ,
(์ผ์ ํธ์ง์ ์ํ ์กฐํํจ์-readasche)์ ์ธ์๋ก e๋ฅผ ๋ฃ์ด ๊ทธ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๋ ์์ผ๋ก ์ฐ๊ฒฐํด ์ฃผ์ จ๋ค.
-> ์ฌ์ฉ๋ฒ์ ๊ฒ์ํด ๋ดค๋๋ฐ (์๋ฐ์คํฌ๋ฆฝํธ this์ e, ์๋ฐ์คํฌ๋ฆฝํธ this ๋ฑ..) ์ด๋ฐ ์์ผ๋ก ์ฌ์ฉํ๋ ์์ ๊ฐ ์ ์ ๋์จ๋ค. ใ ใ ํํฐ๋๊ป ๊ฐ์ ๊ตฌ๊ธ๋ง ํค์๋๋ฅผ ์ข ์ฌ์ญค๋ด์ผ๊ฒ ๋ค.
-4. ์ผ์ ํธ์งAPI : 4-2ํธ์ง๋ ๋ด์ฉ ์ ์ฅํ๋ ํจ์(fixsche) ๋ง๋ค๊ธฐ
ํํฐ๋์ ์ง๋ ํผ๋๋ฐฑ์ ๋ฐ๋ผ ์ผ์ ํธ์งAPI๋ฅผ 4-1.ํธ์งํ ์ผ์ ์กฐํ ํจ์(readasche) ์ 4-2.์ผ์ ๋ณ๊ฒฝ ํจ์(fixsche)๋ก ๋๋์๋ค. ์ผ์ ์กฐํํจ์๋ ํํฐ๋์ด ๋์์ฃผ์ จ๊ณ ์ผ์ ๋ณ๊ฒฝํจ์๋ ๋ด๊ฐ ๋ง๋ค์ด์ผ!
-4-2 fixsche ์ค๊ณ
์ผ์ ๋ณ๊ฒฝ์ ์ํ ์์ input์ฐฝ์ ๊ฐ์ ๋ถ๋ฌ์์, ajax๋ฅผ ํตํด POST๋ฐฉ์์ผ๋ก db์ ์ ์ฅ๋๋๋ก ํ๋ค.
->์ค๊ณํ๋ ค๊ณ ์๊ฐํด ๋ณด๋, ์ผ๋ฐ์ ์ธ ์ผ์ ์์ฑ input์ฐฝ์ id์ ๋๊ฐ์ผ๋ฉด ๋ฌธ์ ๊ฐ ๋๋ ค๋?์ถ๋ค.
์๋ฒ์ ์ ์ก๋๋ key๊ฐ์ ๊ทธ๋๋ก ํ๋ html์์ id๋ ์ฐจ์ด๋ฅผ ์ฃผ์ด์ผ ํ ๊น?..
๊ตณ์ด ๊ทธ๋ด ํ์ ์์ ๊ฒ ๊ฐ๊ธฐ๋ ํ๋ฐ ๊ณ ๋ฏผ์ด๋ค.
์์ผ๋ก ํ ์ผ(ํ๋ก์ ํธ ๋ง๊ฐ๊น์ง)
์ผ์ ํธ์งAPI 4-2 ์์ฑํ๊ธฐ
์นดํก/์ด๋ฉ์ผ ์๋ฆผ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ (์นดํก:ํ์น, ์ด๋ฉ์ผ: ํ์ด์ฌ ํจ์)
๋ ์จ์กฐํ API ์ค๊ณํ๊ณ ๋ง๋ค๊ธฐ
ํ์๊ธฐ๋ฅ ์ถ๊ฐํ๊ธฐ
๊ทธ๋ฆฌ๊ณ ๋ง๋ฌด๋ฆฌ ์ฐจ์์์ ์ ์ฒด์ ์ธ ์์ฑ๋๋ฅผ ๋์ด๊ธฐ.
์ค๋์ ์์๊ณต๋ถ์๊ฐ - 1:33:36(+์คํ๋ฅดํ ์์
&์ฝ๋ฉ์๊ฐ-์ฝ 3์๊ฐ)
ํํฐ๋ ํผ๋๋ฐฑ
response = JSON.parse(response)
//์ธ์ด์ค์ผ์ดํํ๋ ๊ณผ์ .
// dumps์ jsonify์ ์ฐจ์ด๋ ์ผ์ข
์ ์ํธํ/์ํธํํ์ง์์ ์ ์ฐจ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
//์ฆ dumps๋ ์ธ์ฝ๋ฉํ์ฌ ๊ฐ์ ๋ฐํํด์ฃผ๋ ๊ฑฐ๊ณ (๊ทธ๋์ _id๊ฐ๋ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊ฒ) ์ด์ค์ผ์ดํ(escaping).
//jsonify๋ ์ธ์ฝ๋ฉ๊ธฐ๋ฅ ์์ด ๊ฐ์ ๋ฐํํด์ฃผ๋ ๋๋.(๊ทธ๋์ _id๊ฐ์ ์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฒ - _id๊ฐ์ ์ธ์ฝ๋ฉ๋์ด ์ฒ๋ฆฌ๋์ด์ผ ํ๋ ๋ฐ์ดํฐ์ด๋ฏ๋ก)
//response = JSON.parse(response)๋ ์๋ฒ์์ dumps๋ก ์ธ์ฝ๋ฉ(์ํธํ)๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋์ฝ๋ฉ(๋ณตํธํ)ํ๋ ๋ช
๋ น์ด๋ค! ์ธ์ด์ค์ผ์ดํ(unescaping)
//์๋ฒ-ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ์ _id๊ฐ์ด ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ์ ์ฐจ๊ฐ ํ์ํ ๊ฒ.
๊ทธ๋ฆฌ๊ณ
// _id๊ฐ์ ์ค์ ๋ก ObjectId(_id = "5f434bc8ee94cdd9868eae10") ์ด๋ฐ ํํ์ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์
// id ๊ฐ์ ๋ด์ฉ์ผ๋ก ์กฐ๊ฑด์ ๊ฑธ ๋ {"_id":~~}๋ก๋ง ํ๋ฉด ์ ๋๊ณ , {"_id": ObjectId(~~)} ๋ก ์ ์ด์ฃผ์ด์ผ. oid=objectid.
-์ผ์ ํธ์งAPI ๋๋์ด ์์ฑ!!ใ
ใ
ใ
์ด๋ ๊ฒ CRUD ๊ธฐ๋ณธ API๊ฐ ์์ฑ๋์๋ค๐
์ด์ ..
-ํ์์ ๊ธฐ๋ฅ
-์๋ฆผ(์ด๋ฉ์ผ, ์นดํก) ๊ธฐ๋ฅ
-๋ ์จ์กฐํ ๊ธฐ๋ฅ
์ด ์ ์ ํ๋ฉด ๋๋๋ฐ ์ฌ์ฌ ์ ํ๊ณผ์ง์ค์ด ํ์ํ ๊ฒ ๊ฐ๊ธด ํ๋ค..!
=>ํํฐ๋๊ณผ ์์ํด๋ณด๋ ํ์์ ๊ธฐ๋ฅ์ ๋์ ํด๋ณด์๊ณ ํ์ จ๋ค!
(์คํ๋ฅดํ ์๋ฃ 'ํ๊ฑธ์ ๋' ์ฐธ๊ณ ํด์)
ํ์์์คํ
-์ผ๋จ ํ๊ฑธ์๋์ ์๋ ์ํ ํ์๊ฐ์ , ๋ก๊ทธ์ธ ํ๋ก๊ทธ๋จ ๋ฏ์ด๋ณด๊ธฐ
DB๋ด์ ์ ๋ณด์ ์ด์ ํ๋ ์ถ๊ฐํด์, ํ์๋ฒํธ๋ id๊ฐ์ ์ฃผ๊ณ ๋๊ฐ ์ด ์ผ์ ์ธ์ง ๊ตฌ๋ถํ๋ฉด ๋๋ค.
DB๋ฅผ ์งค ๋๋..
->'์์
'์ด๋ฉด ์ด๋ป๊ฒ ํ ์ง๋ฅผ ์๊ฐํด๋ณด๋ผ! DB๋ ๊ฒฐ๊ตญ 2์ฐจ์์ ๊ฐ๋
์ด๊ธฐ ๋๋ฌธ.
๋ก๊ทธ์ธ์์คํ ์ ์ํด ํ ์ผ
- index.html์์ ๋ก๊ทธ์ธ, ํ์๊ฐ์ , ๋ก๊ทธ์์์ด ๊ฐ๋ฅํ UI๋ฅผ ๋ง๋ค๊ธฐ. ๊ทธ๋ฆฌ๊ณ ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ํจ์ ๋ฐ์ ๋ด ํ์ด์ง ์๋ ๋ด์ฉ ๋์ค๊ฒ ํ๊ธฐ.
- login.html์์ ๋ก๊ทธ์ธ ์ฐฝ์ ๊ฐ๋จํ ๋ง๋ค๊ธฐ.
- register.html์์ ํ์๊ฐ์ ์ฐฝ์ ๊ฐ๋จํ ๋ง๋ค๊ธฐ.
- app.py์ ์ํ ๋ก๊ทธ์ธ,ํ์๊ฐ์ ์๋ฒ ์ฝ๋๋ฅผ ๋ณต๋ถํด ๋ฃ๊ณ ๋ด ํ๋ก์ ํธ์ ๋ง๊ฒ ๊ณ ์ณ๋ณด๊ธฐ.
โปํํฐ๋์ด ์ฐพ์์ฃผ์ .. ๊ฒ์์ด ํํ๊ฒ ํด์ฃผ๋? ๋ฐฉ๋ฒ
: ์ ํํ ๊ฒ์์ด๋ก ๊ฒ์ํ์ง ์์๋ ์ ์ฌํ ๊ฒฐ๊ณผ ๋ณด์ฌ์ฃผ๊ธฐ.-> ์ผ์ ๊ฒ์ํ ๋ ์ฌ์ฉํ๊ธฐ
collection.find({'field': {'$regex':'regular expression'}})
https://stackoverflow.com/questions/39683102/find-documents-which-contain-a-particular-value-mongo-python