首页 > 解决方案 > SQLite 工作,但 PostgreSQL 迁移数据库导致错误 - Django 3.0

问题描述

情况

装饰器.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

错误

如果我在 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 相同的错误。
    • 这是视频底部的建议
    • “USER1我找到了,我忘记更改用户组了!
    • --> USER2 转到管理面板,然后在您的用户部分中,在所选组部分中添加客户”。
    • 我已经完全做到了,但它没有起作用,唯一的区别是我使用了迁移的 postgresql,他们使用了原始的 SQLight .
  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. 我在论坛上与其他人交谈过,但很多人说这是有问题的装饰器文件,但它只发生在数据库切换时。
  4. 我创建了一个新的 postgresql 数据库,并尝试迁移所有内容(迁移尚未迁移所有内容)。比我尝试使用新帐户注册时,它在填写表单按下提交后给了我以下错误消息
DoesNotExist at /register/
Group matching query does not exist.
  1. 我还像课程负责人一样创建了一个 AWS RDS postgreSQL 数据库,将其迁移并连接到服务器和设置中,但我仍然遇到同样的错误。
  2. 我也查看了用户组权限,并且源代码 SQLight 数据库在管理选项卡中没有给出与我的 postgresql 相同的权限
  3. 创建了一个全新的 Django 3 项目,全新的虚拟环境 0 我只复制了上一个项目中的所有内容作为文本,从以前的数据库中迁移了所有内容,我得到了同样的错误

标签: pythondjangopostgresqlsqlitedecorator

解决方案


不确定我能帮忙,但我有一台 Mac,使用 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 没有从您的数据库中接收数据。

我曾经在我的 Mac 上遇到过不同版本的 PostgreSQL 的问题。您可以签入 /Library/PostgreSQL,我有两个目录(11 和 12),所以我必须小心我将哪个目录用于我的项目。在 PgAdmin 中,您可以看到这两个版本。如果您有旧版本或想要重新安装 PostgreSQL(这非常激烈,但会给您一张干净的床单),这里有一本很好的手册:https ://medium.com/@zoefhall/effectively-uninstall-and-reinstall- psql-with-homebrew-on-osx-fabbc45c5d9d。您可以通过输入 Shell 来检查 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。但是如果你想在你的 Mac 上安装一个特定版本的 PostgreSQL,那么你需要将 pg_config 文件放在你的 PATH 中,参见https://www.psycopg.org/docs/install.html

这就是我学到的,希望对你有一点帮助。


推荐阅读