SQLite能运行,但迁移到PostgreSQL的数据库导致错误- Django 3.0

4

情况

我已经使用Django 3.0、PostgreSQL 11和macOS创建了一个含有几个应用的项目。我基于course创建了账户应用,它的github。然后我创建了一个认证应用acc。所有这些都在SQLite数据库中完成。之前我试过使用PostgreSQL数据库,并且早期的应用程序可以正常工作。但是现在,当我在settings.py文件中将SQLite切换到PostgreSQL时,如果尝试登录,就会出现错误。如果我将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

错误

如果我在使用 PostgreSQL 的 settings.py 文件时登录,就会出现问题。如果我退出登录,一切都恢复正常。如果我使用 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,如果我使用它,整个事情也可以为我工作,但我想让它与PostgreSQL一起工作。
  2. 我有数据和表在两个数据库中,但PostgreSQL用于一些旧的员工,而SQLite用于所有内容。
    • 我尝试使用此指南SQLite迁移到PostgreSQL
    • 我成功创建了一个SQLite数据库的副本
    • 但当我将设置更改为postgres并尝试python manage.py migrate时,它会显示运行迁移:无需应用任何迁移。
    • python manage.py loaddata db.json
    • 用户已从SQLite迁移(我可以使用它们登录并像仅有的SQLite用户一样获得错误,如果我输错了用户名或密码,它不会让我进入),但是如果我使用IDE查看,则在Postgresql中看不到任何数据表。
  3. 我在论坛上与其他人交谈过,许多人说装饰器文件有问题,但它只在数据库切换时发生。
  4. 我创建了一个新的postgresql数据库,并尝试迁移所有内容(迁移未迁移所有内容)。然后我尝试使用新帐户注册,填写表单并按提交按钮后,它给了我以下错误消息
DoesNotExist at /register/
Group matching query does not exist.
  1. 我也像课程导师一样创建了一个AWS RDS postgreSQL数据库,并将其迁移并连接到服务器和设置中,但我仍然遇到了相同的错误。
  2. 我还查看了用户组权限,并且源代码SQLight数据库在管理员选项卡中没有分配任何权限,与我的postgresql相同。
  3. 创建了一个全新的Django 3项目,全新的虚拟环境0,我只是从之前的项目中复制了所有内容作为文本,从之前的数据库中迁移了所有内容,但我仍然遇到了相同的错误。

1
你确定你是在Django管理界面手动创建用户组,然后分配给用户的吗? - Muhammed Mahir
我不知道其他的方法,所以我不确定。 - sogu
1
不是反过来。我指的是“allowed_users”函数。基本上,它期望组内有角色,根据视频,这些角色可以是员工、管理员或任何人。所以你是否已经在Django管理中创建了组的角色? - Muhammed Mahir
1
无论如何,我已经尝试在Postgres和SQL中运行您的代码,对我来说完全正常。 - Muhammed Mahir
1
我有同样的问题,你调试了吗? - Dinindu Theekshana
显示剩余3条评论
4个回答

4

我不确定是否能够帮到你,但我使用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

这就是我学到的,希望它能对你有所帮助。


谢谢你,保罗。愿上帝保佑你!正如你所说,你解决了我的问题,问题确实是与数据库的连接有关。 - Majali

3

以下是我的解决方案。

  • 当视频要我在管理面板中创建用户组时,我做到了。
  • 我只需要向该组添加属性即可。
  • 主页 › 认证与授权 › 组 › 客户
  • 添加用户允许执行的功能,例如:
...
accounts customer can view customer
...
  • 然后我从管理员视图注销
  • 以正常方式登录,一切正常工作

3

我只想修复这个 bug,然后基本上就完成了。我不想删除整个身份验证应用程序,并使用我从未听说过的全新库进行操作。但是将来可能会在其他项目中使用它。 - sogu

3

可能存在的问题是,您的PostgreSQL中没有任何组。因此,请跳过这些装饰器并向您的PostgreSQL数据库添加一些组。然后使用这些装饰器。


正如我在“尝试解决”部分的评论中提到的那样,“我遵循的指南创建了用户组,在我迁移的PostgreSQL数据库中也做了同样的事情”。 - sogu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接