3
votes

SQLite fonctionne, mais la base de données migrée PostgreSQL provoque une ERREUR - Django 3.0

Situation

  • J'ai construit Django 3.0, PostgreSQL 11, un projet macOS avec quelques applications.
  • J'ai créé l'application de comptes basée sur le cours suivant et c'est github
  • Que j'ai créé une application pour l'authentification acc
  • Tout cela a été fait dans une base de données SQLite
  • Auparavant, j'ai essayé une base de données PostgreSQL pour la première application qui fonctionnait bien
  • mais maintenant, lorsque je passe dans le fichier settings.py du SQLite à PostgreSQL, j'obtiens une erreur i J'essaye de me connecter
  • Si je repasse settings.py sur SQLite, tout fonctionne parfaitement (ex: authentification, connexion avec l'utilisateur, utilisateur faisant des choses sur le site Web avec ses propres paramètres)
  • J'utilise decorators.py pour garder les utilisateurs connectés en visitant les pages de connexion et d'inscription et cela donne une erreur lorsque je passe à postgresql. Je n'utilise ici que HttpResponse que le message d'erreur contient

decorators.py

DoesNotExist at /register/
Group matching query does not exist.

ERREUR

Si je me connecte alors que settings.py utilise PostgreSQL . Si je me déconnecte, tout fonctionne à nouveau correctement. Si j'utilise SQL Lite, je peux me connecter et tout fonctionne parfaitement

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 ...
...

J'ai essayé de résoudre

  1. Le guide que je suis a créé des groupes d'utilisateurs que j'ai également créés dans ma base de données postgreSQL migrée, mais j'ai toujours reçu la même erreur que USER1 dans la section des commentaires.
    • C'était la recommandation dans la partie inférieure de la vidéo
    • "USER1 je le trouve, j'ai oublié de changer le groupe de l'utilisateur!
    • -> USER2 allez dans le panneau d'administration et dans votre section utilisateur, ajoutez le client dans la section du groupe choisi ".
    • J'ai fait exactement cela et cela n'a pas fonctionné, la seule différence est que j'ai utilisé un postgresql migré et qu'ils ont utilisé le SQLight original qui si j'utilise que tout fonctionne pour moi aussi, mais je veux le faire fonctionner avec PostgreSQL .
  2. J'ai des données, des tables dans les deux bases de données mais PostgreSQL pour certains anciens employés et SQLite pour tout.
    • J'ai essayé de migrer le SQLite vers PostgreSQL avec ce guide .
    • J'ai créé avec succès une copie de la base de données SQLite
    • mais quand j'ai changé les paramètres en postgres et que j'essaye de python manage.py migrate il est dit Running migrations: No migrations to apply.
    • python manage.py loaddata db.json
    • Les utilisateurs sont migrés (je peux me connecter avec eux et obtenir une erreur comme avec les seuls utilisateurs de SQlite, si je saisis mal l'utilisateur ou le mot de passe qu'il ne me laisse pas entrer) de SQLite mais je ne vois aucune des tables de données dans Postgresql si je le recherche avec un IDE
  3. J'ai parlé à d'autres personnes sur les forums, mais beaucoup ont dit que c'était le fichier décorateur qui posait problème, mais cela ne se produit exactement qu'au moment du changement de base de données.
  4. J'ai créé une nouvelle base de données postgresql et j'ai essayé de tout migrer (la migration n'a pas déjà tout migré). Ensuite, j'ai essayé de m'inscrire avec un nouveau compte et cela m'a donné le message d'erreur suivant après avoir rempli le formulaire et appuyez sur Soumettre
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
  1. J'ai également créé une base de données AWS RDS postgreSQL comme le responsable du cours, je l'ai migrée et connectée avec le serveur et dans les paramètres, mais j'ai toujours la même erreur.
  2. J'ai également examiné les autorisations des groupes d'utilisateurs et la base de données SQLight du code source n'a aucune autorisation donnée dans l'onglet admin comme mon postgresql
  3. J'ai créé un tout nouveau projet Django 3, un tout nouvel environnement virtuel 0 Je n'ai tout copié que sous forme de texte du projet précédent, tout migré de la base de données précédente, j'obtiens la même erreur


6 commentaires

êtes-vous sûr de créer manuellement les groupes à partir de l'administrateur de django et de leur attribuer les utilisateurs.?


Je ne connais pas d'autre moyen, donc je suis sûr.


Ce n'est pas l'inverse. La fonction "allowed_users" est ce à quoi je fais référence. Fondamentalement, il attend des rôles au sein du groupe qui, selon la vidéo, peuvent être du personnel, des administrateurs ou tout autre. Alors, avez-vous créé des rôles à partir de l'administrateur django dans le groupe?


Oui, comme je l'explique dans Essayé de résoudre 1.


@trinchet c'est correct Je ne sais tout simplement pas comment résoudre ce problème, ni où chercher le correctif car le code fonctionne avec SQLite mais pas avec le postgeSQL migré


Quoi qu'il en soit, j'ai essayé d'exécuter votre code à la fois dans postgres et sql, cela fonctionne parfaitement bien pour moi


4 Réponses :


3
votes

Tout d'abord, je voudrais vous suggérer d'utiliser l'application d'authentification intégrée django au lieu d'en créer une par votre propre https://docs.djangoproject.com/en/3.0/topics/auth/ , et vous pouvez utiliser l'application django-braces qui a un ensemble incroyable de mixins de vue de classe, pour ce que je vois que vous essayez de faire, ce mixin vous aiderait beaucoup: https://django-braces.readthedocs.io/en/latest/access.html#grouprequiredmixin


1 commentaires

Je voudrais juste corriger ce bogue que je ne suis en gros défini. Je ne veux pas supprimer toute l'application d'authentification et le faire avec une toute nouvelle bibliothèque que je n'ai jamais entendue auparavant. Mais je pourrais l'utiliser pour d'autres projets à l'avenir.



3
votes

Il peut être possible, il n'y a aucun groupe dans votre postgresql. Veuillez donc contourner ces décorateurs et ajouter un groupe à votre base de données postgresql. Ensuite, utilisez ces décorateurs.


1 commentaires

Comme je le mentionne dans mon commentaire dans la section Essayé de résoudre "le guide que je suis a créé des groupes d'utilisateurs, que j'ai également fait dans ma base de données PostgreSQL migrée"



3
votes

Je ne suis pas sûr de pouvoir vous aider, mais j'ai un Mac, j'utilise Django et j'ai eu des problèmes avec PostgreSQL, donc je vais partager mes idées.

Premièrement, il me semble que le problème est bien la connexion avec la base de données, pas le code. J'ai recherché votre erreur dans le code Django, il dit:

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

Bien que je ne sois certainement pas un expert en middleware, apparemment Django ne reçoit pas de données de votre base de données.

Une fois, j'ai eu des problèmes avec différentes versions de PostgreSQL sur mon Mac. Vous pouvez archiver / Library / PostgreSQL, j'ai deux répertoires (11 et 12), donc je dois faire attention à celui que j'utilise pour mes projets. Dans PgAdmin, vous pouvez voir les deux versions. Si vous avez d'anciennes versions ou souhaitez réinstaller PostgreSQL (ce qui est assez drastique mais vous donnerait une feuille vierge), il y a un bon manuel ici: https://medium.com/@zoefhall/effectively-uninstall-and-reinstall- psql-avec-homebrew-sur-osx-fabbc45c5d9d . Vous pouvez vérifier la version que votre Django utilise en tapant dans votre Shell:

    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)
            )

