簡體   English   中英

Django:嘗試編寫只讀數據庫

[英]Django: Attempt to write a read-only database

我剛剛創建了一個Django項目

python manage.py startapp smartrecruitment

然后我運行了db sync

 python manage.py syncdb
 Operations to perform:
 Apply all migrations: admin, contenttypes, auth, sessions
 Running migrations:
   Applying contenttypes.0001_initial... OK
   Applying auth.0001_initial... OK
   Applying admin.0001_initial... OK
   Applying sessions.0001_initial... OK

並添加了我的超級用戶,但我無法在瀏覽器中訪問/ admin。 我嘗試過以下命令來授予apache權限,但沒有運氣。

sudo chown apache <folder_containing_db.sqlite3>
sudo chown apache db.sqlite3

更改項目目錄和數據庫文件www-data所有者

chown www-data:www-data /home/username/Django    
chown www-data:www-data /home/username/Django/db.sqlite  

您確實存在用戶/組權限問題:您需要使用對您的db文件具有讀/寫訪問權限的用戶運行您的Web服務器(使用sqlite3時)

更改整個項目的所有者和組是一個壞主意,因為它允許您的Web服務器用戶在您的代碼庫上編寫,這絕不是一個好習慣

更好的想法是在生產中使用真實數據庫而不是sqlite來避免這種情況。

https://docs.djangoproject.com/en/1.9/ref/settings/#databases

如果你想堅持使用sqlite:將sqlite文件放在項目存儲庫之外並給它和包含目錄正確的讀/寫訪問(例如只有www-data可以寫,但是你需要運行你的django命令作為www -數據)

some_dir [your_user:your_group]
--- your_django_project [github_user:github_user]
--- another_dir [www-data:www-data]
    |--- db.sqlite3 [www-data:www-data]

您的網絡服務器(apache / nginx)作為www-data運行

我正在尋找解決方案,因為我通過此鏈接關注了CentOS教程。 https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-apache-and-mod_wsgi-on-centos-7

這是該教程的權限,

sudo usermod -a -G root apache
chmod 710 /root/myproject
chown apache:apache /root/myproject
chown apache:apache /root/myproject/db.sqlite

簡而言之,當寫入sqlite數據庫的應用程序沒有寫入權限時,就會發生這種情況。

這可以通過三種方式解決:

  1. 使用chown向用戶授予db.sqlite3文件及其父目錄(從而也可以寫訪問權限)的所有權(例如: chown username db.sqlite3
  2. 以root用戶身份運行webserver(通常是gunicorn)(在運行gunicorn或django runserver之前運行命令sudo -i
  3. 允許通過運行命令chmod 777 db.sqlite3 (危險選項)對所有用戶進行讀寫訪問

注意 :除非您在本地計算機上運行Web服務器,否則永遠不要使用第三個選項,否則數據庫中的數據對您來說並不重要。

第二種選擇也很危險,因為@mateuszb說。 Django的代碼注入風險非常低,因為Django是以這種方式設計的。 在Django中,只有當開發人員使用evalexec編寫可怕的易受攻擊的代碼時,才能捕獲整個操作系統。 如果您對代碼質量沒有信心,甚至不知道代碼注入是什么,則第二個選項不適合您。

此外,如果您使用的是像mysql和Postgres這樣的數據庫,則不會發生此錯誤。 對於流量較大的網絡服務器來說,Sqlite不是一個好選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM