2013-08-06 60 views
3

我目前正在使用Flask來提供可視化編程環境。我希望用戶能夠加載目前在系統中的代碼,如果他們稍後再回來的話。我已經嘗試使用:用Flask提供更改文件

return redirect(url_for('static', filename='rawxml.txt')) 
return redirect(send_from_directory('static', 'rawxml.txt')) 

然而,無論是永遠不會滿足的文件的修改後的版本,而是似乎是該文件的緩存版本。我如何提供經常用新內容重寫的文件。

注:rawxml.txt存儲在「靜態」的目錄,但它是一個符號鏈接到實際的XML是(我已經嘗試了硬鏈接以及)。

+0

我想你可以設置HTTP頭,以避免緩存,但在你的情況下,它可能是最好的保存文件具有特殊的名字,例如像'e51564ccd047b3cb5e27ef66c036c574.txt'其中名稱是內容的相應的MD5哈希值。 –

回答

1

未經測試:

url = url_for('static', filename='rawxml.txt', t=time.time()) 
return redirect(url) 

如果內容不是動態的,你可以重寫它使用文件的MD5哈希 - 這樣你就只能作廢緩存中的文件發生更改時。 tbicr的答案看起來就是一個很好的例子。

[更新]

在jQuery的一側,這樣做:

$('#some_selector').load('{{ url }}#'+new Date().valueOf()); 
+0

僅供參考,'url_for'增加了關鍵字參數不在PARAMS到查詢字符串 - 這樣你就可以它簡化爲:'url_for(「靜」,文件名=「rawxml.txt」,T =了time.time()) ' –

+0

@SeanVieira:謝謝,更新。 –

+0

這在燒瓶端很好,但是在Javascript端我有我認爲是緩存問題。我通過JQuery獲取請求加載文件,並在Chrome中停止幾次後向Flask服務器發出GET請求。它在Firefox中完美運行。想法? – joe

2

我對靜態文件的下一個執行:

hash_cache = {} 

@app.url_defaults 
def add_hash_for_static_files(endpoint, values): 
    '''Add content hash argument for url to make url unique. 
    It's have sense for updates to avoid caches. 
    ''' 
    if endpoint != 'static': 
     return 
    filename = values['filename'] 
    if filename in hash_cache: 
     values['hash'] = hash_cache[filename] 
     return 
    filepath = safe_join(app.static_folder, filename) 
    if os.path.isfile(filepath): 
     with open(filepath, 'rb') as static_file: 
      filehash = get_hash(static_file.read(), 8) 
      values['hash'] = hash_cache[filename] = filehash 

它只是增加哈希參數的URL哪些用url_for生成。