Jinja: μ‚¬μš© κ°€λŠ₯ν•œ ν…œν”Œλ¦Ώ λ³€μˆ˜λ₯Ό λ€ν”„ν•˜λŠ” λ‚΄μž₯ ν…œν”Œλ¦Ώ λ„μš°λ―Έ κ΅¬ν˜„

에 λ§Œλ“  2013λ…„ 01μ›” 17일  Β·  16μ½”λ©˜νŠΈ  Β·  좜처: pallets/jinja

Smarty ν…œν”Œλ¦Ώ μ—”μ§„μ—λŠ” λ””μžμ΄λ„ˆκ°€ μ‚¬μš©ν•  수 μžˆλŠ” λ³€μˆ˜μ— λŒ€ν•œ λΉ λ₯Έ κ°œμš”λ₯Ό μ œκ³΅ν•˜λŠ” 맀우 νŽΈλ¦¬ν•œ {debug} κ°€ λ‚΄μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

Smarty_debug_console

기본적으둜 Jinja2에 같은 λ‚΄μš©μ΄ 있으면 쒋을 κ²ƒμž…λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

image

μš”μ²­λŒ€λ‘œ. λ‚΄μš©μ΄ μ»¨ν…μŠ€νŠΈ λ³€μˆ˜, ν•„ν„° 및 ν…ŒμŠ€νŠΈλ³„λ‘œ ꡬ성(및 μ •λ ¬)λ˜μ–΄ μžˆλŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ 여기에 λͺ‡ 가지 "ν₯미둜운" μ»¨ν…μŠ€νŠΈ λ³€μˆ˜κ°€ 더 μžˆλŠ” ν™•λŒ€λœ 화면이 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ μƒκ°ν•˜κΈ°μ— κ°€μž₯ 많이 μš”μ²­λœ 것은 μ‘΄μž¬ν•˜λŠ” (μ΅œμƒμœ„) μ»¨ν…μŠ€νŠΈ λ³€μˆ˜κ°€ 무엇인지 μ •ν™•νžˆ μ•„λŠ” κ²ƒμ΄λ―€λ‘œ κΉŠμ΄κ°€ 3으둜 μ œν•œλ˜μ–΄ μ•½κ°„μ˜ μ„ΈλΆ€ 사항을 ν‘œμ‹œν•˜κΈ°μ— μΆ©λΆ„ν•œμ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€. λͺ¨λ“  ꡬ쑰의 전체 깊이:

image

λ˜ν•œ ν‘œμ‹œλ˜λŠ” λ‚΄μš©μ˜ μ„ΈλΆ€ 사항을 λ³€κ²½/ν™•μž₯ν•˜λŠ” 것이 κ°„λ‹¨ν•˜λ‹€λŠ” 것을 μ•Œκ²Œ 될 κ²ƒμž…λ‹ˆλ‹€.

λͺ¨λ“  16 λŒ“κΈ€

ν™•μΈν•΄μ•Όν•˜μ§€λ§Œ 이것이 μž‘λ™ν•΄μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

<h2>locals()</h2>
<pre>{{ locals() }}</pre>
<h2>globals()</h2>

... https://stackoverflow.com/questions/3398850/how-to-get-a-list-of-current-variables-from-jinja-2-template

https://stackoverflow.com/a/13757358/188833 의 @mitsuhiko :

import jinja2

@jinja2.contextfunction
def get_context(c):
 return c

app.jinja_env.globals['context'] = get_context
app.jinja_env.globals['callable'] = callable

디버깅을 μœ„ν•΄ 예λ₯Ό λ“€μ–΄, ν”ΌλΌλ―Έλ“œ_debugtoolbarλŠ” 보기 κΈ°λŠ₯(μ μ ˆν•˜κ²Œ μΆ”μƒν™”λœ IMHO)이 μ»¨ν…μŠ€νŠΈ 개체(예: dict, OrderedDict)λ₯Ό λ°˜ν™˜ν•˜λŠ” 경우 ν…œν”Œλ¦Ώ μ»¨ν…μŠ€νŠΈλ₯Ό ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš© 사둀

μ—¬κΈ° λ‚΄ μ‚¬μš© μ‚¬λ‘€λŠ” CLI μœ ν‹Έλ¦¬ν‹°μ—μ„œ jinja2 ν…œν”Œλ¦Ώμ„ 톡해 λͺ‡ 가지 인수λ₯Ό μ „λ‹¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€(μ—¬κΈ°μ„œ ν…œν”Œλ¦Ώ λ‚΄μ—μ„œ 기본값을 μ •μ˜ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€(예: Dockerfiles(λͺ¨λ“  κ²ƒμ˜ autoescape μ œμ™Έ))).

