2012-04-04 14 views
6

Tôi đang cố gắng cache các phản hồi Python/bình bằng memcached. Sau đó tôi muốn phục vụ bộ nhớ cache bằng nginx. Tôi đang sử dụng mã bình mà trông giống như sau:nginx với bình và memcached trả về một số ký tự bị cắt xén

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() 

và cấu hình trang web nginx mà trông giống như sau:

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; 
    } 
} 

Tuy nhiên, khi nó kéo từ bộ nhớ cache mã html là tiền tố với chữ V, chứa các ký tự \ u000a (nguồn cấp dữ liệu dòng) và các ký tự cục bộ bị cắt xén và được gắn với "p1". như vậy:

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 
. 

Mặc dù loại nội dung là "text/html; charset = utf-8". Được cho là V [...] p1. điều có thể có một cái gì đó làm với chunked chuyển mã hóa một cái gì đó, một lá cờ đó không phải là hiện diện trong tiêu đề phản ứng. Tôi nên làm gì?

+0

Được rồi, vì vậy tôi đã sửa nó. Nó, tôi thêm add_header Transfer-Encoding chunked; trong cấu hình nginx, nhưng bây giờ tôi nhận được 'Lỗi 321 (net :: ERR_INVALID_CHUNKED_ENCODING)' nếu tôi tải nó trong Chrome sau khi tải nó trong Firefox. Có cách nào tốt hơn để thực hiện loại cache này không? – jondoe

Trả lời

4

Yay, tôi đã sửa nó! Các cấu hình nginx là đúng trước khi tôi thay đổi chunked, python/code bình tuy nhiên cần phải có được:

@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 

Đó là, tôi chỉ cần bộ nhớ cache dữ liệu, và điều đó chỉ có thể được thực hiện, afaik, nếu tôi làm make_response đầu tiên