3 Stimmen

404-Fehlerbehandlung mit Mako-Vorlage

Bei 404-Fehlern wird versucht, die von mako gerenderte Vorlage anzuzeigen, aber es wird immer noch die Standard-Fehlerseite mit Cherrypy-Footer und zusätzlicher Meldung angezeigt: |Außerdem ist die benutzerdefinierte Fehlerseite fehlgeschlagen: TypeError: render_body() nimmt genau 1 Argument (3 gegeben)" Der Code:

def error_page_404(status, message, traceback, version):
    tmpl = tpl.get_template("404.mako")
    return tmpl.render(status, message)
cherrypy.config.update({'error_page.404': error_page_404})

Brauche Hilfe! Wie kann ich vollständig benutzerdefinierte Fehlerseiten mit meinem Layout (Mako-Vorlage) anzeigen?

Vollständiger Code:

import sys
sys.stdout = sys.stderr
import os, atexit
import threading
import cherrypy
from mako.template import Template
from mako.lookup import TemplateLookup

cherrypy.config.update({'environment': 'embedded'})
if cherrypy.engine.state == 0:
    cherrypy.engine.start(blocking=False)
    atexit.register(cherrypy.engine.stop)

localDir = os.path.dirname(__file__)
absDir = os.path.join(os.getcwd(), localDir)
path = os.path.join(absDir,'files')
templ_path = os.path.join(absDir,'html')

tpl = TemplateLookup(directories=[templ_path], input_encoding='utf-8', output_encoding='utf-8',encoding_errors='replace')

def error_page_404(status, message, traceback, version):
    tmpl = tpl.get_template("404.mako")
    return tmpl.render(status, message)
cherrypy.config.update({'error_page.404': error_page_404})

class Root:
    def index(self):
    tmpl = tpl.get_template("index.mako")       
    return tmpl.render(text = 'Some text',url = cherrypy.url())
index.exposed = True    

_application = cherrypy.Application(Root(), None)

import posixpath

def application(environ, start_response):
    environ['SCRIPT_NAME'] = posixpath.dirname(environ['SCRIPT_NAME'])
    if environ['SCRIPT_NAME'] == '/':
        environ['SCRIPT_NAME'] = ''
        return _application(environ, start_response)

2voto

cyraxjoe Punkte 5438

Sie sind höchstwahrscheinlich einen Fehler mit in Ihrem 404-Handler und ich vermute, Sie nicht die Einstellung der request.error_response der Cherrypy-Konfiguration wie diese und über den Fehler von response_body siehe diese verwenden Sie wahrscheinlich den falschen Körper der Vorlage.

Edit aus den Kommentaren:

def error_page_404(status, message, traceback, version):
    tmpl = tpl.get_template("404.mako")
    return tmpl.render(stat=status, msg=message)

cherrypy.config.update({'error_page.404': error_page_404})

En render Methode nur das Verhalten der Funktion mit den Schlüsselwortargumenten angeben, können Sie auch etwas flexibler sein und die gleiche Funktion wie folgt angeben:

def error_page_404(status, message, traceback, version):
    tmpl = tpl.get_template("404.mako")
    args = {'stat': status,
            'msg': message}
    return tmpl.render(**args)

Das macht es einfacher, die Argumente für die Vorlage zu erweitern, ich verwende normalerweise **args für meine render Anrufe.

Aber im Grunde war das Problem (wie Sie darauf hingewiesen haben), dass Sie render mit Nicht-Schlüsselwort-Argumenten aufrufen, und die erwartete Eingabe ist nur Schlüsselwort-Argumente, für die Vorlage.

0 Stimmen

Mein 404.mako ist nur ein einfaches html, keine Includes. request.error_response? Ich verstehe es nicht - wie kann ich es in meinem Fall einrichten?

0 Stimmen

Ich habe es herausgefunden! Also nach class Root hinzufügen _cp_config = {'error_page.404': error_page_404} Dann ändern Sie error_page_404 Funktion zu dieser: def error_page_404(status, message, traceback, version): tmpl = tpl.get_template("404.mako") return tmpl.render(stat = status, msg = message) cherrypy.config.update({'error_page.404': error_page_404}) Und jetzt funktioniert es!

0 Stimmen

@Zhlobopotam könnten Sie das in eine Antwort mit schön formatiertem Code einbauen?

1voto

Zhlobopotam Punkte 173

Also, ich habe es herausgefunden :) Danke an cyraxjoe! Hier ist der Code:

import sys
sys.stdout = sys.stderr
import os, atexit
import threading
import cherrypy
from mako.template import Template
from mako.lookup import TemplateLookup

cherrypy.config.update({'environment': 'embedded'})
if cherrypy.engine.state == 0:
    cherrypy.engine.start(blocking=False)
    atexit.register(cherrypy.engine.stop)

localDir = os.path.dirname(__file__)
absDir = os.path.join(os.getcwd(), localDir)
path = os.path.join(absDir,'files')
templ_path = os.path.join(absDir,'html')

tpl = TemplateLookup(directories=[templ_path], input_encoding='utf-8', output_encoding='utf-8',encoding_errors='replace')

def error_page_404(status, message, traceback, version):
    tmpl = tpl.get_template("404.mako")
    return tmpl.render(status, message)
cherrypy.config.update({'error_page.404': error_page_404})

class Root:
    _cp_config = {'error_page.404': error_page_404}
    def index(self):
    tmpl = tpl.get_template("index.mako")       
    return tmpl.render(text = 'Some text',url = cherrypy.url())
index.exposed = True    

_application = cherrypy.Application(Root(), None)

import posixpath

def application(environ, start_response):
    environ['SCRIPT_NAME'] = posixpath.dirname(environ['SCRIPT_NAME'])
    if environ['SCRIPT_NAME'] == '/':
        environ['SCRIPT_NAME'] = ''
        return _application(environ, start_response)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X