在Django服务器上以raw / plain格式提供原始文件

时间:2014-10-09 12:03:45

标签: python django

我有一个Django应用程序,用于在模型state中上传KML文件和KmlModel值。要显示这些KML,我想将它们作为原始文件访问我正在尝试执行的服务器,如下所示:

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

2 个答案:

答案 0 :(得分:1)

您似乎正在存储这些KML文件的完整静态网址,但是在您的serve_file方法中,您尝试打开该网址,就像它是本地文件路径一样,并阅读和提供内容。

不是试图解决这个问题,为什么不直接重定向到静态网址?

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

编辑实际上,我意识到您的KML_File字段可能是模型.FileField。在这种情况下,您可以使用res.KML.File.open()直接打开它,因此无需将URL传递给您的serve_file方法。

另外,不要忘记你需要返回调用serve_file的结果。

答案 1 :(得分:0)

open()是标准Python open()吗?如果是这样,这将对文件而不是URL进行操作(尽管在使用open()打开URL时我无法获得相同的异常)。请尝试改为:

import urllib2

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

您也可以尝试重定向到该网址,但是,我不确定是否会为Content-type响应标头设置正确的MIME类型。