2014-10-09 42 views
0

我有一個Django應用程序,用於上傳KML文件以及中的state值。要顯示這些KML檔案,我想訪問他們的服務器上的原始文件,我正在嘗試做如下:在Django服務器上以文本/純文本格式提供原始文件

def result(request): #mapped to /getFiles url 
    state = request.GET['state'] 
    res = KmlModel.objects.get(state__state__exact=state) 
    obj = res.Kml_File.url 
    serve_file(obj) 

def serve_file(filename): 
    response = HttpResponse(mimetype="text/plain") 
    for line in open(filename): 
     response.write(line) 
    return response 

我面臨的問題是,上試圖訪問/getFiles?state=SomeState,它給此錯誤 OSError at /getFiles [Errno 22] Invalid argument: 'http://127.0.0.1:8000/static/img/dynamic/RR.kml'其中RR.kmlSomeState的匹配KML文件。

任何想法如何我可以解決這個問題?

編輯

def result(request): 
    state = request.GET['state'] 
    res = KmlModel.objects.get(state__state__exact=state) 
    return HttpResponse(res.Kml_File.open(), mimetype='text/plain') 

Models.py

class KmlModel(models.Model): 
    id = models.AutoField(primary_key=True) 
    Kml_File = models.FileField(upload_to='dynamic/') 
    state = models.ForeignKey(State) 

    def __unicode__(self): 
     return self.state.state 

回答

1

看來你存儲這些KML文件的完整URL靜態化,但隨後你serve_file方法你想像打開本地文件路徑一樣打開該URL,然後閱讀並提供內容。

與其試圖解決這個問題,爲什麼不重定向到靜態URL?

res = KmlModel.objects.get(state__state__exact=state) 
return HttpResponseRedirect(res.KML_File.url) 

編輯其實,我知道你的KML_File場大概是一個models.FileField。在這種情況下,您可以直接使用res.KML.File.open()打開它,因此不需要將URL傳遞到serve_file方法。

另外,不要忘記你需要返回調用serve_file的結果。

+0

由於某種原因,仍會下載該文件。我添加了'content-type ='text/plain''來回應。 – Newtt 2014-10-09 12:17:58

+0

好吧,現在我明白你在做什麼。問題是,dev服務器將使用Python標準庫中的'mimetypes'模塊來猜測文件的類型,並且沒有簡單的方法來覆蓋它。但是,當您轉到生產環境時,您將能夠明確地配置Web服務器以將「.kml」作爲文本/純文本進行處理。 – 2014-10-09 12:31:02

+0

現在我看到有一個更簡單的方法,請參閱我的編輯。 – 2014-10-09 12:45:19

0

open()標準Python open()?如果是這樣,這對文件進行操作,而不是URL(儘管在打開URL爲open()時我無法獲得相同的例外)。嘗試改爲:

import urllib2 

def serve_file(url): 
    response = HttpResponse(mimetype="text/plain") 
    for line in urllib2.urlopen(url): 
     response.write(line) 
    return response 

您也可以嘗試重定向到URL,但是,我不知道正確的MIME類型將爲Content-type響應報頭中設置。

相關問題