2009-05-28 9 views
2

Wie dienen Sie Cheetah in Produktion?Wie vorkompilieren wir Basisvorlagen in Cheetah, so dass # include, #extends und # Import funktioniert in weby

Jungs können Sie das Setup auf teilen, wie in der Produktion

Gepard vorzukompilieren und dienen Da wir Vorlagen in webpy kompilieren nicht wird es stromaufwärts Auszeit Fehler bekommen. Wenn Sie eine gute Best Practice teilen könnte, würde es helfen,

*

Jeremy schrieb: Für eine Produktionsstätte, verwende ich Cheetah mit vorkompilierte Vorlagen - es ist sehr schnell (die Vorlagen importieren besonders schnell, wenn Python kompiliert und optimiert). Ein bisschen Magie mit dem imp Modul nimmt einen Template-Namen und ein Basisverzeichnis (konfigurierte in einem ortsspezifischen config) und Lasten von bis diese Vorlage, Pflege und #extends

Einfuhr Richtlinien gegebenenfalls unter . Ich verwende jedoch nicht die integrierte Unterstützung für

Gepard. Die neue Vorlage Bibliothek auch nur auf Anzeige der debugerror Seite

importiert

*

Antwort

1

Vielleicht automagically auf Bedarfsbasis kompilieren:

import sys 
import os 
from os import path 
import logging 
from Cheetah.Template import Template 
from Cheetah.Compiler import Compiler 

log = logging.getLogger(__name__) 

_import_save = __import__ 
def cheetah_import(name, *args, **kw): 
    """Import function which search for Cheetah templates. 

    When template ``*.tmpl`` is found in ``sys.path`` matching module 
    name (and corresponding generated Python module is outdated or 
    not existent) it will be compiled prior to actual import. 
    """ 
    name_parts = name.split('.') 
    for p in sys.path: 
    basename = path.join(p, *name_parts) 
    tmpl_path = basename+'.tmpl' 
    py_path = basename+'.py' 
    if path.exists(tmpl_path): 
     log.debug("%s found in %r", name, tmpl_path) 
     if not path.exists(py_path) or newer(tmpl_path, py_path): 
     log.info("cheetah compile %r -> %r", tmpl_path, py_path) 
     output = Compiler(
      file=tmpl_path, 
      moduleName=name, 
      mainClassName=name_parts[-1], 
      ) 
     open(py_path, 'wb').write(str(output)) 
     break 
    return _import_save(name, *args, **kw) 

def newer(new, old): 
    """Whether file with path ``new`` is newer then at ``old``.""" 
    return os.stat(new).st_mtime > os.stat(old).st_mtime 

import __builtin__ 
__builtin__.__import__ = cheetah_import 
0

Dies funktioniert

try:web.render('mafbase.tmpl', None, True, 'mafbase') 
except:pass 

Dies ist, was ich mit Ihnen Code tat

from cheetahimport import * 
sys.path.append('./templates') 
cheetah_import('mafbase') 

umfasst Arbeiten in der angegebenen Methode nicht.

Dies ist der Fehler, den ich

localhost pop]$ vi code.py 
    [[email protected] pop]$ ./code.py 9911 
    http://0.0.0.0:9911/ 
    Traceback (most recent call last): 
    File "/home/mark/work/common/web/application.py", line 241, in process 
    return self.handle() 
    File "/home/mark/work/common/web/application.py", line 232, in handle 
    return self._delegate(fn, self.fvars, args) 
    File "/home/mark/work/common/web/application.py", line 411, in _delegate 
    return handle_class(cls) 
    File "/home/mark/work/common/web/application.py", line 386, in handle_class 
    return tocall(*args) 
    File "user.py", line 264, in proxyfunc 
    return func(self, *args, **kw) 
    File "/home/mark/work/pop/code.py", line 1801, in GET 
    return web.render('subclass.html') 
    File "/home/mark/work/common/web/cheetah.py", line 104, in render 
    return str(compiled_tmpl) 
    File "/usr/lib/python2.5/site-packages/Cheetah-2.0.1-py2.5-linux-i686.egg/Cheetah/Template.py", line 982, in __str__ 
    def __str__(self): return getattr(self, mainMethName)() 
    File "templates/mafbase.py", line 713, in respond 
    self._handleCheetahInclude("widgetbox.html", trans=trans, includeFrom="file", raw=False) 
    File "/usr/lib/python2.5/site-packages/Cheetah-2.0.1-py2.5-linux-i686.egg/Cheetah/Template.py", line 1512, in _handleCheetahInclude 
    nestedTemplateClass = compiler.compile(source=source,file=file) 
    File "/usr/lib/python2.5/site-packages/Cheetah-2.0.1-py2.5-linux-i686.egg/Cheetah/Template.py", line 693, in compile 
    fileHash = str(hash(file))+str(os.path.getmtime(file)) 
    File "/usr/lib/python2.5/posixpath.py", line 143, in getmtime 
    return os.stat(filename).st_mtime 
    OSError: [Errno 2] No such file or directory: '/home/mark/work/pop/widgetbox.html' 
bekam