2012-04-17 71 views
2

我需要創建一個Web界面,它將提示輸入用戶名,密碼和「記錄ID」以使用這些憑據運行單獨的python腳本,然後吐出生成的文件。使用django使用密碼參數運行python腳本

我寫的獨立腳本需要用戶名/密碼(和ID)連接到Oracle數據庫(使用cx_Oracle),收集相關信息,生成PDF並將其保存到預設位置。它在完成時吐出文件名的位置。

我的想法是創建一個Django應用程序,它採用以下3個參數:

  • 用戶名
  • 密碼
  • ID(這將被用來確定哪些記錄爲PDF取)

Django通過調用子進程將參數傳遞給腳本。我就要把它放到我的看法,像這樣:

# ... 
import subprocess 

# ... 
def login_view(request): 
    username = password = '' 
    if request.POST: 
     username = request.POST.get('username') 
     password = request.POST.get('password') 
     record_id = request.POST.get('record_id') 

     output = subprocess.check_output([ 
      "python", 
      "myscript.py", 
      "-id", 
      record_id, 
      "-u", 
      username, 
      "-p", 
      password 
     ]) 
     # The output will look like: 
     # File /path/to/1234567.pdf saved 
     fname = output.split(' ')[1] 

     if fname.endswith('.pdf'): 
      # Get the filename without the /path/to junk in front 
      fname_nopath = fname.split('/')[-1] 

      file = open(fname, 'rb') 
      content = file.read() 
      file.close 

      response = HttpResponse(content, mimetype='application/pdf') 
      response['Content-Disposition'] = 'attachment; filename=%s' % fname_nopath 

      return response 
     else: 
      response = HttpResponse(output) 
      return response 

我覺得這個方法有點「笨拙」,我就覺得有采取更簡潔的方法。

我想到的另一種方法是直接將外部腳本導入到我的views.py文件中,然後使用從django傳遞的用戶名,密碼和記錄ID調用它的主函數。這樣我可以避免子流程機械。如果需要的話,我可以在腳本中創建一個單獨的main()函數,讓它返回一個文件字符串,然後通過django打開/提供文件。

唯一的問題是這個接口將被用戶非常頻繁地使用。要求他們每次都登錄以生成每個record_id的PDF報告,這有點痛苦。理想情況下,我想保持用戶登錄(我想我將不得不單獨維護一個cx_Oracle遊標,並將其傳遞到腳本中)。

我的感覺是,這是過於複雜的事情。有沒有更好的方法來做到這一點,或者我錯過了什麼?

回答

0

1)你應該使用django表單來處理用戶傳遞的參數。

2)您可以在用戶會話中保存用戶名/密碼 - 這樣用戶不需要再次輸入。 3)這實際上取決於你有多少記錄ID,但是你可以通過查詢數據庫來顯示可用記錄ID的列表。

+0

我結束了使用Django的形式採取用戶名/密碼,然後修改我的原始腳本,以便我可以直接導入到視圖,解析參數,然後運行main()函數。 – Nitzle 2012-05-08 16:24:16