2012-04-04 17 views
6

Estoy tratando de almacenar en caché las respuestas de Python/matraz con memcached. Entonces quiero servir el caché usando nginx. Estoy utilizando el código frasco que se ve algo como esto:nginx con matraz y memcached devuelve algunos caracteres ilegibles

from flask import Flask, render_template 
from werkzeug.contrib.cache import MemcachedCache 

app = Flask(__name__) 

cache = MemcachedCache(['127.0.0.1:11211']) 

@app.route('/') 
def index(): 
    index = cache.get('request:/') 
    if index == None: 
     index = render_template('index.html') 
     cache.set('request:/', index, timeout=5 * 60) 
    return index 

if __name__ == "__main__": 
    app.run() 

y una configuración de nginx sitio que se ve algo como esto:

server { 
    listen 80; 

    location/{ 
     set $memcached_key "request:$request_uri"; 
     memcached_pass 127.0.0.1:11211; 

     error_page 404 405 502 = @cache_miss; 
    } 

    location @cache_miss { 
     uwsgi_pass unix:///tmp/uwsgi.sock; 
     include  uwsgi_params; 

     error_page 404 /404.html; 
    } 
} 

Sin embargo, cuando se tira de la memoria caché el código html se prefija con una V, contiene caracteres \ u00e1 (alimentaciones de línea) y caracteres locales ilegibles, y tiene el sufijo "p1". como tal:

V<!doctype html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\u000a<head>\u000a <meta http-equiv="content-type" content="text/html; charset=UTF-8" />\u000a <meta http-equiv="content-language" content="no">\u000a\u000a <title> 

[...] 

\u000a\u000a</body>\u000a</html> 
p1 
. 

A pesar de que Content-Type es "text/html; charset = utf-8". Supuestamente el V [...] p1. Algo puede tener algo que ver con la transferencia fragmentada que codifica algo, un indicador que no está presente en el encabezado de respuesta. ¿Que debería hacer?

+0

Bien, así que lo semi-fijo. Agregué add_header Transfer-Encoding fragmentado; en la configuración nginx, pero ahora obtengo 'Error 321 (net :: ERR_INVALID_CHUNKED_ENCODING)' si lo cargo en Chrome después de haberlo cargado en Firefox. ¿Hay una mejor manera de hacer este tipo de cachine, quizás? – jondoe

Respuesta

4

¡Yay, lo arreglé! La configuración de nginx era correcta antes de que cambiara fragmentada, el código Python/frasco sin embargo debería haber sido:

@app.route('/') 
def index(): 
    rv = cache.get('request:/') 
    if rv == None: 
     rv = render_template('index.html') 
     cachable = make_response(rv).data 
     cache.set('request:/', cachable, timeout=5 * 60) 
    return rv 

Es decir, que sólo debe almacenar en caché los datos, y que sólo se puede hacer, que yo sepa, si lo hago make_response primero