0

我在 Azure Web 应用程序上部署了一个 Django 应用程序,我想动态创建网络作业。更准确地说,当我保存一个名为 Importer 的 Django 模型时,我希望能够创建一个由 3 个文件组成的新 Web 作业:

  • run.py :Python 网络作业
  • settings.job : cron 计划
  • config.ini : webjob 的配置文件

“settings.job”和“config.ini”的内容来自管理表单并且特定于 webjob。

当我保存模型时,代码会在

App_Data\jobs\triggered{我的工作名称}

,并从我的应用程序目录中复制“run.py”。

这行得通。但是,当我尝试在作业目录中创建一个名为“settings.job”的新文本文件并在其中写入 cron 计划时,出现服务器错误。

我尝试了很多东西,但以下基本测试导致失败:

file = open('test.txt','w')
file.write('this is a test')
file.close()

看来我没有权限将文件写入磁盘。那怎么解决?另外,我希望能够在更新相应的 Django 模型时修改 config 和 settings.job 文件的内容。

此外,我尝试将另一个名为“run2.py”的文件复制到 webjob 目录,但也失败了!我无法在该目录中复制另一个 run.py 文件

4

2 回答 2

0

以下是我的分析:

  • 将“run.py”以外的其他文件复制到webjob目录没有问题
  • (成功)将文件“run.py”从我的 Django 应用程序目录复制到 webjob 目录后,代码崩溃。不管我使用的是shutil.copy/shutil.copyfile还是简单的open("{path}/run.py","w"),当我尝试将一个名为“run.py”的文件写入到webjob 目录中的磁盘。

我认为当我们创建一个新的 webjob 目录时,如果系统检测到一个名为“run.py”的文件,它会尝试执行一些操作。然后与试图同时访问同一个文件的两个进程发生冲突。

我的解决方案:我将 python 脚本复制到名为“myrun.txt”的 webjob 目录中,然后使用 os.rename 将其重命名为 run.py

有用 !

于 2017-02-16T18:48:25.757 回答
0

根据您的描述,根据我的经验,我认为问题是由于在您的代码中使用了相对路径引起的。

在 Azure WebApps 上,我们有权在 path 下进行任何操作D:/home

我的建议是使用绝对路径而不是相对路径,例如D:/home/site/wwwroot/App_Data/jobs/triggered/<triggered-job-name>/test.txtor/home/site/wwwroot/App_Data/jobs/triggered/<triggered-job-name>/test.txt代替test.txt. 并且请确保目录和父目录已通过使用os.path.exists(path)检查路径是否存在并os.makedirs在写入文件之前用于创建它们。

同时,您也可以尝试使用WebJobs API进行一些操作,例如通过上传 zip 文件或更新settings.job. 要使用这些 WebJobs API,请确保您已Deployment credentials在 Azure 门户上配置如下图,并Authorization: Basic <BASE64-Encode("deployment-username":"password")>在请求标头中添加基本身份验证。

在此处输入图像描述

于 2017-02-16T08:20:47.027 回答