如何在Django视图函数内部条件使用login_required装饰器
Django 条件登录需求实现方案
你不需要拷贝login_required或user_passes_test的源码,Django本身提供了两种简洁的复用原生能力的实现方式:
方案1:直接调用原生redirect_to_login工具函数(更轻量)
redirect_to_login是login_required装饰器内部用来生成登录跳转响应的官方公共API,直接调用即可完美复用原生逻辑,自动处理登录后回跳的next参数:
from django.contrib.auth import redirect_to_login def my_view(request): val = request.GET.get('val') if val: # 未登录时触发登录跳转 if not request.user.is_authenticated: # 传入当前完整路径作为登录后跳转的目标地址,参数会自动完整保留 return redirect_to_login(request.get_full_path()) # 登录成功后的后续业务逻辑 # ... else: # 无需登录,展示参数采集表单 # ... 表单相关逻辑
该方案的优势:
- 完全复用Django原生实现,无冗余代码
- 自动保留当前请求的所有GET参数,登录后会自动跳转回带
val参数的当前页面 - 逻辑直观,无额外封装成本
方案2:拆分登录后逻辑,直接调用login_required装饰后的视图
如果你需要复用login_required的全部能力(比如自定义登录地址、跳转参数名等配置),可以把需要登录的逻辑抽成单独的子视图,直接在分支中调用装饰后的子视图即可:
from django.contrib.auth.decorators import login_required def my_view(request): val = request.GET.get('val') if val: # 直接调用被login_required装饰的子视图 return _my_view_authenticated_handler(request) else: # 展示参数采集表单 # ... @login_required def _my_view_authenticated_handler(request): # 此处已自动完成登录校验,直接处理业务逻辑即可 val = request.GET['val'] # ... 后续业务逻辑
内容的提问来源于stack exchange,提问作者dfrankow
相关产品推荐
相关产品推荐

