python - Login_required Django 装饰器

标签 python django

我想将 login_required 与基于函数的 View 一起使用。我浏览了 Django's official docs of django.contrib.auth.decorators.login_required 。我无法清楚地捕获它。

问题是,即使用户已经通过身份验证,控件也会返回到登录功能,而不是转到主页。 还需要进行哪些更改才能允许使用我的代码登录?

def login(request):
    """
    """
    data_dict = {}
    if request.POST:
        req_dict = dict(zip(request.POST.keys(), request.POST.values()))
        accmgr = AccountManager()
        user = accmgr.validate_user(**req_dict) 
        if user:
            ret = redirect('homepage')
        else:
            data_dict["msg"] = "Username  or password is incorrect!"
            ret =  render(request, "login.html", data_dict)
    else:
        ret =  render(request, "login.html", data_dict)
    return ret

@login_required(login_url='/login')
def homepage(request):
    '''
    '''
    return render(request, "adminpage.html", {"title":"Hello World"})

注意:accmgr.validate_user内部检查user.is_authenticated。我还必须执行一些其他检查才能允许用户添加自定义功能。

还在settings.py中添加了LOGIN_URL

LOGIN_URL ='/login/'

最佳答案

login_required 装饰器检查 request.user.is_authenticated() 是否返回 True。问题可能是,accmgr.validate_user 方法并没有真正对用户进行身份验证。

您应该调用authenticate()相反,实际登录用户。

from django.contrib.auth import login as django_login
from django.contrib.auth import authenticate

def login(request):
    ...
    req_dict = request.POST.copy()
    user = authenticate(
        username=req_dict['username'], password=req_dict['password'])

    if user:
        django_login(request, user)
    ...

请参阅documentation了解更多信息。

关于python - Login_required Django 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32346446/

相关文章:

python - 使用 Tensorflow 的 tf.io.gfile.exists 检查文件路径是否存在

python - Django:处理导入数据库的迁移?

django - 在 django-admin 页面中禁用 django 上下文处理器

python - 从 "mysite.app"中的 INSTALLED_APPS 中删除 mysite 前缀可以防止双重导入,为什么?

python - Flink Python API 错误

python - 如何使用另一列的 last_valid_index() 将 pandas 数据帧设置为 NaN

python - 无法创建循环来从网页获取所有标题

Python 以一种棘手的方式连接列表元素

django - Redis 获取大字符串的速度很慢

Django REST 框架 - 多个模型/API?