λ‚΄κ°€ ν•˜κ³  싢은 것은

{% set ENVVAR=context.get('ENVVAR', 'DEFAULT') %}

κ·ΈλŸ¬λ‚˜ μ•„μ•„, μ‹€μ œ context κ°œμ²΄λŠ” [...]

@westurner , κ·Έλž˜μ„œ μž‘λ™ν•©λ‹ˆκΉŒ? μ§€κΈˆμ€ 확인할 수 μ—†μ§€λ§Œ λ³€ν™˜ν•  수 μ—†λŠ” λ°”μ΄νŠΈκ°€ ν¬ν•¨λœ 경우 {{ locals() }} 에 μ‹€νŒ¨ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  • json.dumps(locals()) λŠ” μ‚¬μš©μž μ •μ˜ JSONEncoder 없이 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(예: [code objects,]에 λŒ€ν•΄ repr() μ‚¬μš©).
  • μ•„λ§ˆλ„ pprint.pformat(locals()) ? (이것은 νŽΈλ¦¬ν•œ λ‚΄μž₯이 될 κ²ƒμž…λ‹ˆλ‹€)
  • ... autoescape=True λŠ” XSSλ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.

μ΄λŠ” 타사 μ•±μ˜ ν…œν”Œλ¦Ώμ„ ν™•μž₯ν•  λ•Œ μœ μš©ν•  κ²ƒμž…λ‹ˆλ‹€. μ €λŠ” ν˜„μž¬ μƒν˜• 문자 λ₯Ό μ‚¬μš©ν•˜μ—¬ μŠ€ν•‘ν¬μŠ€λ₯Ό 기반으둜 ν•˜λŠ” μŠ¬λΌμ΄λ“œ μ‡Όλ₯Ό λ§Œλ“€κ³  λ”°λΌμ„œ Jinja2λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

κΈ°λ³Έ μƒν˜• 문자 ν…Œλ§ˆλ₯Ό ν™•μž₯ν–ˆμœΌλ©° ν…œν”Œλ¦Ώμ— λ‚΄κ°€ μŠ¬λΌμ΄λ“œμ— μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό μ•Œλ €μ£ΌλŠ” 일뢀 λ³€μˆ˜κ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ³€μˆ˜κ°€ μžˆμ„ μˆ˜λ„ 있고 없을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ ν˜„μž¬ μƒν˜• 문자 μ†ŒμŠ€ μ½”λ“œλ₯Ό νŒŒκ³ λ“€μ–΄ ν•„μš”ν•œ 것을 μ°Ύκ³  μžˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš© κ°€λŠ₯ν•œ λͺ¨λ“  λ³€μˆ˜λ₯Ό ν…œν”Œλ¦Ώ λ‚΄ μ—μ„œ 직접 덀프할 수 있으면(즉, Python μ½”λ“œλ₯Ό μˆ˜μ • ν•˜μ§€ μ•Šκ³ ) 훨씬 λΉ λ₯΄κ³  μ‰½κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ‹€μŒκ³Ό 같이 ν•  수 μžˆλŠ” 것이 μ’‹λ‹€κ³  κ°€μ •ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

