首页 > 解决方案 > Django rest框架身份验证数据库错误

问题描述

我正在尝试在我当前的项目中实现 django rest 框架。api 引擎在没有安全性的情况下工作。我正在尝试按照 django rest 框架的身份验证页面中给出的步骤添加身份验证。

当我将以下部分添加到 settings.py 时,我没有收到任何错误:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
    'rest_framework.authentication.TokenAuthentication',
]
}

但是当我将“rest_framework.authtoken”添加到 INSTALLED_APPS 并运行服务器时,

我收到以下消息:

您有 2 个未应用的迁移。在您为应用程序应用迁移之前,您的项目可能无法正常工作:authtoken。运行“python manage.py migrate”以应用它们。

然后我尝试运行:

python manage.py migrate

我收到以下错误:

(raiotic-venv) username@username-VirtualBox:~/Servers/Repositories/raiotic-venv/raiotic$ python manage.py migrate 要执行的操作:应用所有迁移:MainApp、admin、auth、authtoken、contenttypes、sessions 运行迁移:应用 authtoken.0001_initial...Traceback(最近一次调用最后):文件“/home/username/venv/lib/python3.6/site-packages/django/db/backends/utils.py”,第 82 行,在 _execute返回 self.cursor.execute(sql) 文件“/home/username/venv/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py”,第 381 行,在执行中返回 Database.Cursor .execute(self, query) sqlite3.OperationalError:尝试写入只读数据库

上述异常是以下异常的直接原因:

回溯(最后一次调用):文件“manage.py”,第 21 行,在 main() 文件“manage.py”,第 17 行,在 main execute_from_command_line(sys.argv) 文件“/home/username/venv/lib /python3.6/site-packages/django/core/management/init .py ”,第 381 行,在 execute_from_command_line utility.execute() 文件“/home/username/venv/lib/python3.6/site-packages/django /核心/管理/初始化.py”,第 375 行,在执行 self.fetch_command(subcommand).run_from_argv(self.argv) 文件“/home/username/venv/lib/python3.6/site-packages/django/core/management/base.py ",第 323 行,run_from_argv self.execute(*args, **cmd_options) 文件 "/home/username/venv/lib/python3.6/site-packages/django/core/management/base.py",第 364 行,在执行输出 = self.handle(*args, **options) 文件“/home/username/venv/lib/python3.6/site-packages/django/core/management/base.py”,第 83 行,在包装的 res = handle_func(*args, **kwargs) 文件“/home/username/venv/lib/python3.6/site-packages/django/core/management/commands/migrate.py”,第 234 行,在句柄 fake_initial =fake_initial,文件“/home/username/venv/lib/python3.6/site-packages/django/db/migrations/executor.py”,第 117 行,在 migrate state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) File "/home/username/venv/lib/python3.6/site-packages/django/db/migrations/ executor.py”,第 147 行,在 _migrate_all_forwards state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) 文件“/home/username/venv/lib/python3.6/site-packages/django/db /migrations/executor.py”,第 245 行,在 apply_migration 状态 = migration.apply(state, schema_editor) 文件“/home/username/venv/lib/python3.6/site-packages/django/db/migrations/migration. py”,第 124 行,在应用 operation.database_forwards(self.app_label,schema_editor,old_state,project_state)文件“/home/username/venv/lib/python3.6/site-packages/django/db/migrations/operations/models .py”,第 92 行,在 database_forwards schema_editor.create_model(model) 文件“/home/username/venv/lib/python3.6/site-packages/django/db/backends/base/schema.py”,第 307 行,在create_model self.execute(sql, params or None) File "/home/username/venv/lib/python3.6/site-packages/django/db/backends/base/schema.py",第 137 行,在执行光标中。执行(sql,params)文件“/home/username/venv/lib/python3.6/site-packages/django/db/backends/utils.py”,第 99 行,在执行 return super().execute(sql, params) 文件“/home/username/venv/lib/python3.6/site-packages/django/db/backends/utils.py”,第 67 行,执行 return self._execute_with_wrappers(sql, params, many=False, executor=self._execute) 文件“/home/username/venv/lib/python3.6/site-packages/django/db/backends/utils.py”,第 76 行,在 _execute_with_wrappers 返回 executor(sql, params, many, context) 文件“/home/username/venvlib/python3.6/site-packages/ django/db/backends/utils.py”,第 84 行,在 _execute 中返回 self.cursor.execute(sql, params) 文件“/home/username/venvlib/python3.6/site-packages/django/db/utils. py",第 89 行,在exit raise dj_exc_value.with_traceback(traceback) from exc_value File "/home/username/venvlib/python3.6/site-packages/django/db/backends/utils.py",第 82 行,在 _execute return self.cursor.execute( sql) 文件“/home/username/venvlib/python3.6/site-packages/django/db/backends/sqlite3/base.py”,第 381 行,执行返回 Database.Cursor.execute(self, query) django。 db.utils.OperationalError:尝试写入只读数据库

标签: djangorestapidjango-rest-frameworkdjango-rest-auth

解决方案


尝试更改对 db.sqlite3 文件的权限,这可能是该模式对于您正在运行的用户是只读的,因为您没有写入该文件的权限。

ls -al db.sqlite3
chmod a+w db.sqlite3
python manage.py migrate

推荐阅读