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

问题描述:

我需要创建一个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游标,并将其传递到脚本中)。

我的感觉是,这是过于复杂的事情。有没有更好的方法来做到这一点,或者我错过了什么?

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

2)您可以在用户会话中保存用户名/密码 - 这样用户不需要再次输入。 3)这实际上取决于你有多少记录ID,但是你可以通过查询数据库来显示可用记录ID的列表。

+0

我结束了使用Django的形式采取用户名/密码,然后修改我的原始脚本,以便我可以直接导入到视图,解析参数,然后运行main()函数。 – Nitzle 2012-05-08 16:24:16