使用我的Django应用程序,我可以从数据库中读取数据。当应用程序没有访问文件的权限时,它给了我这个错误:


尝试编写一个只读数据库


有道理。因此,我编辑了该文件的权限,以便Apache进程具有写权限。但是,它无法写,而是出现了这个神秘的错误:


无法打开数据库文件


如果有用,这是整个输出:

Request Method: POST
Request URL:    http://home-sv-1/hellodjango1/polls/1/vote/
Exception Type: OperationalError
Exception Value:    
unable to open database file
Exception Location: /usr/lib/pymodules/python2.5/django/db/backends/sqlite3/base.py in execute, line 193
Python Executable:  /usr/bin/python
Python Version: 2.5.2
Python Path:    ['/var/www', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/pymodules/python2.5', '/usr/lib/pymodules/python2.5/gtk-2.0']
Server time:    Sun, 23 Aug 2009 07:06:08 -0500


让我知道是否需要堆栈跟踪。

评论

它认为您在部署时遇到了这个问题。

#1 楼

啊哈,偶然发现了一篇解释这一点的文章。 Django在其NewbieMistakes页面上也有信息。

解决方案是确保包含数据库文件的目录也具有对该进程的写访问权限。

运行此命令可解决问题:

sudo chown www-data .


评论


这假定您使用的是debian / ubuntu,如果您使用的是CentOS,则将要使用“ apache”而不是“ www-data”

–卢克·查德威克(Luke Chadwick)
13年5月23日在6:44

@nbolton注意:将www-data设为chown。 。实际上应该是www-data。否则会有一些我不知道的chown命令的向导...请赐教。

–杰夫·谢菲尔德
14年8月19日在18:13

我相信额外的点是将组设置为所有者的默认组。否则,它不会更改组。不过,这只是出于记忆,我强烈建议您自己尝试一下。

–尼克·博尔顿(Nick Bolton)
15年2月26日在11:55

在将来链接腐烂或tl; dr的情况下进行了总结:SQLite3希望对DB文件的目录具有写访问权,以便在打开事务时可以在其中创建日记文件。

–user1454265
15年7月23日在16:04

非常适合Linux用户。 Windows版Bupkiss。

–杰伊·布兰查德(Jay Blanchard)
15年8月17日在16:46

#2 楼

我的解决方案更像是这样。
我真的不想更改该目录的所有权。 (主要是因为我使用pi用户执行git之类的事情)

/var/www/mysite $ ls -la sql*
-rw-rw-r-- 1 pi       pi       25600 Jan  2 22:57 sqlite.db


(或您使用的任何数据库)

我在其中创建了所有文件的用户。(是的,这是一个树莓派)

我没有更改对www-data的权限,而是发现只需要更改以下权限:

sudo chmod 775 /var/www/mysite
sudo chmod 664 /var/www/mysite/sqlite.db
sudo usermod -a -G pi www-data


这使组可以访问必需的文件,并将www-data用户添加到pi组。

注意:如果您有日志记录,则还需要对Django日志文件执行此操作,否则apache不会太喜欢它。

评论


我想您也可以将pi用户也添加到www-data组中。同样,您也可以按原样保留文件,并使用setfacl命令在文件和目录上添加pi的访问控制列表。

–slm
13年3月3日,0:09

setfacl听起来是一个不错的选择。将此列为指导性答案会很好。我面临的一个问题是,在测试中,我经常需要删除.db文件。重新创建后,需要再次将其重新锁定。

–SpiRail
2013年1月4日9:30



请参阅我对这个问题的答案serverfault.com/a/462970/2518。我还应该增加一些有用的东西吗?

–slm
13年2月1日在23:28

#3 楼

在使用Django Wiki页面的Newbie错误的SQLite3部分中,从Django说出“无法打开数据库文件”:

确保Apache也可以写入数据库的父目录
确保数据库文件完整路径的所有文件夹都不以数字开头
确保存在db目录的完整路径
确保您的/tmp目录是可全局写入的
确保路径到settings.py中指定的数据库是完整路径
确保Windows中的路径中没有特殊字符
,确保db目录路径中写有双反斜杠


评论


在此处复制/粘贴链接的相关部分。

–克里斯托弗·德·特罗耶(Christophe De Troyer)
16年4月21日在16:10

这是一个赞! :)

