OperationalError:尝试在ubuntu服务器中编写只读数据库

时间:2013-07-14 17:50:32

标签: python apache ubuntu flask mod-wsgi

我在Ubuntu服务器上使用mod_wsgiapache2运行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虽然数据库文件在localhost上具有644权限但在ubuntu服务器上没有正常工作。

我还检查了目录的权限以及/var /var/www /var/www/mywebsite /var/www/mywebsite/appfolder等,所有人都有www-data:www-data作为其所有者的用户名和群组。

除了改变文件/目录权限的建议之外,我尝试使用谷歌搜索,但没有正确的解决方案,我已经尝试过了。

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

请建议。

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

此问题与文件权限管理有关,主要与在Apache配置文件(*.conf)中选择用于保存应用程序进程的用户有关。简而言之:写入权限需要与此用户匹配。

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

  

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

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

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

您可以在数据库文件及其父文件夹上设置 write 权限。

如果文件夹包含其他文件,您可以在其上添加写入权限,只将数据库文件的所有权更改为用户 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

this post.

中的更多帮助

其他解决方案:添加特定用户以保留申请流程

这可以通过在Apache配置中的指令WSGIDaemonProcess中提供user and group parameters来完成。 它将使Apache在特定用户下启动子进程。

例如:

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

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

出于安全考虑,您可能无法使用特权用户。

有些评论可以在this post中提供帮助。

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

答案 2 :(得分:0)

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

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

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

在文本框中输入所有人->姓名->确定

在IIS上刷新服务器,然后尝试运行该应用程序。

答案 3 :(得分:0)

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

sudo chown www-data:www-data ProjectPath

sudo chown www-data:www-data dbPath