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

标签 python django subprocess django-authentication

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

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

最佳答案

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

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

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

关于python - 使用 django 运行带有密码参数的 python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10199540/

相关文章:

python - 获取当前 gtk 样式的颜色

python - 尝试更新 libpython3.6-stdlib 导致覆盖错误

python - Django:嵌套的自定义模板标签

python - Django 说 "id may not be NULL"但这是为什么呢?

django - 我可以将经理添加到多对多关系中吗?

python - 在 Flycheck 中使用正确的 virtualenv 和 flake8 配置

python - 将列表传递给 subprocess.run

python - 将 Nmap 子进程中的数据直接存储到列表中

python - 使用 stdin 和 stdout 在 2 个进程之间进行通信

python - Pandas 应用 Idmax 错误地将混合对象列转换为 float