Django do-it-yourself рднрд╛рдЧ 3: рд░реВрдЯ, рдбрд┐рдмрдЧрд┐рдВрдЧ, рдорд┐рдбрд▓рд╡реЗрдпрд░, рдмреЛрддрд▓, рдмреАрдХрд░

рднрд╛рдЧ 1
рднрд╛рдЧ реи

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


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

рдбрд┐рдмрдЧрд┐рдВрдЧ


рдорд╛рдЗрдХреНрд░реЛрдлреНрд░реЗрдо рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЬреЛ wsgi рд╣рдореЗрдВ рджреЗрддреА рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд▓реЙрдЧ рдореЗрдВ рдкрдХрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреГрд╖реНрда рдкрд░ рдпрд╣ рд╕рдм рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдпрд╛ рдЗрд╕рдХреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХреБрдЫ рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдВрдЧреЗред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдПрдХреАрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрди рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдВрдЧреЗ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рдкрдХрдбрд╝рддреЗ рдереЗ, рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕реБрдВрджрд░ рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдкреГрд╖реНрда рдХреЗ рд░реВрдк рдореЗрдВ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВред
try: #  bottle        ,    . @bottle.hook('before_request') def pre_init(): #       , ini_environment() #       #  options_session #   bottle app = bottle.app() app.catchall = False #       . debugger = DebuggerM(app) #     . session = SessionMiddleware(debugger, options_session) #   application    wsgi' application = session except Exception as e: #            #     . exc = sys.exc_info() def error_apps(environ, start_response): start_response('500 INTERNAL SERVER ERROR', [('Content-Type', 'text/html; charset=utf-8')]) return view_error(exc, environ, e) application = error_apps 


рд╡рд╣ рд╡рд░реНрдЧ рдЬреЛ рд╕реАрдзреЗ рд╣рдорд╛рд░реЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреА рд╕реЗрд╡рд╛ рдХрд░рддрд╛ рд╣реИред

 class DebuggerM(object): """       """ __app = None def __init__ (self, app): #      bottle # app-    ,  application     middleware self.__app = app def __call__(self, environ, start_response): try: #      (   ) app_iter = self.__app(environ, start_response) for item in app_iter: #      #          yield item except Exception as e: #         . start_response('500 INTERNAL SERVER ERROR', [('Content-Type', 'text/html; charset=utf-8')]) yield view_error(sys.exc_info(), environ, e) 


рд╕рдорд╛рд░реЛрд╣ рд╣реА рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рддреНрд░реБрдЯрд┐ рдЦреАрдВрдЪрддрд╛ рд╣реИ:
 def view_error(exc, environ, e): import cgi, traceback ee = dict(environ) text= '' text='<h1>ERROR "%s"</h1>' % str(e) text+='<style>pre{border:red solid 1px; max-height:240px; overflow:auto;}</style>' text+='<h2>Stack trace</h2><pre>%s</pre>' % ''.join(reversed(traceback.format_exception(*exc))) text+='<h2>Env</h2><pre">%s </pre>' % ' '.join(['%s=%s' %(k, ee[k])for k in ee]) text+='</pre>' return text 


рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдЬрд╛рд╡рдЯрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдмреВрдЯ рдореЗрдВ рдорд╛рд░реНрдЧ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЭреБрдХрд╛ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
 @route('/hello/:name') def index(name='World'): return '<b>Hello %s</b>' % name 


рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдФрд░ рд╣рдо рдЗрд╕ рдХреНрд╖рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛред
 from app1 import * routes = { 'function': ('/hello/', hello, 'GET'), 'function2':('/hello/<_id>', hello_post, 'POST') } 

