首页 > 编程问答 >如何在django项目中设置login_required,我没有使用django inbuild身份验证登录?

如何在django项目中设置login_required,我没有使用django inbuild身份验证登录?

时间:2024-07-29 15:41:39浏览次数:10  
标签:python django login-required

用户无法通过输入任何页面的url进入任何页面 我是否需要更改设置中的任何内容.py

我没有使用 django 内置身份验证进行登录。

view.py 用于登录每个仪表板,

def asset_login(request):
if request.method == 'POST':
    username = request.POST.get('user_id')
    password = request.POST.get('password')
    try:
        user = UserTable.objects.get(username=username, password=password)
        if user:
            if user.status == 'inactive':
                messages.error(request, 'Your account is inactive.')
                return redirect('asset_login')
            request.session['name'] = user.name
            request.session['role'] =user.role
            if user.role == 'admin':
                return redirect('admin_dashboard')
            elif user.role == 'ciso':
                return redirect('ciso_dashboard')
            elif user.role == 'fnhead':
                return redirect('fnhead_dashboard')
            elif user.role == 'systemadmin':
                return redirect('systemadmin_dashboard')
            elif user.role == 'assetowner':
                return redirect('assetowner_dashboard')
            else:
                messages.error(request, 'Unknown user position')
                return redirect('asset_login')  # Redirect to clear form and message
    except UserTable.DoesNotExist:
        messages.error(request, 'Invalid username or password')
        return redirect('asset_login')  # Redirect to clear form and message
return render(request, 'asset.html')

urls.py

