8

我正在使用mod_wsgiapache2在 Ubuntu 服务器上运行 FlaskApp。我尝试成功运行烧瓶应用程序localhost,然后将其部署在 ubuntu 服务器上。

但是当我尝试更新数据库时,它给出了错误:

Failed to update model. (OperationalError) attempt to write a readonly database u'UPDATE mysongs SET songurl=? WHERE songid.id = ?' (u'www.site.com/I_wanna_dance', 1)

现在我尝试查找数据库文件权限,即:

-rwxr-xr-x 1 www-data www-data 10240 Jul 14 15:35 /var/www/mywebsite/appfolder/appdata.db`

当我尝试将权限更改为 777、755、644 等时,它显示另一个错误:unable to open database file虽然数据库文件在 644 权限下工作正常,localhost但在 ubuntu 服务器上却没有。

我还检查了目录和其他的权限/var /var/www /var/www/mywebsite /var/www/mywebsite/appfolder,所有这些都具有www-data:www-data其所有者用户名和组。

我尝试了谷歌搜索,但除了更改文件/目录权限的建议之外没有其他合适的解决方案,我自己尝试过。

为什么它不能读取/访问数据库文件?

请建议。

4

4 回答 4

6

此问题与文件权限管理有关,并且主要与在 Apache 配置文件 ( *.conf) 中选择的用户有关,该文件定义为保存应用程序进程。一句话:写权限需要匹配这个用户。

大多数情况下,sqlite 数据库文件是由特定用户(例如您的当前用户)创建的,并且站点应用程序在 Apache 默认用户www-data启动的子进程下运行(如果user内部未指定参数指令WSGIDaemonProcess)。在这种情况下,可以读取数据库,但如果您尝试修改任何内容,它将引发此错误:

(OperationalError) 尝试写入只读数据库...

因为www-data对文件(或父文件夹)没有权限


第一种方式:对用户 www-data 应用权限

您可以设置数据库文件及其父文件夹的写入权限。

如果文件夹包含其他文件,您可以对其添加写入权限,并且仅将数据库文件的所有权更改为用户www-data,例如:

sudo chmod o+w db_directory
sudo chown www-data:  db_directory/site_database.db 

或者如果文件夹只包含数据库文件,您可以尝试直接更改文件夹所有者:

sudo chown -R www-data: db_directory

然后检查/权限是否设置正确(使用ls -l site_database.db

在这篇文章中有更多帮助。


其他解决方案:添加特定用户来保存应用程序进程

这可以通过在 Apache 配置中的指令中给出usergroup参数来完成。WSGIDaemonProcess它将使 Apache 在特定用户下启动子进程。

例如 :

...
WSGIDaemonProcess main user=myuser group=myuser threads=3 python-home=/path/to/the/virtualenv/
WSGIProcessGroup main
WSGIApplicationGroup %{GLOBAL}
...

该用户将管理所有操作,包括对任何文件的读/写,因此请检查它是否对每个相关文件具有所有需要的权限。

出于安全考虑,您不得使用具有广泛权限的用户。

一些评论可以帮助这篇文章


注意:如果您使用 Apache 配置中的指令管理自己的日志文件,请小心ErrorLog,这些文件将遵循相同的权限逻辑。对于可以由应用程序更改的任何文件也是如此。

于 2018-05-27T18:20:39.527 回答
3

解决了这个问题。这是由于数据库文件权限冲突。

于 2013-08-14T01:13:40.750 回答
0

只需为您的项目和数据库授予 www-data 权限

sudo chown www-data:www-data ProjectPath

sudo chown www-data:www-data dbPath
于 2020-12-03T12:42:09.340 回答
-1

在 IIS 7.5 / Windows 2008 Server 上托管 Django Rest Framework 时遇到此问题。它在本地主机上运行良好。我添加了新功能来处理文件上传功能以及“文件名”。文件已正确上传,但数据库似乎不接受“文件名”字符串中的文本。

解决方案: 转到您的关注数据库。(如果您没有分配任何特定的数据库,请考虑基本文件夹中的文件db.sqlite3

右键单击db.sqlite3 --> 属性 --> 安全 --> 编辑 --> 添加

在文本框中输入Everyone --> Checkname --> ok

在 IIS 上刷新服务器并尝试运行应用程序。

于 2019-06-13T09:23:17.337 回答