Otrzymuję następujący błąd z mojego skryptu Cherrypy generowane przez moduł Prześlij.

ValueError: Prażek strony muszą zwracać bajty. Użyj narzędzi.ENCODE, jeśli chcesz zwrócić Unicode

Wyłączyłem narzędziem.ENCode w mojej konfiguracji, ale nadal dostaję ten błąd. Umożliwiam użytkownikom przesyłanie treści za pośrednictwem wtyczki formularza jQuery. Anytość, dlaczego otrzymuję ten błąd?

Oto mój plik Cherrypy:

class Root(object):    

@cherrypy.expose
def index(self)
    return open('/home/joestox/webapps/freelinreg_static/index.html')

@cherrypy.expose
def submit(self, myfile):

    cherrypy.session['myfile'] = myfile
    data_name = myfile.filename

    #Send back to JQuery with Ajax
    #Put in JSON form
    data_name= json.dumps(dict(title = data_name))
    cherrypy.response.headers['Content-Type'] = 'application/json'

    return data_name



cherrypy.config.update({
    'tools.staticdir.debug': True,
    'log.screen': True,
    'server.socket_host': '127.0.0.1',
    'server.socket_port': *****,
    'tools.sessions.on': True,
    'tools.encode.on': True,
    'tools.encode.encoding': 'utf-8',
})

config = {
}

cherrypy.tree.mount(Root(), '/', config=config)
cherrypy.engine.start()

HTML:

<!DOCTYPE html>
    <html>
        <head> 
            <script type='text/javascript' src='freelinreg_static/google.js'></script>
            <script type='text/javascript' src='freelinreg_static/frontend.js'></script>
            <script type='text/javascript' src='freelinreg_static/malsup.js'></script>
        </head>
        <body>

        <form id="dataform" action="submit" method="post" enctype="multipart/form-data">
            <input type="file" name="myfile" id="myFile"/>
            <input type="submit" id="data_submit" value="Continue"/>
        </form>                          

        </body>
    </html>

JQuery (frontend.js):

$(document).ready(function () {
    (function () {
        $('#dataform').ajaxForm({
            url: "submit",
            success: function (data) {
                var $a_var = data['title'];
                $('body').append($a_var);
            }
        });
        return false;
    })();
});
6
natsuki_2002 26 listopad 2013, 14:57

3 odpowiedzi

Najlepsza odpowiedź

Musisz zmienić rozłączenie globalnej aktualizacji konfiguracji, aby nastąpić po zamontowaniu aplikacji:

config = {
}

cherrypy.tree.mount(Root(), '/', config=config)

cherrypy.config.update({
    'tools.staticdir.debug': True,
    'log.screen': True,
    'server.socket_host': '127.0.0.1',
    'server.socket_port': *****,
    'tools.sessions.on': True,
    'tools.encode.on': True,
    'tools.encode.encoding': 'utf-8'
})

cherrypy.engine.start()

Ponieważ dzwoniłeś do Config = {} Po poleceniu Config Update Command zastępowałeś ustawienia aktualizacji dla aplikacji Root.

Zmień również funkcję przesyłania do tego:

@cherrypy.expose
@cherrypy.tools.json_out
def submit(self, myfile):
    cherrypy.session['myfile'] = myfile

    # Return dict, which will be autoconverted to JSON
    # by the json_out tool (see decorator above)
    return {'title': myfile.filename}
4
webKnjaZ 14 sierpień 2018, 10:07

Mam ten przypadek, jaki problem rozpoczął się po przełączeniu z P2 do P3.

Został rozwiązany przez ustawienie

    'tools.encode.text_only': False

W aplikacji Global Configuration.

Mam nadzieję, że to pomoże

7
colio303 1 styczeń 2021, 03:17

Cześć, ludzie szukają odpowiedzi. Miałem ten sam problem, ale w moim przypadku ten mały dodatek rozwiązał wszystko.

return <some-json>.encode('utf8')
4
JtotheR 13 lipiec 2018, 08:31