рддрджрдиреБрд╕рд╛рд░, рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдШрдЯрдХ рдореЗрдВ рдХрд╣реАрдВ рднреА рд╣реИрд▓реЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдЬрд┐рд╕рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдХреА рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИред
 all_routes = {} def union_routes(dir): routes = {} #               . if __builtin__.__import__('routes', globals=globals()): #    module = sys.modules['routes'] #     routes routes.update(module.routes) #     for name in os.listdir(dir): path = os.path.join(dir, name) #       routes.py if os.path.isdir(path) and os.path.isfile(path+'/routes.py'): #           name = 'app.'+path[len(dir)+1:]+'.routes' if __builtin__.__import__(name, globals=globals()): module = sys.modules[name] routes.update(module.routes) return routes def setup_routes(routes): #           bottle        . all_routes.clear() all_routes.update(routes) for name in routes: path, func, method = routes[name] route(path, method=method, name=name)(func) 


рдЕрдм рд╣рдо рдЙрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЬрдЧрд╣ рд▓реЗрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рд░реВрдЯ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдбрд┐рдмрдЧрд┐рдВрдЧ рдкрд░ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдерд╛, рддрд╛рдХрд┐ рд╡реЗ рддреБрд░рдВрдд рд╣рдорд╕реЗ рдЬреБрдбрд╝реЗ рд░рд╣реЗрдВред
 routes = {} #      routes.update(union_routes(lib_path)) #      routes.update(union_routes(app_path)) setup_routes(routes) 

рдЕрдм рд╣рдо рд╕рднреА рдХреЗ рдкрд╛рд╕ рдкреВрд░реНрдг-рд╡рд┐рдХрд╕рд┐рдд рдорд╛рд░реНрдЧ рд╣реИрдВ, рд╣рдо рдЪрд╛рд╣реЗрдВ рддреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдорд╛рд░реНрдЧ рдореЗрдВ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реМрдВрдкреЗ рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдорд╛рд░реНрдЧреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджрд░реНрдЬ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред
 from app1 import * routes = { 'function2': ('/hello/<_id>', hello_post, 'POST'), 'function3': ('/base/1', lambda: test(True, u''), 'GET') } 

рдЕрдм рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдорд╛рд░реНрдЧреЛрдВ рдХреА рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, 'function2', рд╣рдо рд░реВрдЯ рдХреЗ рдирд╛рдо рд╕реЗ рд▓рд┐рдВрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдмрд┐рдирд╛ рдпрд╣ рдЬрд╛рдиреЗ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд▓рд┐рдВрдХ рд╕реЗ рд╣реА рдХреИрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо '/ hello / <_id' рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ <_id> рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
 def make_link(name, params, full=False): """     <>     """ #     templ_link = all_routes[name][0][1:] #      <> r = re.compile(r'<([^:>]+)(:[^>]+)?>') #       ,       . while True: rs = r.search(templ_link) if not rs: break sub = rs.group(0) name = rs.group(1) templ_link = re.sub(sub, params[name], teml_link) link = os.path.sep+ templ_link #        ,     . if full: link = 'http://'+get_name_host()+link return link 

рдЕрдм рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдпрд╛ рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рднреА рд▓рд┐рдЦрддреЗ рд╣реИрдВ
 link = make_link('test', {'id':id, 'doc_id':doc_id}, True) 

рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЕрдХреНрд╕рд░ рдХреЗрд╡рд▓ рдПрдХ рд▓рд┐рдВрдХ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред


