ユーザー名、パスワード、および「レコード ID」の入力を求める Web インターフェイスを作成して、それらの資格情報を使用して別の Python スクリプトを実行し、生成されたファイルを吐き出す必要があります。
私が書いた別のスクリプトは、(cx_Oracle を使用して) Oracle データベースに接続するためのユーザー名/パスワード (および ID) を受け取り、関連情報を収集し、PDF を生成して、事前設定された場所に保存します。完了すると、ファイル名の場所が吐き出されます。
私の考えは、次の 3 つのパラメーターを取る django アプリを作成することでした。
- ユーザー名
- パスワード
- ID (これは、PDF 用にフェッチするレコードを決定するために使用されます)
Django は subprocess を呼び出してスクリプトにパラメーターをフィードします。これを次のようにビューに入れます。
# ...
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 カーソルを個別に維持し、それをスクリプトに渡す必要があると思います)。
私の感じでは、これは物事を過度に複雑にしています。これを行うためのより良い方法はありますか、それとも何か見逃しましたか?