django - 如何在 django 中创建自定义登录装饰器

标签 django django-rest-framework decorator

我正在 django 中创建一个应用程序,其中所有身份验证(例如登录注册)都是通过使用外部 REST API 完成的,因此其中不涉及数据库。这就是为什么我在 request.session 中保存登录的用户数据,现在的问题是,如果用户不在 session 中,我不想显示某些页面,我们通常在 django 应用程序中做的是使用 @login_required装饰器,但现在由于没有数据库,那么不向未登录用户显示这些页面的过程是什么。谢谢

最佳答案

您可以定义一个装饰器,它将在 request.sessions 中查找键:

# <i>app_name</i>/decorators.py

from django.shortcuts import redirect
from functools import wraps

def session_login_required(function=None, session_key='user'):
    def decorator(view_func):
        @wraps(view_func)
        def f(request, *args, **kwargs):
            if <b>session_key in request.session</b>:
                return view_func(request, *args, **kwargs)
            return redirect('<em>name-of-login-view</em>')
        return f
    if function is not None:
        return decorator(function)
    return decorator

这里它将检查'user'是否是request.session中的键。您当然可以将其更改为不同的 key 。

然后我们对这些 View 使用装饰器:

# app_name/views.py

from app_name.decorators import <strong>session_login_required</strong>

<strong>@session_login_required</strong>
def my_view(request, some, parameters):
    # …

关于django - 如何在 django 中创建自定义登录装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71192349/

相关文章:

django-rest defaultRouter 不添加@action

c# - 多接口(interface)装饰器——Autofac 中的循环依赖之谜

javascript - 带有属性装饰器的 TypeScript 类就像静态的一样

PHP 相当于 python 装饰器?

python - 将 Django 从 1.1 升级到 1.2

django - django 的模型 get_or_create 方法不应该包含在事务中吗?

django - 为什么 Django 模型信号不起作用?

django - 获取序列化器中字段的属性(django rest 框架)

django - 如何用django模型制作follower-following系统

python - Django 注销 URL 重定向问题