Django DIY рднрд╛рдЧ 1: jinja2 рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдЯреЗрдореНрдкреНрд▓реЗрдЯ

рдкрд░рд┐рдЪрдп


рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ django рдЬреИрд╕реЗ рдкреНрд▓рдЧ-рдЗрди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреЗ рдврд╛рдВрдЪреЗ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдХреЗрд╡рд▓ рдмрд╛рд╣рд░реА рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдЬрд╛ 2, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рд▓рд┐рдП рдмреЛрддрд▓, рдУрдЖрд░рдПрдо рдХреЗ рдмрдЬрд╛рдп рдкрд╛рдпрдВрдЧреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдмреАрдХрд░ рдХреЛ рд╕рддреНрд░реЛрдВ рдореЗрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдореИрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд┐рдирдЬрд╛ 2 рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдХрд┐рддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рддрд╛рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рдкреНрд▓рдЧрд┐рди рдкрдврд╝реЗрдВ) рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╢ рдХрд░реЗрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдореИрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП рдФрд░ рдЙрдирдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдврд╛рдВрдЪрд╛ рд╕рдВрд░рдЪрдирд╛


рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░рд╛ рдврд╛рдБрдЪрд╛ ubuntu '/usr/local/lib/python2.6/dist-packages/' рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрд╣рд╛рдБ рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, '' рдШрд░ / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ / worckspace / 'ред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ mod_wsgi рдХреЗ рд▓рд┐рдП рдпрд╛ uwsgi index_wsgi.py рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╣реАрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реИ:
/project/ /__init__.py /app/ /__init__.py /app1/ /__init__.py /templ/ /static/ /routes.py /models.py /views.py /teml/ /static/ /index.py /routes.py /views.py /models.py /settings.py 

рддрджрдиреБрд╕рд╛рд░, / templ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ / / рд╕реНрдерд┐рд░ рд╕реНрдЯреЗрдЯрд┐рдХреНрд╕ рдореЗрдВ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ (рдпрд╛ рдШрдЯрдХреЛрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ) рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реЛрдВрдЧреЗред
рддрджрдиреБрд╕рд╛рд░, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рдРрдк рдлрд╝реЛрд▓реНрдбрд░ рднреА рд╣реИ, djang рдХрдВрдЯреНрд░реАрдм рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ, рдЬрд┐рд╕рдореЗрдВ рдЙрдирдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдШрдЯрдХ рднреА рдЭреВрда рд╣реЛрдВрдЧреЗред
рд╕рд╛рдЗрд▓реЗрдВрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдлреЛрд▓реНрдбрд░ рднреА рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ jinja2 рдХреИрд╢ рдЗрди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреИрд╢ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред

рдХрдиреЗрдХреНрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ


рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░рд╛ рд╕рд╛рд░рд╛ рдХрдиреЗрдХреНрд╢рди рдХреЛрд░ рдкреИрдХреЗрдЬ рдореЗрдВ рдХреЛрд░-рдлрд╛рдЗрд▓ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрдЧрд╛, рдЬреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдЯ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рдПрдВ рдЖрдпрд╛рдд рдХрд░реЗрдВред
 from jinja2 import Environment, PackageLoader, FunctionLoader, FileSystemBytecodeCache 

рдЕрдЧрд▓рд╛, рд╣рдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред
рд╕реЗ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рдХрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
 def get_app_root(app): """Returns path to app or app name.""" if isinstance(app, (str, )): __import__(app) app = sys.modules[app] return os.path.dirname(os.path.abspath(app.__file__)) templ_exts = ['', '.tpl', '.html', '.htm'] def split_templ_name (t): """     .            .       . """ if ':' in t: #        module, file = t.split(":", 1) module_path = os.path.join(get_app_root( module), "templ", "") else: #        . module = ' ' module_path = os.sep + 'templ' + os.sep file = t return (module, module_path, file) 

рджрд░рдЕрд╕рд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓реЛрдб рдХрд░рдирд╛ред
рдпрд╣рд╛рдВ рдЖрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рднрдВрдбрд╛рд░рдг рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд▓реЛрдб рдХрд░рдХреЗ
 def union_templ(t, **p): (module, module_path, file) = split_templ_name (t) def load_template (base, module_path, file): path = base + module_path + file template = ' ' for ext in templ_exts: filename = path+ext if os.path.exists(filename): with open(filename, "rb") as f: template = f.read() break; return template template = load_template (os.getcwd(), module_path, file); if not template: template = load_template( settings.lib_path, module_path, file); if not template: return 'Template not found %s' % t return template.decode('UTF-8') 


рдХреИрд╢рд┐рдВрдЧ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВред
 jcp = os.path.join(os.getcwd(), 'jinja_cache') if not os.path.isdir(jcp): os.mkdir(jcp) 


рдХреИрд╢ рдореИрдиреЗрдЬрдореЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ред
 bcc = FileSystemBytecodeCache(jcp, '%s.cache') 


рд╣рдо рд╣реБрдХ рдХреЛ jinja2 рдкрд░ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдХреИрд╢рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

 jinja = Environment(auto_reload=True, loader=FunctionLoader(union_templ), bytecode_cache = bcc ) 


рд╡рд╣ рдХрд╛рд░реНрдп рдЬреЛ рд╕реАрдзреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╡рд╣ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣реА рд╣реИ, рд╕реАрдзреЗ jinja2 рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣рд╛рдВ рд╡рд╛рдкрд╕ рдЖрдПрдВрдЧреЗред
 def render_templ(t, **p): template = jinja.get_template(t) return template.render(**p) 


рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрддрд░ рдкрд░ рдЖрдпрд╛рдд рдХрд░реЗрдВред
 __builtin__.templ = render_templ 


рдЕрдм рдЗрд╕ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЯреЗрдореНрдкрд▓ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рддрд░реНрдХреЛрдВ рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдирд╛рдо рдФрд░ рдЙрд╕рдореЗрдВ рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
рд░рд┐рдЯрд░реНрди рдЯреЗрдореНрдкрд▓ (tem app.base: base тАЩ, param = param) рдпрд╛ рд░рд┐рдЯрд░реНрди рдЯреЗрдореНрдкрд▓ (, baseтАЩ, param = param), тАЩ:тАЩ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЗрдВ рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ редbase 'ред

рд╕рд╛рд░рд╛рдВрд╢


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

рд╡рд┐рд╕реНрддрд╛рд░

Source: https://habr.com/ru/post/In144717/


All Articles