python - django 框架无法在谷歌云中创建身份验证令牌
问题描述
我无法通过 django 管理站点 (https://admin/) 手动为用户创建令牌。
我在谷歌云服务器中分配的 django 框架上建立了一个用户帐户,作为 GAE 应用程序。为了添加用户帐户,我为 django 使用了一个名为“rest_framework”的第三方应用程序,当我尝试在管理站点中为创建的用户创建令牌时出现问题,出现错误 500,不知道如何找到问题。该框架也已经在本地机器(我的电脑)上进行了测试并且可以正常工作,但由于某种原因它在谷歌云中不起作用。
每个文件的添加代码如下所示:
设置.py
from pathlib import Path
import os
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = ...
DEBUG = False
ALLOWED_HOSTS = ['*']
# Application definition
INSTALLED_APPS = [
'django.contrib.sites',
'rest_framework',
'rest_framework.authtoken',
'corsheaders',
'KhalilApp.apps.KhalilappConfig', #This is my app on django
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'DjangoServer.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'KhalilApp/Mapilib'), os.path.join(BASE_DIR,'static'), os.path.join(BASE_DIR,'KhalilApp/templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'DjangoServer.wsgi.application'
import pymysql
pymysql.version_info = (1, 4, 6, 'final', 0)
pymysql.install_as_MySQLdb()
# [START db_setup]
if os.getenv('GAE_APPLICATION', None):
# Running on production App Engine, so connect to Google Cloud SQL using
# the unix socket at /cloudsql/<your-cloudsql-connection string>
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '...',
'USER': '...',
'PASSWORD': '...',
'NAME': '...',
}
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': '...',
'NAME': '...',
'USER': '...',
'PASSWORD': '...',
}
}
# [END db_setup]
if os.getenv('TRAMPOLINE_CI', None):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3')
}
}
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Europe/Madrid'
USE_I18N = True
USE_L10N = True
USE_TZ = True
CORS_ALLOW_ALL_ORIGINS = True
STATIC_URL = 'static/'
STATIC_ROOT = 'static'
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAdminUser',
),
}
KhalilApp/urls.py
from django.urls import path
from django.conf.urls import include, url
from rest_framework import routers
from . import views
from rest_framework.authtoken.views import ObtainAuthToken
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
urlpatterns = [
...
url(r'^', include(router.urls)),
#url('app-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^auth/', ObtainAuthToken.as_view()),
]
序列化程序.py
from django.contrib.auth.models import User, Group
from rest_framework import serializers
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email', 'password')
extra_kwargs = {'password': {'write_only': True, 'required': True}}
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
return user
视图.py
...
class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
authentication_classes = (TokenAuthentication,)
permissioon_classes = (IsAuthenticated,)
然后,当我在这里尝试为用户创建令牌时,会 出现错误 500,如下所示。知道如何解决这个问题吗?
重新编辑:回溯显示如下:
Environment:
Request Method: GET
Request URL: https://.../admin/authtoken/tokenproxy/
Django Version: 3.1.7
Python Version: 3.9.2
Installed Applications:
['django.contrib.sites',
'rest_framework',
'rest_framework.authtoken',
'corsheaders',
'KhalilApp.apps.KhalilappConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/mysql/base.py", line 73, in execute
return self.cursor.execute(query, args)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/cursors.py", line 148, in execute
result = self._query(query)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/cursors.py", line 310, in _query
conn.query(q)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/connections.py", line 548, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/connections.py", line 775, in _read_query_result
result.read()
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/connections.py", line 1156, in read
first_packet = self.connection._read_packet()
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/connections.py", line 725, in _read_packet
packet.raise_for_error()
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/protocol.py", line 221, in raise_for_error
err.raise_mysql_exception(self._data)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/err.py", line 143, in raise_mysql_exception
raise errorclass(errno, errval)
The above exception ((1146, "Table 'principal.authtoken_token' doesn't exist")) was the direct cause of the following exception:
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/contrib/admin/options.py", line 614, in wrapper
return self.admin_site.admin_view(view)(*args, **kwargs)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/utils/decorators.py", line 130, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/contrib/admin/sites.py", line 233, in inner
return view(request, *args, **kwargs)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/utils/decorators.py", line 43, in _wrapper
return bound_method(*args, **kwargs)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/utils/decorators.py", line 130, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/contrib/admin/options.py", line 1693, in changelist_view
cl = self.get_changelist_instance(request)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/contrib/admin/options.py", line 735, in get_changelist_instance
return ChangeList(
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/contrib/admin/views/main.py", line 100, in __init__
self.get_results(request)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/contrib/admin/views/main.py", line 235, in get_results
result_count = paginator.count
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/utils/functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/core/paginator.py", line 94, in count
return c()
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/models/query.py", line 411, in count
return self.query.get_count(using=self.db)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/models/sql/query.py", line 515, in get_count
number = obj.get_aggregation(using, ['__count'])['__count']
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/models/sql/query.py", line 500, in get_aggregation
result = compiler.execute_sql(SINGLE)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1156, in execute_sql
cursor.execute(sql, params)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/utils.py", line 98, in execute
return super().execute(sql, params)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/utils.py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/django/db/backends/mysql/base.py", line 73, in execute
return self.cursor.execute(query, args)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/cursors.py", line 148, in execute
result = self._query(query)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/cursors.py", line 310, in _query
conn.query(q)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/connections.py", line 548, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/connections.py", line 775, in _read_query_result
result.read()
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/connections.py", line 1156, in read
first_packet = self.connection._read_packet()
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/connections.py", line 725, in _read_packet
packet.raise_for_error()
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/protocol.py", line 221, in raise_for_error
err.raise_mysql_exception(self._data)
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/pymysql/err.py", line 143, in raise_mysql_exception
raise errorclass(errno, errval)
Exception Type: ProgrammingError at /admin/authtoken/tokenproxy/
Exception Value: (1146, "Table 'principal.authtoken_token' doesn't exist")
解决方案
从引用中,我能够理解该principal.authtoken_token
表不存在。
The above exception ((1146, "Table 'principal.authtoken_token' doesn't exist")) was the direct cause of the following exception:
尝试
python manage.py makemigrations
python manage.py migrate
让我知道这是否可以解决问题
推荐阅读
- c++11 - C++中向量的分段错误错误
- php - 是什么导致此 Codeigniter 3 应用程序中的错误“无法在写入上下文中使用方法返回值”?
- javascript - 什么时候应该在 JS 中而不是在 HTML 中编写链接?
- html - 如何解析html
弦在颤动 - javascript - 谁能告诉我为什么我突然面临这个问题?
- c# - 导航管理器 NullReferenceException
- ios - 圆角按钮被切断的问题
- javascript - 如何使用 xpath 回显属性
- php - laravel 7中没有显示背景颜色
- python - 错误,文件“
",第 12 行返回 random.choice(bots_greeting) ^ SyntaxError: 'return' outside function