簡體   English   中英

Django 登錄錯誤:“嘗試編寫只讀數據庫”

[英]Django login error: “attempt to write a readonly database”

我正在嘗試在 CentOS 6 上設置 Apache(2.4,從源代碼構建)+Django(1.8.12),但是當我嘗試登錄我的站點或創建用戶或其他寫入數據庫的內容時,我收到一個錯誤:

嘗試寫一個只讀數據庫

我已經嘗試過:

  • 將 db 文件的所有者更改為apache用戶(不起作用)
  • 更改權限:775、774、664 給出與上述相同的錯誤; 666, 776 給出:

無法打開數據庫文件

  • 使用 django 項目對整個文件夾執行相同的操作

我跟着這個教程。

我的 httpd.conf(我添加的部分):

LoadModule wsgi_module modules/mod_wsgi.so
WSGIScriptAlias / /var/www/project/project/wsgi.py
WSGIPythonPath /var/www/project:/var/www/env/lib/python3.5/site-packages

<Directory /var/www/project>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

./manage createsuperuser工作正常,用戶添加到數據庫。

對於服務媒體,我使用 Nginx(所有媒體和靜態文件檢索正確)。

UPD

完整追溯:

Environment:


Request Method: POST
Request URL: http://localhost:8080/accounts/login/

Django Version: 1.8.12
Python Version: 3.5.1
Installed Applications:
('bootstrap3',
 'django_admin_bootstrapped',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'macros',
 'django_ajax',
 'ckeditor',
 'accounts',
 'main',
 'tutor',
 'public_testing',
 'control_testing',
 'debug_toolbar',
 'django_extensions',
 'mmc')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware')


Traceback:
File "/var/www/env/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/var/www/env/lib/python3.5/site-packages/django/views/decorators/debug.py" in sensitive_post_parameters_wrapper
  76.             return view(request, *args, **kwargs)
File "/var/www/env/lib/python3.5/site-packages/django/utils/decorators.py" in _wrapped_view
  110.                     response = view_func(request, *args, **kwargs)
File "/var/www/env/lib/python3.5/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  57.         response = view_func(request, *args, **kwargs)
File "/var/www/env/lib/python3.5/site-packages/django/contrib/auth/views.py" in login
  51.             auth_login(request, form.get_user())
File "/var/www/env/lib/python3.5/site-packages/django/contrib/auth/__init__.py" in login
  110.         request.session.cycle_key()
File "/var/www/env/lib/python3.5/site-packages/django/contrib/sessions/backends/base.py" in cycle_key
  285.         self.create()
File "/var/www/env/lib/python3.5/site-packages/django/contrib/sessions/backends/db.py" in create
  41.                 self.save(must_create=True)
File "/var/www/env/lib/python3.5/site-packages/django/contrib/sessions/backends/db.py" in save
  65.                 obj.save(force_insert=must_create, using=using)
File "/var/www/env/lib/python3.5/site-packages/django/db/models/base.py" in save
  734.                        force_update=force_update, update_fields=update_fields)
File "/var/www/env/lib/python3.5/site-packages/django/db/models/base.py" in save_base
  762.             updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/var/www/env/lib/python3.5/site-packages/django/db/models/base.py" in _save_table
  846.             result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "/var/www/env/lib/python3.5/site-packages/django/db/models/base.py" in _do_insert
  885.                                using=using, raw=raw)
File "/var/www/env/lib/python3.5/site-packages/django/db/models/manager.py" in manager_method
  127.                 return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/var/www/env/lib/python3.5/site-packages/django/db/models/query.py" in _insert
  920.         return query.get_compiler(using=using).execute_sql(return_id)
File "/var/www/env/lib/python3.5/site-packages/django/db/models/sql/compiler.py" in execute_sql
  974.                 cursor.execute(sql, params)
File "/var/www/env/lib/python3.5/site-packages/debug_toolbar/panels/sql/tracking.py" in execute
  159.         return self._record(self.cursor.execute, sql, params)
File "/var/www/env/lib/python3.5/site-packages/debug_toolbar/panels/sql/tracking.py" in _record
  101.             return method(sql, params)
File "/var/www/env/lib/python3.5/site-packages/django/db/backends/utils.py" in execute
  79.             return super(CursorDebugWrapper, self).execute(sql, params)
File "/var/www/env/lib/python3.5/site-packages/django/db/backends/utils.py" in execute
  64.                 return self.cursor.execute(sql, params)
File "/var/www/env/lib/python3.5/site-packages/django/db/utils.py" in __exit__
  98.                 six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/var/www/env/lib/python3.5/site-packages/django/utils/six.py" in reraise
  685.             raise value.with_traceback(tb)
File "/var/www/env/lib/python3.5/site-packages/django/db/backends/utils.py" in execute
  64.                 return self.cursor.execute(sql, params)
File "/var/www/env/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py" in execute
  318.         return Database.Cursor.execute(self, query, params)

Exception Type: OperationalError at /accounts/login/
Exception Value: attempt to write a readonly database

更新版本 2

/tmp權限:

drwxrwxrwt   6 root root  4096 Apr 22 10:06 tmp

settings.py 數據庫:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

錯誤頁面中的 DATABASES 部分:

DATABASES   {'default': {'ATOMIC_REQUESTS': False,
             'AUTOCOMMIT': True,
             'CONN_MAX_AGE': 0,
             'ENGINE': 'django.db.backends.sqlite3',
             'HOST': '',
             'NAME': '/var/www/project/db.sqlite3',
             'OPTIONS': {},
             'PASSWORD': '********************',
             'PORT': '',
             'TEST': {'CHARSET': None,
                      'COLLATION': None,
                      'MIRROR': None,
                      'NAME': None},
             'TIME_ZONE': 'UTC',
             'USER': ''}}

實際上,這實際上並不是登錄錯誤。 當寫入 sqlite 數據庫的應用程序沒有寫入權限時,就會發生這種情況。 由於登錄是第一次嘗試寫入數據庫,因此您將其視為登錄錯誤。

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

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

除非你在本地機器上運行網絡服務器或者數據庫中的數據對你來說根本不重要,否則永遠不要選擇第三個選項。

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

我遇到了同樣的問題,並將數據庫的所有者和目錄更改為對我有用的 apache 用戶(centos 7)。

chown apache:apache /root/myproject/db.sqlite
chown apache:apache /root/myproject

來自https://stackoverflow.com/a/45909954/1218179

對於運行在 Apache 上的 Django 應用程序,您可以通過檢查apache2/conf/httpd.conf文件找到運行 apache 的用戶。

對於 Bitnami Django Stack, httpd.conf文件顯示:

User daemon
Group daemon

這將顯示哪個用戶正在運行 apache。

現在,要解決“嘗試寫入只讀數據庫”的問題,只需運行以下命令:

sudo chown {apache_user}:{apache_user} /path/django_project
sudo chown {apache_user}:{apache_user} /path/django_project/db.sqlite3

chown命令將更改項目文件夾和數據庫的所有權,允許服務器與其通信。

看起來像權限問題。 db 文件的權限 777 應該可以工作 - 這樣您就可以將所有訪問權限授予所有用戶。 但是...如果您想編輯,會創建額外的journal文件,因此用戶需要編輯目錄。 Apache 用戶可以是apachenobody

暫無
暫無

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

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