Jinja: рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдСрдЯреЛрд╕реНрдХреЗрдк

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдЕрдХреНрддреВре░ 2015  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pallets/jinja

рдХрд╛рдо рдкрд░, рд╣рдо рдЬрд┐рдВрдЬрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ YAML рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рд╕рднреА {{ variable }} рд╡рд┐рд╕реНрддрд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдкрд╛рдЗрдерди рдореВрд▓реНрдпреЛрдВ рдЬреИрд╕реЗ None (рдЬреЛ YAML рдореЗрдВ null рд╣реИ) рдФрд░ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдЬреЛ '' рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордЭрджрд╛рд░ рд╣реЛред Markup рдФрд░ escape рдХреЛ jinja2.runtime рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╕реНрд╡реАрдХреГрдд рд╡рд┐рдзрд┐ рдереА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдХреБрдЫ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗред

рд╕рднреА 11 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдСрдЯреЛрд╕реНрдХреЗрдкрд┐рдВрдЧ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред tojson рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдореНрдореАрджрд╡рд╛рд░ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрдорд▓ рдЬреЛрдВрд╕ рдХрд╛ рд╕реБрдкрд░рд╕реЗрдЯ рд╣реИред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛: рд╡рд╛рдИрдПрдПрдордПрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдЖрдзрд╛рд░рд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдХреНрдпреЛрдВ? рдкрд╛рдЗрдерди рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рд╡рд╛рдИрдПрдПрдордПрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд╛рдл рд▓рдЧрддрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рдорд╛рдорд▓рд╛ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк рдПрдХ рд╡рд╛рдИрдПрдПрдордПрд▓ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЧреИрд░-рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдкрдврд╝рдиреЗ/рд▓реЗрдЦрди рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдЦрд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╛рдИрдПрдПрдордПрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓реЛрдб рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдлрд┐рд░ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдИрдПрдПрдордПрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░ рд╕рдХреЗрдВред

рдСрдЯреЛрд╕реНрдХреЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рд╣рд░ рдПрдХ рдЪрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдкрд░ рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдирд╣реАрдВ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ред

рд╣рдорд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣рдорд╛рд░реЗ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдПрдХ "рдЯреЗрдореНрдкрд▓реЗрдЯ" рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕реЗ рдкреНрд░рддрд┐-рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рднрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╕реАрдзреЗ рд╡рд╛рдИрдПрдПрдордПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреНрд▓реАрдирд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп "рдЗрдВрдЬрди" рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдХреИрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдП, рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рди рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред (рд╡рд╛рдИрдПрдПрдордПрд▓ рдЙрдкрдирд╛рдо рдФрд░ рд╕рдВрджрд░реНрдн рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВ - рд╡реЗ рдЪрдХреНрд░реАрдп рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╣реИрдВред) рдРрд╕реЗ рддрд░реАрдХреЗ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рдореИрдВ рдЗрд╕реЗ рд╡рд╛рдИрдПрдПрдордПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдлрд┐рд░ рд╕реЗ рдПрдХ рддрд░рд╣ рдХрд╛ рд╣реИрдХреА рднреАред рдпрд╣ рд╕реЗрдЯрдЕрдк рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдЖрдк рд╕рднреА рдЪрд░реЛрдВ рдкрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрдЬрд╛ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдЖрдкрдХреЛ i18n рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рд▓рд┐рдЦреА рдЧрдИ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рд╕реЗ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд▓реЗ рд╕рдХреЗрдВ: https://github.com/indico/indico/blob/master/indico/web/flask/templating.py#L187

рдпрд╣ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдСрдЯреЛрд╕реНрдХреЗрдкрд┐рдВрдЧ рдЕрднреА рднреА рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдареАрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдЪрд░ |safe рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЕрд╡рдзрд╛рд░рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдСрдЯреЛрд╕реНрдХреЗрдкрд┐рдВрдЧ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╡реЗрд░рд┐рдПрдмрд▓ рд╡реИрдз рд╡рд╛рдИрдПрдПрдордПрд▓ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд▓рд┐рдЦреВрдВрдЧрд╛ред

@glasserc рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рд╕рдлрд▓ рд╣реБрдП? рдореБрдЭреЗ рднреА рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ/рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рд╡рд╣ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдерд╛ рдЬреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЙрд▓ рдЪрд▓рд╛рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЬреЛ рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рд╣реИред

import jinja2.ext
from jinja2.lexer import Token

class YAMLEverythingExtension(jinja2.ext.Extension):
    """
    Insert a `|yaml` filter at the end of every variable substitution.

    This will ensure that all injected values are converted to YAML.
    """
    def filter_stream(self, stream):
        # This is based on https://github.com/indico/indico/blob/master/indico/web/flask/templating.py.
        for token in stream:
            if token.type == 'variable_end':
                yield Token(token.lineno, 'pipe', '|')
                yield Token(token.lineno, 'name', 'yaml')
            yield token

рдпрд╣ рд╣реЛрд╢рд┐рдпрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдпрд╣ safe рдпрд╛ yaml рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рд╡реЗрд░рд┐рдПрдмрд▓ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдлрд╝рд┐рд▓реНрдЯрд░ рдбрд╛рд▓рдиреЗ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ / рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрднреА рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдИред

рджреВрд╕рд░рд╛ рднрд╛рдЧ рдлрд┐рд▓реНрдЯрд░ рд╣реА рд╣реИред рдмрд╕ yaml.dump рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдкрд░рд┐рд╖реНрдХреГрдд рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдорд▓ рдЗрдВрдЯрд░реНрдирд▓ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рдкреНрд░рд╣рд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

import cStringIO
import yaml

def yaml_filter(val):
    """Serialize some value in isolation, not as part of any document.

    We can't just use yaml.dump because that outputs an entire document, including newlines, which isn't helpful for
    inserting into a YAML document."""
    if isinstance(val, jinja2.Undefined):
        val._fail_with_undefined_error()
    stream = cStringIO.StringIO()
    dumper = yaml.dumper.Dumper(stream)
    dumper.open()
    node = dumper.represent_data(val)
    dumper.serialize(node)
    # The serialized node tends to have a \n at the end.  The template might not
    # want a \n inserted here, e.g. if two variables are on the same line, so
    # strip.
    return stream.getvalue().strip()

рдпрд╣ рд╕рднреА рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рджрд┐рдП рдЧрдП рдирд╛рдо рдХрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ:

from jinja2 import loaders
from jinja2 import Environment, StrictUndefined

def get_environment():
    """Create a standard Jinja environment that has everything in it.
    """
    jinja_env = Environment(extensions=(YAMLEverythingExtension,),
                            # some other options that we use at work
                            loader=loaders.FileSystemLoader(['.', '/']),
                            undefined=StrictUndefined)
    jinja_env.filters["yaml"] = yaml_filter
    return jinja_env

рдЧреИрд░-рдПрдЪрдЯреАрдПрдордПрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдореИрдВ JSON рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Jinja2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ HTML рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдмрдЬрд╛рдп JSON рдПрд╕реНрдХреЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЬреЗрдПрд╕рдУрдПрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдВрдЬрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдЖрдзрд╛рд░рд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рднрд╛рд╖рд╛ рдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдСрдкрд░реЗрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реИред рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рд╡рд╛рдИрдПрдПрдордПрд▓ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░реЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╛рдирд╡-рдЕрдиреБрдХреВрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕рдУрдПрди рдХреЛ рдПрдХ рдкрд╛рдпрдерди рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдЬрд┐рдВрдЬрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗред

(рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рдкреА)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдпрд╣ рд╕рд╛рд░реНрдердХ рдмрд╛рдд рд╣реИред :-) рдореИрдВ #571 рдмрдВрдж рдХрд░ рджреВрдБрдЧрд╛ред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдПрд╕рдУрдПрди рдЬрд┐рдВрдЬрд╛ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЬрд┐рдиреНрдЬрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЯреЗрдХреНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ block_start_string рдФрд░ block_end_string рдФрд░ рдЕрдиреНрдп рдХреЛ Environment рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рд╡рд╣рд╛рдВ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рддрд░реАрдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓рд┐рдП рд╣реИрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ autoescape = False рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЦреБрдж рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рд╢рд╛рдпрдж рд░реЗрдЧреЗрдХреНрд╕ рдХреА рддрд░рд╣)ред

рдпрд╣ рдкреНрд▓реЗрдирдЯреЗрдХреНрд╕реНрдЯ рдФрд░ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЧреИрд░-рдПрдЪрдЯреАрдПрдордПрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдВрдЬрд╛ рдЕрдм рддрдХ рдПрдХ рдорд╣рд╛рди рдЙрдкрдХрд░рдг рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдПрд╕рдХреНрдпреВрдПрд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрдЬрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ str.format() рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдкрдХреЛ рдХрдИ рд╕рд╢рд░реНрдд рдХреНрд╡реЗрд░реА рднрд╛рдЧреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдЧрдиреНрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдЬрд┐рдиреНрдЬрд╛-рдЧрд╛рдпрдм рдЬреЛ рдХрд╕реНрдЯрдо рдПрд╕реНрдХреЗрдк рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдЬрд┐рдиреНрдЬрд╛рд╕реНрдХреНрд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдкрд╣рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдВрдХрд▓рди рдкрд░ рдирд┐рд░рдВрддрд░-рдореВрд▓реНрдпрд╛рдВрдХрди рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдереЛрдбрд╝рд╛ рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рд╡рд╛рд▓рд╛
рд╕рднреА рд╡реИрд░рд┐рдПрдмрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рд┐рд▓реНрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рдПрдкреНрд░реЛрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдареАрдХ рд╣реИ рд▓реЗрдХрд┐рди рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЗрддрдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

samatjain picture samatjain  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nalzok picture nalzok  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

glasserc picture glasserc  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

navilan picture navilan  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dwt picture dwt  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