我需要創建一個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遊標,並將其傳遞到腳本中)。
我的感覺是,這是過於複雜的事情。有沒有更好的方法來做到這一點,或者我錯過了什麼?
我結束了使用Django的形式採取用戶名/密碼,然後修改我的原始腳本,以便我可以直接導入到視圖,解析參數,然後運行main()函數。 – Nitzle 2012-05-08 16:24:16