Я не могу создать токен для пользователя вручную через сайт администратора django (https: // admin /).
Я создал учетные записи пользователей на платформе django, выделенной на облачном сервере Google, как приложение GAE. Чтобы добавить учетные записи пользователей, я использую стороннее приложение для django под названием «rest_framework», проблема возникает, когда я пытаюсь создать токен для созданного пользователя на сайте администратора, появляется ошибка 500 и я не знаю, как найти проблему. Фреймворк также был протестирован на локальной машине (моем компьютере) и работает правильно, но по какой-то причине не работает в облаке Google.
Добавленный код каждого файла выглядит следующим образом:
settings.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()),
]
serializers.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
views.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 выглядит как это. Есть идеи, как решить эту проблему?
Обновлено: Traceback показывает следующее:
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")
Привет, @VJMagar, и спасибо за ответ. Я изменю переменную DEBUG как можно скорее. Traceback находится в журналах, верно?
Если вы включите отладку, то с ответом будет возвращен полный трекбэк, т.е. ваша страница 500 сама будет содержать трекбэк.
Извините за задержку @VJMagar, наконец-то я получил обратную связь. Я перередактирую вопрос, чтобы добавить эту трассировку.
Это уже не извиняйся






По трекубэку я могу понять, что таблицы 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
дайте мне знать, решит ли это проблему
на всякий случай: @Rodrigo не забудьте установить debug= false, когда делаете его доступным для продакшена :)
Привет, @rodrigo, поделитесь, пожалуйста, полным отслеживанием ошибки, о которой идет речь, вместо изображения. Кроме того, по изображениям я могу понять, что вы запускаете код в производственном режиме. Можно ли установить
DEBUG = Trueв настройках, а потом поделиться трассировкой?