Pour moi, le résultat est 110005, ce qui se traduit par 11.0.5.

J'ai également eu des problèmes avec psycopg2 à plusieurs reprises. Son installation est nécessaire lorsque vous configurez votre environnement virtuel avec Django, donc si vous avez réussi cela, alors cela s'est probablement passé. Le problème que j'ai eu était qu'il ne pouvait pas trouver le fichier de configuration, et la solution la plus simple pour moi était d'installer la version binaire psycopg2-binary. Mais si vous voulez une version spécifique de PostgreSQL sur votre Mac, vous devez mettre le fichier pg_config dans votre PATH, voir https://www.psycopg.org/docs/install.html .

C'est ce que j'ai appris, j'espère que cela vous aidera un peu.


0 commentaires

1
votes

Alors, voici comment je l'ai résolu.

  • Quand la vidéo dit que je dois créer des groupes d'utilisateurs dans le panneau d'administration, ce que j'ai fait.
  • Je devais juste ajouter des propriétés à ce grop.
  • Home › Authentication and Authorization › Groups › customer
  • ajouter des fonctionnalités que l'utilisateur a autorisé à faire comme:
...
accounts customer can view customer
...
  • Ensuite, je me déconnecte de la vue d'administration
  • Je me connecte normalement et tout fonctionne


0 commentaires