urlpatterns = [
path('asset_login/', views.asset_login, name='asset_login'),
path('admins/', views.admin_dashboard, name='admin_dashboard'),
path('assetdb/', views.assetowner_dashboard, name='assetowner_dashboard'),

view.py 用于仪表板

def admin_dashboard(request):
total_users = UserTable.objects.count()
total_assets = AssetTable.objects.count()
total_dept=Department.objects.count()
total_emp=Employee.objects.count()
name = request.session.get('name',None)
role = request.session.get('role', None)
try:
    admin_privileges = adminprivileges.objects.get()
except ObjectDoesNotExist:
    admin_privileges = None
context = {
    'total_users': total_users,
    'total_assets': total_assets,
    'total_dept':total_dept,
    'total_emp':total_emp,
    'name':name,
    'role':role,
    'assetview': admin_privileges.assetview if admin_privileges else False,
    'userview': admin_privileges.userview if admin_privileges else False,
    'employeeview': admin_privileges.employeeview if admin_privileges else False,
    'locationview': admin_privileges.locationview if admin_privileges else False,
    'departmentview': admin_privileges.departmentview if admin_privileges else False,
    'categoryview': admin_privileges.categoryview if admin_privileges else False,
    'rolesview': admin_privileges.rolesview if admin_privileges else False,
    'reportview': admin_privileges.reportview if admin_privileges else False,
    'previlegeedit':admin_privileges.privilegeedit if admin_privileges else False,    
 }
return render(request, 'admin_dashboard.html', context)

用户无法通过输入任何页面的 url 来进入任何页面。

我需要更改设置 .py 中的任何内容吗


可以通过创建自己的装饰器函数,在的 Django 项目中使用 login_required 功能,即使没有使用 Django 的内置身份验证系统。以下是如何操作的方法:

1. 创建一个装饰器函数:

此函数将检查用户是否已登录。如果已登录,则允许访问该视图;否则,则会将其重定向到登录页面。

from django.shortcuts import redirect

def login_required(view_func):
    def wrapper_function(request, *args, **kwargs):
        if 'name' in request.session:  # 检查用户名是否在 session 中
            return view_func(request, *args, **kwargs)
        else:
            return redirect('asset_login')  # 将用户重定向到的登录页面
    return wrapper_function

2. 将装饰器应用于的视图:

使用 @login_required 装饰器来装饰需要登录的任何视图函数。

from django.shortcuts import render
from .decorators import login_required

@login_required
def admin_dashboard(request):
    total_users = UserTable.objects.count()
    # ...(的视图代码的其余部分)
    return render(request, 'admin_dashboard.html', context)

@login_required
def assetowner_dashboard(request):
    # ...(的视图代码)
    return render(request, 'assetowner_dashboard.html')

说明:

  • 该装饰器函数 login_required 检查 request.session 中是否存在 name 键。这是基于的代码,在登录时将 name 存储在 session 中。
  • 如果用户已登录,则装饰器将允许访问原始视图函数。
  • 如果用户未登录,装饰器将把用户重定向到的登录页面(在本例中为 asset_login )。

在 settings.py 中不需要进行任何更改 ,因为没有使用 Django 的内置身份验证系统。

通过使用此方法,可以保护的视图,并确保只有登录用户才能访问它们。

标签:python,django,login-required
From: 78805776

相关文章

  • 如何使用Python AST给表达式a == b添加括号?
    请问,有谁知道如何使用PythonAST在代码中为a==b这样的表达式添加括号?我尝试过重写visit_Compare,但是ast.unparse中的delimit_if自动删除了我添加的括号,因为优先级a==b的值更高。你说的对,直接使用ast.unparse会因为优先级问题导致添加的括号被移除。为了解......
  • 使用 powershell 或 python 从网页列出公司名称
    我希望使用PowerShell或python仅列出URL中的公司名称:https://www.moneycontrol.com/markets/earnings/results-calendar/?activeDate=2024-07-29下面是我的python脚本用于获取网页的结构:importrequestsfrombs4importBeautifulSoup#URLo......
  • T3/A40i支持Linux-5.10新内核啦,Docker、Qt、Python统统升级!
    自2021年创龙科技推出全志国产化率100%的T3/A40i工业核心板后,不到两年时间已超过800家工业客户选择创龙科技T3/A40i平台。随着客户产品的不断升级与迭代,部分“能源电力”、“工业自动化”行业客户对T3/A40i的Linux版本提出了更高要求,主要涉及Docker、Qt、Python等组件特性。秉持......
  • Django 页面不显示任何内容
    我的“新闻”页面无法正常工作,它正在数据库中保存信息,但不显示任何内容。这里是HTML:{%extends'base.html'%}{%blockcontent%}<h1class='product'>News</h1>{%foriteminnew%}<div><br><strong><ahref='/news/{{item.......
  • 使用 Python 中的多处理防止共享内存中的数据损坏?
    我目前正在开发一个多处理Python程序,其中每个进程将其索引作为连续的4字节整数写入共享内存。并且有一个读取器可以在没有任何锁的情况下读取其他进程的索引。因为我没有使用任何同步原语,所以我担心读取器进程可能会由于逐字节写入内存而读取损坏的数据(例如,一个索引的前2个......
  • Python如何统治AI世界?一文读懂它的优势与挑战
    一、Python语言介绍1.1Python语言概述Python是一种由GuidovanRossum于1991年首次发布的高级编程语言。其设计理念强调代码的可读性和简洁性,使其成为了许多开发者的首选语言。Python的语法简洁直观,采用了缩进来定义代码块,这与其他使用花括号或关键词的编程语言不同。Python......
  • 找到一种方法将program1的输出作为python中program2的输入发送
    有人可以帮我找到一种方法将program1的输出作为python中的program2的输入发送将其保存为.csv文件不会对我有帮助,因为该程序应该尽快执行这些任务。因此我正在寻找一种方法将程序1的终端输出直接发送到程序2在Python中,可以使用子进程模块将一个程序的输出发送到另一个程......
  • 同时运行多个Python程序的最佳方法
    我有一个python程序,我想同时运行多个具有不同参数的实例。这些实例彼此之间不进行通信。在单独的终端中运行每个实例太乏味了。我考虑使用多处理模块将每个实例作为单独的进程运行,但是我希望能够随时停止和重新启动某些单独的实例,而不会中断其他正在运行的实例。是否有任何流程......
  • 替换 Python 数据框中包含值的 <
    我有一个数据框,在某些列中存在诸如“<0.5、<10、<100”等值。如果值仅包含“<”,我想将所有这些值替换为0。我该怎么做?我对Python比较陌生。尝试使用pd.DataFrame.replace()。importpandasaspd#创建示例数据框df=pd.DataFrame({'A':['<0.5','<10',15,20],......
  • 基于funasr+pyaudio实现电脑本地麦克风实时语音识别项目语音转文本python实现
    【框架地址】https://github.com/modelscope/FunASR【简单介绍】FunASR是一个功能全面的语音识别工具包,支持多种预训练模型的推理和微调,提供高精度和高效能的语音识别服务。结合PyAudio库,可以实现电脑本地麦克风实时语音识别项目。该项目首先通过PyAudio库捕获麦克风输入的......