使用django运行带有密码参数的python脚本

时间:2012-04-17 21:35:53

标签: python django subprocess django-authentication

我需要创建一个Web界面,提示输入用户名,密码和“记录ID”以使用这些凭据运行单独的python脚本,然后吐出生成的文件。

我编写的单独脚本使用用户名/密码(和ID)连接到Oracle数据库(使用cx_Oracle),收集相关信息,生成PDF并将其保存到预设位置。它完成时会吐出文件名的位置。

我的想法是创建一个django应用程序,它采用以下3个参数:

  • 用户名
  • 密码
  • 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游标,并将其传递给脚本)。

我的感觉是,这太复杂了。有更好的方法可以做到这一点,还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

1)您应该使用django表单来处理用户传递的参数。

2)您可以在用户的​​会话中保存用户名/密码 - 这样用户就不需要再次输入。

3)这实际上取决于您拥有多少记录ID,但您可以通过查询数据库来显示可用记录ID的列表。