SQLite работает, но PostgreSQL перенесенная база данных вызывает ОШИБКУ - Django 3.0 - PullRequest
4 голосов
/ 04 апреля 2020

Ситуация

  • Я создал Django 3.0, PostgreSQL 11, проект MacOS с парой приложений.
  • Я создал приложение для учетных записей, основанное на следующем курсе и github
  • чем я создал приложение для аутентификации acc
  • Все это было сделано в SQLite база данных
  • Ранее я пробовал базу данных PostgreSQL для раннего приложения, которое работало отлично
  • но теперь, когда я переключаюсь в файле settings.py, SQLite до PostgreSQL I я получаю сообщение об ошибке: я пытаюсь войти в систему
  • Если я переключаю обратно файл settings.py на SQLite , все работает отлично (например: аутентификация, вход в систему с пользователем пользователь делает что-то на сайте со своими собственными настройками)
  • Я использую decorators.py, чтобы держать вошедших в систему пользователей, посещающих страницы входа и регистрации, и это дает ошибка при переключении на postgresql. Я использую только здесь HttpResponse, чтобы сообщение об ошибке содержало

decorators.py

from django.http import HttpResponse
from django.shortcuts import redirect

def unauthenticated_user(view_func):
    def wrapper_func(request, *args, **kwargs):
        if request.user.is_authenticated:
            return redirect('home')
        else:
            return view_func(request, *args, **kwargs)

    return wrapper_func

def allowed_users(allowed_roles=[]):
    def decorator(view_func):
        def wrapper_func(request, *args, **kwargs):

            group = None
            if request.user.groups.exists():
                group = request.user.groups.all()[0].name

            if group in allowed_roles:
                return view_func(request, *args, **kwargs)
            else:
                return HttpResponse('Authorized')
        return wrapper_func
    return decorator

ERROR

Если я вхожу в систему, когда settings.py использует PostgreSQL. Если я выйду из системы, все снова будет работать нормально. Если я использую SQL lite, я могу войти, и все работает отлично

ValueError at /
The view accounts.decorators.wrapper_function didn't return an HttpResponse object. It returned None instead.
Request Method: GET
Request URL:    http://localhost...
Django Version: 3.0
Exception Type: ValueError
Exception Value: The view accounts.decorators.wrapper_function didn't return an HttpResponse object. It returned None instead.
Exception Location: /Users/.../python3.7/site-packages/django/core/handlers/base.py in _get_response, line 126
Python Executable:  /Users/.../bin/python3
Python Version: 3.7.3
.....

Request information
USER MYUSERNAME
GET No GET data
POST No POST data
FILES  No FILES data
COOKIES ...
...

Попытка решить

  1. Руководство, которому я следую создал группы пользователей, которые я также сделал в моей перенесенной базе данных postgreSQL, но я все еще получил ту же ошибку, что и USER1 в разделе комментариев.
    • Это была рекомендация в нижней части видео
    • "ПОЛЬЗОВАТЕЛЬ1 Я нашел это, я забыл изменить группу пользователей!
    • -> ПОЛЬЗОВАТЕЛЬ2 go в панель администратора и в свой пользовательский раздел добавьте клиента в выбранный раздел группы ".
    • Я сделал именно это, и это не сработало, единственная разница в том, что я использовал перенесенный postgresql, и они использовали оригинальный SQLight, который, если я использую, чем все это работает для меня, но я хочу, чтобы он работал с PostgreSQL.
  2. У меня есть данные, таблицы в обеих базах данных, но PostgreSQL для некоторых старых сотрудников и SQLite для всего.
    • Я пытался перенести SQLite на PostgreSQL с помощью этого руководства,
    • Я успешно создал копию базы данных SQLite
    • , но когда я изменил настройки на postgres, и я пытаюсь python manage.py migrate, он говорит Running migrations: No migrations to apply.
    • python manage.py loaddata db.json
    • Пользователи переносятся (я могу войти с ними и получить сообщение об ошибке, как и с единственными пользователями SQlite, если я неправильно ввожу пользователя или пароль, который мне не позволяет) из SQLite, но я я не вижу ни одной из таблиц данных в Postgresql, если я посмотрю ее с IDE
  3. Я говорил с другими людьми на форумах, но многие говорили, что это декоратор проблемный файл c, но он возникает только при переключении базы данных.
  4. Я создал новую базу данных postgresql и попытался перенести все (миграция уже не перенесла все). После того, как я попытался зарегистрироваться с новой учетной записью, после заполнения формы после нажатия формы я получил следующее сообщение:
