如何以提升的权限运行django管理自定义命令?

时间:2018-11-15 05:56:34

标签: django window elevated-privileges django-management-command

我正在尝试从我的视图中运行自定义django管理命令。我已经准备好执行以下命令的视图:

from django.core.management import call_command
import django

def send_queued_mails():
    # Run Django Setup
    django.setup()
    call_command('send_all_queued_mails')

但是,在Windows计算机上执行命令时,出现以下错误:

    os.symlink(self.pid_filename, self.lock_filename)
    OSError: symbolic link privilege not held

我可以通过以管理员身份运行终端来手动解决此问题,但是我想通过自己的视图并以提升的特权来运行命令。

任何想法或建议都会受到赞赏。

PS:我也尝试使用OS级别命令,如下所示:

from subprocess import call
call(["python", "manage.py", "send_all_queued_mails"])

但是我遇到了与上面相同的错误。

1 个答案:

答案 0 :(得分:0)

我找到了一个对我来说很好的解决方案,也可能对其他人也起作用。我正在使用django-post_office发送电子邮件。我追溯到错误发生的那一行,如下:

    if hasattr(os, 'symlink'):
        os.symlink(self.pid_filename, self.lock_filename)
    else:
        # Windows platforms doesn't support symlinks, at least not through the os API
        self.lock_filename = self.pid_filename

这些注释清楚地表明Windows不支持符号链接,因此,我对代码进行了一些修改以避免该错误。

        if hasattr(os, 'symlink') and platform.system() != 'Windows':
        os.symlink(self.pid_filename, self.lock_filename)
    else:
        # Windows platforms doesn't support symlinks, at least not through the os API
        self.lock_filename = self.pid_filename

这不是确切的解决方案,因为它不能解决运行该命令时特权提升的问题。但是,如果遇到类似的错误,则可以直接将要为其创建符号链接的文件分配给所需的文件。

如果有人知道更好的方法,请回答。