En utilisant mon Django app, je suis capable de lire très bien à partir de la base de données. Lorsque l'application n'a pas eu l'autorisation d'accéder au fichier, elle m'a donné cette erreur:
tenter d'écrire une base de données en lecture seule
Ce qui était logique. J'ai donc modifié les autorisations sur le fichier, afin que le processus Apache ait des autorisations d'écriture. Cependant, au lieu de pouvoir écrire, j'obtiens cette erreur cryptique:
impossible d'ouvrir le fichier de base de données
Si c'est utile, voici la sortie entière:
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
Faites-moi savoir si une trace de pile est nécessaire.
Aha, je suis juste tombé sur n article expliquant cela. Aussi Django ont des informations sur leur NewbieMistakes page.
La solution consiste à s'assurer que le répertoire contenant le fichier de base de données dispose également d'un accès en écriture au processus.
Dans mon cas, l'exécution de cette commande a résolu le problème:
Sudo chown www-data .
Ma solution était plus comme ça. Je ne voulais pas vraiment changer la propriété de ce répertoire. (principalement parce que j'utilise l'utilisateur pi pour faire des choses comme git)
/var/www/mysite $ ls -la sql*
-rw-rw-r-- 1 pi pi 25600 Jan 2 22:57 sqlite.db
(ou quelle que soit la base de données que vous utilisez)
où pi est l'utilisateur dans lequel j'ai créé tous les fichiers. (oui c'est un Raspberry Pi)
Au lieu de changer les autorisations en www-data, j'ai constaté que je n'avais besoin que de modifier les autorisations comme ceci:
Sudo chmod 775 /var/www/mysite
Sudo chmod 664 /var/www/mysite/sqlite.db
Sudo usermod -a -G pi www-data
Cela donne au groupe un accès en écriture aux fichiers nécessaires et ajoute l'utilisateur www-data au groupe pi.
Remarque: si vous avez une journalisation, vous devrez le faire pour le Django logfile également ou Apache ne l'aimera pas beaucoup.
Dans le Django dit "Impossible d'ouvrir le fichier de base de données" lors de l'utilisation de SQLite3 section du Erreurs débutant Django wiki page :
db
existe/tmp
le répertoire est accessible en écrituresettings.py
est un chemin completL'ajout d'un utilisateur opérationnel au groupe www-data fonctionne bien sur mon environnement de test. De plus, j'ai mis le fichier sqlite3.db dans un sous-dossier séparé, pour plus de sécurité.
Le fichier de la base de données appartient à www-data
Sudo chown www-data mysite/db_sqlite3/
Sudo chown www-data mysite/db_sqlite3/my.db
Mon utilisateur opérationnel devient membre du groupe www-data:
Sudo usermod -a -G www-data hape
Autorisez l'accès en écriture au fichier de base de données aux membres du groupe 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
En conséquence, la base de données est accessible en lecture + écriture par le démon Apache2 (utilisateur www-data), sans accorder de subvention au dossier racine du projet, et - d'autre part - l'application peut être exécutée en mode dev par le gestionnaire opérationnel. forme d'utilisateur, par exemple.
./manage.py runserver
aussi.
Emprunté à SO question: https://stackoverflow.com/questions/4283132/Apache-instance-user-permission-issue
En supposant que les fichiers appartiennent à l'utilisateur Apache pour démarrer:
% chown -R Apache.apache /var/www/mysite
définissez ACLs
pour l'utilisateur/groupe pi:
% 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
Vous pouvez voir qu'il y a un ACL
avec ls -l
, le "+" de fin sur les bits d'autorisation:
# 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
La solution consiste à s'assurer que le répertoire contenant le fichier de base de données dispose également d'un accès en écriture au processus.
Pour Windows 7, 8.1, 10, Server 2012, etc., suivez les instructions d'installation de Bonobo :
Autoriser IIS Utilisateur pour modifier le dossier C:\inetpub\wwwroot\Bonobo.Git.Server\App_Data.
Faire cela:
Le serveur de développement doit être exécuté en tant que même utilisateur qui a des autorisations d'écriture sur le dossier de la base de données, donc si vous avez initialement créé la base de données en tant que root, vous devrez être root lorsque vous exécutez:
python manage.py runserver
créer un sous-répertoire dans le répertoire de travail
mkdir db-folder
créer une base de données sqlite dans le sous-répertoire
sqlite3 db-folder/db.db
changer le propriétaire du sous-répertoire en www-data dans debain ou Apache dans centOS
chown -R www-data db-folder
et prenez une bière froide car vous avez terminé.
P/S: pour vérifier si la procédure a réussi
ls -l data-folder
vous devriez voir une telle
-rw-r--r-- 2 www-data root 4096 Jun 18 01:38 data-folder