我需要创建一个 Web 界面,该界面将提示输入用户名、密码和“记录 ID”,以使用这些凭据运行单独的 python 脚本,然后返回生成的文件。
我编写的单独脚本使用用户名/密码(和 ID)连接到 Oracle 数据库(使用 cx_Oracle),收集相关信息,生成 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 游标,并将其传递到脚本中)。
我的感觉是,这太复杂了。有没有更好的方法来做到这一点,或者我错过了什么?