Платформа django не может создать токен аутентификации в облаке Google

Я не могу создать токен для пользователя вручную через сайт администратора 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")

Привет, @rodrigo, поделитесь, пожалуйста, полным отслеживанием ошибки, о которой идет речь, вместо изображения. Кроме того, по изображениям я могу понять, что вы запускаете код в производственном режиме. Можно ли установить DEBUG = True в настройках, а потом поделиться трассировкой?

VJ Magar 30.03.2021 19:03

Привет, @VJMagar, и спасибо за ответ. Я изменю переменную DEBUG как можно скорее. Traceback находится в журналах, верно?

Rodrigo Alberto Guerrero Bermú 30.03.2021 19:11

Если вы включите отладку, то с ответом будет возвращен полный трекбэк, т.е. ваша страница 500 сама будет содержать трекбэк.

VJ Magar 30.03.2021 19:13

Извините за задержку @VJMagar, наконец-то я получил обратную связь. Я перередактирую вопрос, чтобы добавить эту трассировку.

Rodrigo Alberto Guerrero Bermú 31.03.2021 10:16

Это уже не извиняйся

VJ Magar 31.03.2021 10:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По трекубэку я могу понять, что таблицы 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, когда делаете его доступным для продакшена :)

VJ Magar 31.03.2021 11:25

Другие вопросы по теме