我有一个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.kml
是SomeState
的匹配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
答案 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类型。