使用我的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
让我知道如果一个堆栈跟踪是必要的。
啊哈,偶然发现了一篇文章解释这个。 另外Django在他们的NewbieMistakes页面上有信息。
解决scheme是确保包含数据库文件的目录也具有对进程的写入访问权限。
在我的情况下,运行这个命令解决了这个问题:
chown www-data. .
从Django的“无法打开数据库文件”时使用SQLite3的新手 部分 错误 Django wiki 页面 :
db
目录的完整path确实存在 /tmp
目录是世界可写的 settings.py
指定的数据库path是完整path 我的解决scheme更像是这样。 我真的不想改变这个目录的所有权。 (主要是因为我使用pi用户做像git的东西)
/var/www/mysite $ ls -la sql* -rw-rw-r-- 1 pi pi 25600 Jan 2 22:57 sqlite.db
(或者你正在使用的任何数据库)
其中pi是我创build所有文件的用户(是的,这是一个覆盆子pi)
我发现我只需要像这样更改权限,而不是更改www数据的权限:
sudo chmod 775 /var/www/mysite sudo chmod 664 /var/www/mysite/sqlite.db sudo usermod -a -G pi www-data
这使组写入访问必要的文件,并将www数据用户添加到pi组。
注意:如果你有日志logging,你需要为django日志文件做这个,否则apache不会太喜欢它。
将操作用户添加到www-data组在我的testing环境中运行良好。 另外,我已经把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
因此,可以通过apache2-daemon(用户www-data)读取和写入数据库,而无需授予项目根文件夹,另一方面,应用程序可以通过操作在开发模式下运行用户hape,例如
./manage.py runserver
也。
借用从这个问题: https : //stackoverflow.com/questions/4283132/apache-instance-user-permission-issue
假设文件由apache用户拥有开始:
% chown -R apache.apache /var/www/mysite
设置用户/组pi的ACLs
:
% setfacl -d -mu:pi:rwx /var/www/mysite % setfacl -d -mg:pi:rwx /var/www/mysite % getfacl /var/www/mysite # file: /var/www/mysite # owner: apache # group: apache user::rwx group::rx other::rx default:user::rwx default:user:pi:rwx default:group::rx default:group:pi:rwx default:mask::rwx default:other::rx
你可以通过ls -l
来判断是否存在一个ACL
,这个权限位的结尾是'+':
# ls -la /var/www drwxr-xr-x 3 apache apache 80 26. Nov 12:43 . drwxrwxrwt 15 root root 360 26. Nov 12:40 .. drwxrwxr-x+ 2 apache apache 40 26. Nov 12:43 mysite
解决scheme是确保包含数据库文件的目录也具有对进程的写入访问权限。
对于Windows 7,8.1,10和Server 2012等,请按照Bonobo的安装说明进行操作 :
允许IIS用户修改C:\ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data文件夹。
要做到这一点:
开发服务器需要以与在数据库文件夹上写入perm相同的用户身份运行,所以如果最初以root用户身份创build数据库,则在运行时需要root用户身份:
python manage.py runserver
在工作目录中创build一个子目录
mkdir db-folder
在子目录中创buildsqlite数据库
sqlite3 db-folder/db.db
将子目录的所有者更改为debain中的www-data或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
只需写sudo sqlite3 databaseFilename.sql
,它的工作