【问题标题】:Django - Save file to static directory from viewDjango - 从视图中将文件保存到静态目录
【发布时间】:2015-08-05 17:13:00
【问题描述】:

我正在使用 Django 构建一个网站,托管在 PythonAnywhere 上。 其中一个网站页面是一个私人页面,我用它来构建内容,然后将显示在公共页面中。 我不想将私有页面中生成的内容保存到数据库中,然后从数据库中检索它,而是将其保存到静态文件中,在我的静态目录中(这是少量的 JSON 文件,将一遍又一遍地提供再次,所以我认为将它们作为静态文件提供是有意义的)。

在定义我的私人页面的视图中,我有以下用于保存文件的代码:

json=request.POST.get('json')
name=request.POST.get('name')
file=open(settings.STATIC_ROOT+'/'+name+'.json','w')
file.write(json)
file.close()

请注意,我之前导入了设置:

from django.conf import settings

奇怪的是,这工作了一段时间,但后来就停止工作了。 我得到的错误是:

Exception Value: 'function' object has no attribute 'STATIC_ROOT'

我做错了吗? 我在 PythonAnywhere 上的事实是否相关?该应用程序是否可能由无法写入我的静态目录的工作人员提供服务? 我能做些什么来解决这个问题?

【问题讨论】:

  • 首选在您的 open 语句中使用 os.path.join。另外,检查文件夹中的权限。这在你的开发机器上工作吗?
  • 我没有使用开发机器,我只是在线工作。不使用 os.path.join 会有什么问题?静态文件夹应该有什么权限?
  • 应该出于各种原因使用开发机器。 os.path.join 不会解决您的问题,但这是一个很好的做法:stackoverflow.com/questions/13944387/… 关于权限,通常它应该是只读的,但对于您的特殊情况,显然您需要写权限。
  • PythonAnywhere 开发人员在这里——当然所有听起来都应该工作。您的应用由作为您自己的用户 ID 运行的工作人员提供服务,因此它应该有权写入目录。
  • 刚刚注意到 -- Exception Value: 'function' object has no attribute 'STATIC_ROOT' 表明您对 open 的调用中的变量 settings 已被函数替换。您是否有任何代码在导入和打开之间定义了一个名为 settings 的函数?

标签: django pythonanywhere


【解决方案1】:

正如 PythonAnywhere 工作人员所指出的,该过程是合法的并且应该可以工作,因为该应用程序由一个以我自己的用户 ID 运行的工作人员提供服务,该用户 ID 有权写入静态目录。 该问题是由命名冲突产生的,因为其中一个视图也被命名为设置。 为了解决这个问题,我将 import 语句替换为

from django.conf import settings as django_settings
import os

和打开语句

file=open(os.path.join(django_settings.STATIC_ROOT, f'game_{name}.json'),'w')

完成这些替换后,一切似乎都正常了。

【讨论】:

  • 在我的情况下,我有一个错误 FileNotFoundError: [Errno 2] No such file or directory 当我使用你的代码时。请任何解决方案。
猜你喜欢
  • 2015-08-28
  • 2015-02-05
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 2013-01-10
  • 2013-12-14
相关资源
最近更新 更多