DoesNotExist at /register/
Group matching query does not exist.
Я также создал базу данных AWS RDS postgreSQL, такую ​​как руководитель курса, перенес и подключил ее к серверу и в настройках, но я все еще получаю ту же ошибку. Я смотрел в для групп пользователей также и исходный код базы данных SQLight не имеет разрешений, выданных на вкладке администратора, как мой postgresql Создан новый проект Django 3, новая виртуальная среда 0 У меня есть только скопировал все как текст из предыдущего проекта, перенес все из предыдущей базы данных, я получаю ту же ошибку

Ответы [ 4 ]

3 голосов
/ 07 апреля 2020

Возможно, в вашей postgresql нет ни одной группы. Поэтому, пожалуйста, обойдите эти декораторы и добавьте группу в свою базу данных postgresql. Тогда воспользуйтесь этим декоратором.

3 голосов
/ 08 апреля 2020

Не уверен, что смогу помочь, но у меня есть Ма c, я использую Django и у меня были некоторые проблемы с PostgreSQL, поэтому я поделюсь своими идеями.

Сначала, кажется, мне, что проблема действительно в связи с базой данных, а не в коде. Я посмотрел вашу ошибку в коде Django, там написано:

    def _get_response(self, request):
        """
        Resolve and call the view, then apply view, exception, and
        template_response middleware. This method is everything that happens
        inside the request/response middleware.
        """
        ...

        # Complain if the view returned None (a common error).
        if response is None:
            ...

            raise ValueError(
                "The view %s.%s didn't return an HttpResponse object. It "
                "returned None instead." % (callback.__module__, view_name)
            )

Хотя я определенно не эксперт по промежуточному программному обеспечению, очевидно, Django не получает данные из вашей базы данных.

Однажды у меня были проблемы с различными версиями PostgreSQL на моей Ma c. Вы можете проверить / Library / PostgreSQL, у меня есть два каталога (11 и 12), поэтому я должен быть осторожен, какой из них я использую для своих проектов. В PgAdmin вы можете увидеть обе версии. Если у вас есть старые версии или вы хотите переустановить PostgreSQL (что довольно драматично c, но даст вам чистый лист), здесь есть хорошее руководство: https://medium.com/@zoefhall / эффективно-деинсталлировать-и-переустановить - psql -с-доморощенного-на-OSX-fabbc45c5d9d . Вы можете проверить версию, которую использует ваш Django, набрав в вашей командной консоли:

python3 manage.py shell -c "from django.db import connection; print(connection.cursor().connection.server_version)"

Для меня результат - 110005, что переводится как 11.0.5.

У меня также было проблемы с psycopg2 несколько раз. Установка необходима при настройке вашей виртуальной среды с Django, так что если вам это удалось, то, вероятно, все прошло хорошо. Проблема, с которой я столкнулся, заключалась в том, что он не мог найти файл конфигурации, и самым простым решением для меня было установить бинарную версию psycopg2-binary. Но если вам нужна указанная c версия PostgreSQL для вашего Ma c, то вам нужно поместить файл pg_config в вашу PATH, см. https://www.psycopg.org/docs/install.html.

Вот чему я научился, надеюсь, это немного вам поможет.

3 голосов
/ 05 апреля 2020

Прежде всего, я хотел бы предложить вам использовать встроенное приложение аутентификации django вместо того, чтобы создавать его самостоятельно https://docs.djangoproject.com/en/3.0/topics/auth/, и вы можете использовать приложение django -braces, которое имеет Удивительный набор миксов для просмотра классов, для того, что, как я вижу, вы пытаетесь сделать, этот миксин очень вам поможет: https://django-braces.readthedocs.io/en/latest/access.html#grouprequiredmixin

2 голосов
/ 09 апреля 2020

Итак, вот как я это решил.

  • Когда в видео говорится, что я должен создать группы пользователей в админ-панели, я это сделал.
  • Просто нужно было добавьте свойства к этой группе.
  • Home › Authentication and Authorization › Groups › customer
  • добавление функций, которые пользователь может делать, например:
...
accounts customer can view customer
...
  • После выхода вида администратора
  • Я вхожу в систему обычным способом и все работает
...