2011年2月24日 星期四

[Python] 使用 Django 提供檔案下載的 CGI 服務

最近用了一點 Django,在 MVC 架構下,有時候有點脫褲子放屁 XD 真懷念以前重頭打造自己的 framework 的點滴啊,只不過工作後開發 project 要以維護為重,所以,還是老老實實地用 Django 吧。


關於提供下載 CGI 的部份:


修改 urls.py,新增一條路徑規則:


from django.conf.urls.defaults import *
urlpatterns = patterns('',
        (r'^get_file/', 'project.download.views.get_file'),
)


修改 views.py,新增檔案下載的對應函數:


from django.shortcuts import render_to_response
from django.template import RequestContext
from django import http
from django.http import HttpResponse
from django.core.servers.basehttp import FileWrapper

import simplejson
import sys, os, os.path
from time import mktime, gmtime, strftime, localtime
import cStringIO as StringIO

def get_file(request):
filename = request.POST.get('filename',None) or request.GET.get('filename',None)
message = ''
if filename <> None:
file_path = os.path.join( "/tmp" , filename )
if os.path.isfile( file_path ):
try:
response = HttpResponse( FileWrapper(file(file_path)) , content_type='text/plain')
response['Content-Length'] = os.path.getsize( file_path )
return response
except Exception, e:
message = stre(e)
pass
return render_to_response( 'error.html' , { 'message' : message } )


有時候若是動態產生出的結果,那就改成:


from django.shortcuts import render_to_response
from django.template import RequestContext
from django import http
from django.http import HttpResponse
from django.core.servers.basehttp import FileWrapper

import simplejson
import sys, os, os.path
from time import mktime, gmtime, strftime, localtime
import cStringIO as StringIO

def get_file(request):
filename = request.POST.get('filename',None) or request.GET.get('filename',None)

       output =  'filename:' + str(filename)

       # 轉 JSON 格式
       # output = simplejson.dumps( otuput )

        out = StringIO.StringIO()
        out.write( output )
        response = HttpResponse( FileWrapper( out ) , content_type='text/plain')
        response['Content-Length'] = out.tell()
        out.seek(0) 

return response


比較重要的是 get_file 之使用 StringIO.StringIO 時,最後別忘了 seek(0) 啊,不小心卡在這邊所以筆記一下。


沒有留言:

張貼留言