๐ฉ๐ป Learn programming
[๋๋ง์ ๋จ์ด์ฅ] 6. ์์ธํ์ด์ง - jinja2๋ก ๋จ์ด ๋ป ๊ฐ์ ธ์ค๊ธฐ
๋ฐ๊ตฅ์
2022. 5. 4. 14:10
๋ฐ์ํ
Jinja2 ํ ํ๋ฆฟ ์ธ์ด
- Flask ํ๋ ์์ํฌ์์ ์ฌ์ฉํ๋ ํ ํ๋ฆฟ ์ธ์ด.
- ‘ํ ํ๋ฆฟ’์ด ๋๋ Html ๋ฌธ์์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ ๊ณณ์ ํ์ํด๋๋ ์ญํ ์ ํฉ๋๋ค.
- ํ์ด์ฐธ > setting > Template Languages > Jinja2 ์ค์
โ Owlbot API ์์ฒญ Flask
r = requests.get(f"<https://owlbot.info/api/v4/dictionary/{keyword}>", headers={"Authorization": "Token [๋ดํ ํฐ]"})
result = r.json()
print(result)
โ
jinja2๋ฅผ ์ด์ฉํด์ detail.html์ ๊ฐ์ ์ฑ์ ๋ฃ์ด์ฃผ๊ธฐ ์ํด detil.html๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ detail ํจ์ ์์
์ฌ์ API์ ์์ฒญ์ ๋ณด๋ด๊ณ ๊ฐ์ ๋ฐ์์ค๋ ๋ถ๋ถ์ด ํ์.
@app.route('/detail/')
def detail(keyword):
# API์์ ๋จ์ด ๋ป ์ฐพ์์ ๊ฒฐ๊ณผ ๋ณด๋ด๊ธฐ
r = requests.get(f"<https://owlbot.info/api/v4/dictionary/{keyword}>", headers={"Authorization": "Token [๋ด ํ ํฐ]"})
# 1. url์ ์ผ๋ถ๋ฅผ ๋ฐ์์ keyword๋ผ๋ ๋ณ์๋ก ์ ์ฅํด์ ์์ฒญ์ ๋ณด๋ด๋ url ๋ค์๋ค๊ฐ ๋ฃ์ด์ค
# 2. header ์ ๋ณด ์์ ๋ด ํ ํฐ์ ๋ฃ์ด์ ํ๊ฐ๋ฅผ ๋ฐ์
result = r.json()
# ๋ฐ์์จ ๊ฒฐ๊ณผ๋ json ํํ์ด๊ณ , result๋ผ๋ ๋ณ์์ ๋ฃ์
print(result)
return render_template("detail.html", word=keyword, result=result)
# reult๋ฅผ detail.html์ result๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ณด๋ด์ฃผ์ธ์
<div class="container">
<div class="d-flex justify-content-between align-items-end">
<div>
<h1 id="word" style="display: inline;">{{ word }}</h1> <!-- ๋จ์ด -->
<h5 id="pronunciation" style="display: inline;">/{{ result.pronunciation }}/</h5> <!-- ๋ฐ์ -->
</div>
<button id="btn-save" class="btn btn-outline-sparta btn-lg">save</button>
<button id="btn-delete" class="btn btn-sparta btn-lg" style="display:none;">delete</button>
</div>
<hr>
<div id="definitions">
{% for definition in result.definitions %} <!--result ์์ definitions ๋ผ๊ณ ๋ค์ด์๋ ๋งํผ ๋ฐ๋ณต -->
<div style="padding:10px">
<i>{{ definition.type }}</i> <!-- ํ์ฌ -->
<br>{{ definition.definition }}<br> <!-- ๋ป -->
<span class="example">{{ definition.example }}</span> <!-- ์๋ฌธ -->
</div>
{% endfor %} <!-- ๋ฐ๋ณต๋ฌธ์ ์ฌ๊ธฐ๊น์ง -->
</div>
</div>
{{ result[”word”] }} = {{ result.word }}
โ ๋ฐ์์ด ์๋ ๊ฒฝ์ฐ์๋ง ๋ณด์ฌ์ฃผ๋๋ก ์์ธ์ฒ๋ฆฌ
{% if result.pronunciation %} <!-- {% if result.pronunciation != None %}์ ๊ฐ์. [result์ pronunciation์ด None์ด ์๋๋ค = ๊ฐ์ด ์๋ค = true] -->
<h5 id="pronunciation" style="display: inline;">/{{ result.pronunciation }}/</h5>
{% endif %}
โ ์๋ฌธ์ด ์๋ ๊ฒฝ์ฐ์๋ง ๋ณด์ฌ์ฃผ๋๋ก ์์ธ์ฒ๋ฆฌ
{% if definition.example %}
<span class="example">{{ definition.example }}</span>
{% endif %}
โ ์๋ฌธ์ HTML ํ๊ทธ ์ฐ๋ ๊ฒ์ ํ์ฉ
<span class="example">{{ definition.example|safe }}</span>
- definition.example์ด html์ผ ์๋ ์๋๋ฐ ์ด์ํ ๊ฒ์ ์๋ํ๋ ๊ฒ์ด ์๋๋ผ ๊ทธ๋ฅ ๊พธ๋ฉฐ์ฃผ๋ ๊ฑฐ๋ผ ์์ ํ๋๊น
๊ทธ๋๋ก ํ์ํ์ธ์.
โ ์ ์์ ์๋ฌธ์์ ๊นจ์ง ๊ธ์๋ฅผ ์์ฐ
<br>{{ definition.definition.encode('ascii', 'ignore').decode('utf-8') }}<br> <!--๋ป ๋ถ๋ถ์ ๊นจ์ง ๊ธ์ ์์ฐ-->
{% if definition.example %}
<span class="example">{{ definition.example.encode('ascii', 'ignore').decode('utf-8')|safe }}</span> <!--์๋ฌธ ๋ถ๋ถ์ ๊นจ์ง ๊ธ์ ์์ฐ-->
{% endif %}
โ
definition์ example์ ๋ฌธ์์ด์ ascii ์ฝ๋์ ํํ๋ก ์ธ์ฝ๋ฉ์ ํด์ค๊ฑด๋ฐ,
ascii ์ฝ๋๋ก ํํํ ์ ์๋ ๊ฒ๋ค์ ๋ฌด์ํ๊ณ ๋ฐ๋๋ ๊ฒ๋ค์ ๋ค์ ๋ฌธ์์ด๋ก ๋ฐ๊ฟ์ฃผ์ธ์.
<div class="container">
<div class="d-flex justify-content-between align-items-end">
<div>
<h1 id="word" style="display: inline;">{{ word }}</h1>
{% if result.pronunciation %}
<h5 id="pronunciation" style="display: inline;">/{{ result.pronunciation }}/</h5>
{% endif %}
</div>
<button id="btn-save" class="btn btn-outline-sparta btn-lg">save</button>
<button id="btn-delete" class="btn btn-sparta btn-lg" style="display:none;">delete</button>
</div>
<hr>
<div id="definitions">
{% for definition in result.definitions %}
<div style="padding:10px">
<i>{{ definition.type }}</i>
<br>{{ definition.definition.encode('ascii', 'ignore').decode('utf-8') }}<br>
{% if definition.example %}
<span class="example">{{ definition.example.encode('ascii', 'ignore').decode('utf-8')|safe }}</span>
{% endif %}
</div>
{% endfor %}
</div>
</div>
๋ฐ์ํ