如何使用@login_required的django消息框架来显示消息

how to use django message framework for @login_required to show message

我在我的大多数视图中都使用@login required 装饰器,所以我想要的是在我的登录页面中使用消息告诉用户如果你想打开该页面你必须先登录所以我如何实现我知道我无法根据我的观点实现这一点,所以任何人都可以做到这一点并且知道该怎么做请告诉我如何实现如果用户因为需要@login而重定向到登录我想显示消息请登录以继续

我还查看了一些与我正在寻找答案相同的问题,这些问题已在所有需要登录的装饰器上实现,因此我不必在所有已在所有需要登录的装饰器中实现的地方更改代码我的整个应用程序

我的登录视图

def my_login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data["username"]
            password = form.cleaned_data["password"]
            remember_me = form.cleaned_data['remember_me']
            user = authenticate(username=username, password=password)
            if user:
                login(request, user)
                if not remember_me:
                    request.session.set_expiry(0)
                    return redirect('accounts:home')
                else:
                    request.session.set_expiry(1209600)
                    return redirect('accounts:home')
            else:
                return redirect('accounts:login')
        else:
            return redirect('accounts:register')
    else:
        form = LoginForm()
        return render(request, "login.html", {'form': form})

基于 this Stack Overflow post,使用多个答案重定向到另一个页面,或者:

在settings.py中设置LOGIN_URL。如果尚未登录的用户尝试登录,Django 将重定向到 URL。

或内联:

from django.contrib.auth.decorators import login_required

@login_required(login_url='/example url you want redirect/') #redirect when user is not logged in
def myview(request):
    do something
    return something #returns when user is logged in

当然,您还需要设置登录视图。

如果你想检查用户是否在 HTML 中通过了身份验证,你可以使用模板系统:(为清楚起见,这是我现在刚刚提出的,它不是来自 Stack Overflow post上面提到的)

{% if user.is_authenticated %}
// Display something if authenticated maybe
{% else %}
// Display something like "You are not logged in etc"
{% endif %}

解决方案 1:

在您的视图中,检查查询参数“next”,就好像用户被重定向到登录视图一样,它会在 URL 中带有 ?next=/whatever。你可以做到

if 'next' in request.GET:
    messages.add_message(request, messages.INFO, 'Hello world.')

解决方案2(不推荐,这会让其他人难以调试):

Python 作为一种动态语言,您可以使用您的版本劫持 login_required 的行为。

在您的 manage.pywsgi.py 中,也许 asgi.py 您需要“猴子补丁” login_required 装饰器。

from django.contrib.auth import decorators

def my_login_required(...):
    # you can look at the implementation in the answer by LvanderRee mentioned in the comments

decorators.login_required = my_login_required

现在,因为这些文件将是 Django 启动之前执行的第一个代码,所以这将用您的版本替换内置 login_required