{% extends "!layout.html %}

{# ... or any other sensible name #}
{% dump_variables() %}

{% block body %}
Hello World!
super()
Goodbye World
{% endblock %}

μ΄λ ‡κ²Œ ν•˜λ©΄ μƒˆ ν…Œλ§ˆλ₯Ό κ°œλ°œν•˜λŠ” λ™μ•ˆ μƒν˜• λ¬Έμžκ°€ μ œκ³΅ν•˜λŠ” λͺ¨λ“  것을 μ„±μ°°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 λͺ©μ μ„ μœ„ν•΄ ν™•μž₯을 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. https://github.com/niwinz/django-jinja/files/1607805/jinja_extensions.py.txt μ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

@ShaheedHaque 화면이 μžˆμŠ΅λ‹ˆκΉŒ?

νŒŒμΌμ„ μ—΄λ©΄ 주석에 좜λ ₯ μ˜ˆκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½μ—
ν•„μš”ν•œ 경우 였늘 λ°€ 집에 λ„μ°©ν•˜λ©΄ μ‹€μ œ μŠ€ν¬λ¦°μƒ·μ„ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2018λ…„ 1μ›” 6일 02μ‹œ 23뢄에 "anatoly techtonik" [email protected] μ—μ„œ λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

@ShaheedHaque https://github.com/shaheedhaque 화면이 μžˆμŠ΅λ‹ˆκΉŒ?

β€”
당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ³  GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/pallets/jinja/issues/174#issuecomment-355716273 λ˜λŠ” μŒμ†Œκ±°
μŠ€λ ˆλ“œ
https://github.com/notifications/unsubscribe-auth/AEp7KdBBslHJPIGp5VliuF74bxSZTk-wks5tHtkEgaJpZM4AXefd
.

@ShaheedHaque 화면은 첫 번째 κ²Œμ‹œλ¬Όμ˜ Smarty 좜λ ₯κ³Ό λΉ„κ΅ν•˜λ©΄ 정말 쒋을 κ²ƒμž…λ‹ˆλ‹€.

image

μš”μ²­λŒ€λ‘œ. λ‚΄μš©μ΄ μ»¨ν…μŠ€νŠΈ λ³€μˆ˜, ν•„ν„° 및 ν…ŒμŠ€νŠΈλ³„λ‘œ ꡬ성(및 μ •λ ¬)λ˜μ–΄ μžˆλŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ 여기에 λͺ‡ 가지 "ν₯미둜운" μ»¨ν…μŠ€νŠΈ λ³€μˆ˜κ°€ 더 μžˆλŠ” ν™•λŒ€λœ 화면이 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ μƒκ°ν•˜κΈ°μ— κ°€μž₯ 많이 μš”μ²­λœ 것은 μ‘΄μž¬ν•˜λŠ” (μ΅œμƒμœ„) μ»¨ν…μŠ€νŠΈ λ³€μˆ˜κ°€ 무엇인지 μ •ν™•νžˆ μ•„λŠ” κ²ƒμ΄λ―€λ‘œ κΉŠμ΄κ°€ 3으둜 μ œν•œλ˜μ–΄ μ•½κ°„μ˜ μ„ΈλΆ€ 사항을 ν‘œμ‹œν•˜κΈ°μ— μΆ©λΆ„ν•œμ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€. λͺ¨λ“  ꡬ쑰의 전체 깊이:

image

λ˜ν•œ ν‘œμ‹œλ˜λŠ” λ‚΄μš©μ˜ μ„ΈλΆ€ 사항을 λ³€κ²½/ν™•μž₯ν•˜λŠ” 것이 κ°„λ‹¨ν•˜λ‹€λŠ” 것을 μ•Œκ²Œ 될 κ²ƒμž…λ‹ˆλ‹€.

μœ μš©ν•΄ λ³΄μž…λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ PR을 μž‘μ„±ν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

λ‹Œμž μ½”λ“œλ² μ΄μŠ€μ—μ„œ μƒˆ μ½”λ“œκ°€ μžˆμ–΄μ•Ό ν•˜λŠ” μœ„μΉ˜μ— λŒ€ν•œ 지침이 제곡되면 기꺼이 κ·Έλ ‡κ²Œ ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€(이 ν”„λ‘œμ νŠΈμ— μ΅μˆ™ν•˜μ§€ μ•ŠμŒ).

λ‚˜λ„ μ•„λ‹ˆμ§€λ§Œ https://github.com/pallets/jinja/blob/master/jinja2/ext.py 쒋은 μ‹œμž‘μ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

PR #798을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

2.11μ—μ„œ μƒˆλ‘œμš΄ ν™•μž₯으둜 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

감사 ν•΄μš”!

디버그 ν™•μž₯ λ¬Έμ„œλŠ” μ˜λ„ν•˜μ§€ μ•Šμ€ 것에 λŒ€ν•΄ μ‚¬μš©μžμ—κ²Œ κ²½κ³ ν•΄μ•Ό ν•©λ‹ˆλ‹€.
λ―Όκ°ν•œ μ •λ³΄μ˜ 곡개
{% debug %} νƒœκ·Έλ₯Ό 톡해 ν™•μž₯ ν”„λ‘œκ·Έλž¨μ΄
(정적 뢄석기가 λˆ„κ΅°κ°€κ°€ μžŠμ–΄ 버린 것을 식별 ν•  수 μžˆλ„λ‘
릴리슀 전에 {% debug .* %} λ₯Ό μ œκ±°ν•˜μ‹­μ‹œμ˜€.

983

2019λ…„ 10μ›” 4일 κΈˆμš”μΌμ— David Lord [email protected] 은 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

폐쇄 #174.

β€”
당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ λ³΄κ±°λ‚˜ μŠ€λ ˆλ“œλ₯Ό μŒμ†Œκ±°ν•˜μ„Έμš”.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