рд╕рддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рд╕рддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдПрдХ рдмреАрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдЕрджреНрднреБрдд рдореЙрдбреНрдпреВрд▓ рд╕рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЪрдпрдирд┐рдд рдлрд╝реЛрд▓реНрдбрд░ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЛрд╕реНрдЯрдЧреНрд░реИрд╕реНрдХрд▓ рдпрд╛ рдореЗрдордХреЗрдЪреНрдб рдореЗрдВред рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░реЗрдВрдЧреЗ рд╡рд╣ рд╣реИ рдЖрдпрд╛рдд:
 from beaker.middleware import SessionMiddleware 

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рдЖрд░рдВрдн рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЖрд░рдВрднреАрдХрд░рдг рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
  options_session = { 'session.cookie_expires': 30000, 'session.timeout': 30000, 'session.type': 'file', #     'session.data_dir': './s_data' #      } 

рдФрд░ рдкреНрд░реА_рдЗрдирд┐рдЯ () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдбрд╛рдпрдиреЗрдорд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕ рдбреЛрдореЗрди рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╕рддреНрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
 session.options['session.cookie_domain'] = get_name_host() 

get_name_host () - рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИред
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рд╕рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
 def session(): #    s = request.environ.get('beaker.session') return s 

рдЕрдм рдХрд╣реАрдВ рднреА:
 s = session() s['test'] = '123' s.save() 


рд╕реНрдерд┐рддрд┐-рд╡рд┐рдЬреНрдЮрд╛рди


рдмреЛрддрд▓ рднреА рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдореЗрдВ рд▓рдЧреЗрдЧреА, рдХреЗрд╡рд▓ рд╣рдо, рдмрджрд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред

 #  bottle          ,           . @route('/static/<component>/<fname:re:.*>') def st_file(component, fname): #              ,     bottle path = os.path.join( settings.lib_path, component, 'static') + os.path.sep if not os.path.exists(path + fname): path = os.path.join( settings.lib_path, 'app', component,'static')+ os.path.sep if not os.path.exists( path + fname): path = os.path.join( os.getcwd(), 'app', component, 'static')+ os.path.sep if not os.path.exists(path + fname) and component == 'static': path = os.path.join( os.getcwd(), 'static')+ os.path.sep return static_file(fname, root=path) 


рдЕрдм рдпрд╣ рд╕реАрдЦрдирд╛ рдмрд╛рдХреА рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореЙрдбреНрдпреВрд▓ рдРрд╕рд╛ рд╣реЛ рддреЛ рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдХреЛ рдХреИрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реИ, рдЕрдЧрд░ рдРрд╕рд╛ рдХреЛрдИ рдореЙрдбреНрдпреВрд▓ рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдореБрдЦреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╕рднреА рдЕрдВрдзрд╛рдзреБрдВрдз рдирд╣реАрдВ рд╣реИрдВред
 def add_resourse(name, append=True): env = get_environment(); t = '' if name.endswith('.css'): t = 'css' if name.endswith('.js'): t = 'js' if not t: return if not name in env['res_list'][t]: if append: env['res_list'][t].append(name) else: env['res_list'][t].prepend(name) 


рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рднреА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕рд╣реА рд░рд╛рд╕реНрддрд╛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ '/ рд╕реНрдерд┐рд░ / <рдШрдЯрдХ> / <рдирд╛рдо: рдкреБрдирдГред *>> рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ:
 add_resourse(/static/base/base.js, True) 


рдФрд░ рдореБрдЦреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ, рд╣рдо рдмрд╕ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ:
 {% for res in env.res_list['js'] %} <script type="text/javascript" src="{{res}}"></script> {% endfor %} {% for res in env.res_list['css'] %} <link rel="stylesheet" type="text/css" href="{{res}}" /> {% endfor %} 


рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛


рдЕрдм рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред
рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдЯ / реирежрезрем рдХреЗ рд░реВрдЯ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд░рдЦреЗрдВрдЧреЗред
 from app.app_one.view import * routes = { 'hello': ('/', hello, 'GET') } 

рд╣рдо рдирдЬрд╝рджреАрдХреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд╛рд╕ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣рд╛рдБ рдирд╛рдо рддрд░реНрдХ рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ:
 def hello(): text = 'It works' return templ('hello', text=text) 

рдФрд░ рдЙрд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ / templ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣рдордиреЗ hello.tpl рдирд╛рдордХ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд░рдЦрд╛ рд╣реИред
 {{text}} 

рд╣рдо рд╕рднреА рд╕рд╛рдЗрдЯ рдХреА рдЬрдбрд╝ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЧреНрд░реАрдЯрд┐рдВрдЧ рджреЗрдЦрддреЗ рд╣реИрдВред

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


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

рдкреНрд░рдпреБрдХреНрдд рдФрд░ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реА


рдмреЛрддрд▓
рдмреАрдХрд░ рдФрд░ рдХреИрд╢рд┐рдВрдЧ
рдмреАрдХрд░
рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдХрд╛ рдкрд░рд┐рдЪрдп
рдкрд╛рдпрдерди рд╡реЗрдм рд╕рд░реНрд╡рд░ рдЧреЗрдЯрд╡реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕

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


All Articles