–克里斯托弗·德·特罗耶(Christophe De Troyer)
16年4月21日在19:56

serverfault.com的美丽之处:我10年前写了这个答案,(可能)它仍然有效和有用。 4年前评论(并改进了),今天进行了拼写检查:-)

–ssc
20 Sep 18 '17:09



#4 楼

将操作用户添加到www-data组在我的测试环境中运行良好。
另外,为了确保安全性,我将sqlite3.db文件放入单独的子文件夹中。

数据库文件应归www-data所有

sudo chown www-data mysite/db_sqlite3/
sudo chown www-data mysite/db_sqlite3/my.db


我的运营用户hape成为www-data组的成员:

sudo usermod -a -G www-data hape


允许对www-data组的成员进行数据库文件写访问:

sudo chmod u+w+x,g+w+x mysite/db_sqlite3/
sudo chmod u+w+x,g+w+x mysite/db_sqlite3/my.db

-daemon(用户www-data),而无需授予项目根文件夹,而-另一方面,应用程序可以由操作用户hape在dev模式下运行,例如

./manage.py runserver


还。

#5 楼


解决方案是确保包含数据库文件的目录也具有对该进程的写访问权限。


对于Windows 7、8.1、10,Server 2012等。请遵循Bonobo安装说明:

允许IIS用户修改
C:\ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data文件夹。

要这样做:


选择App_Data文件夹的属性,
转到“安全性”选项卡,
单击编辑,
选择IIS用户(在我的情况下为IIS_IUSRS)并添加“修改和写入”权限,
使用“应用”按钮确认这些设置。


#6 楼

从SO问题中借来的:https://stackoverflow.com/questions/4283132/apache-instance-user-permission-issue

假设文件由apache用户拥有以启动:

% chown -R apache.apache /var/www/mysite


为用户/组pi设置ACLs:关于权限位:

% setfacl -d -m u:pi:rwx /var/www/mysite
% setfacl -d -m g:pi:rwx /var/www/mysite

% getfacl /var/www/mysite
# file: /var/www/mysite
# owner: apache
# group: apache
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:pi:rwx
default:group::r-x
default:group:pi:rwx
default:mask::rwx
default:other::r-x


评论


将整个django项目的所有者/组设置为apache进程是一个坏主意,无需赋予不必要的特权。

–待命
13年2月1日在22:10

#7 楼

开发服务器需要以在数据库文件夹上具有写权限的同一用户身份运行,因此,如果您最初以root用户身份创建数据库,则在运行时需要以root用户身份运行:

python manage.py runserver


评论


虽然从技术上讲是正确的,但以root用户身份运行服务器是一个可怕的想法-将数据库授予通常运行服务器的普通非特权用户会更好...

–voretaq7
2012年11月10日8:52

#8 楼

在工作目录中创建子目录

mkdir db-folder 


在子目录中创建sqlite数据库

sqlite3 db-folder/db.db


更改所有者www.data的子目录位于debain或centOS的apache中

chown -R www-data db-folder


并抓住冰镇啤酒吧。

P / S :检查程序是否成功

ls -l data-folder


您应该看到这样的

-rw-r--r-- 2 www-data root 4096 Jun 18 01:38 data-folder


评论


如果您要发布答案,请提供与同一问题的其他答案完全不同的答案。

– Masegaloeh
14年6月18日在1:21

#9 楼

只需写sudo sqlite3 databaseFilename.sql就可以了

评论


这可能适用于交互式用户会话,但不适用于Web应用程序...

– HBruijn
17年1月4日在11:09