首页 > 其他分享 >Django 之login_required的知识点

Django 之login_required的知识点

时间:2023-08-19 23:14:19浏览次数:35  
标签:知识点 required request captcha key import login

Django 之login_required的知识点

在进行页面登录验证优化时,想到了用户验证登录和登出及限流功能,在添加用户登录调用@login_required时,访问/login自动跳转到/accounts/login/,这个路由又没有定义就是显示404状态码。

作为一个新入门的学习者首先是排查路由配置、视图、去掉验证@login_required验证发现是@login_required的跳转定义问题,在没有定义的情况下默认跳转路径就是/accounts/login/,这下就破案了。

接下来,就是找解决方案,搜一下@login_required验证失败重定向的配置即可。

路由配置

from django.contrib import admin
from django.urls import path, include
from myapp.views import *

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', login_view, name='login'),
    path('logout/', user_logout, name='logout'),
    path('captcha/', include('captcha.urls')),
    path('upload/', upload_file, name='upload'),
]

视图配置

from django.contrib import messages
from captcha.models import CaptchaStore
from captcha.helpers import captcha_image_url
from django.shortcuts import redirect

#添加用户登录视图和注销视图:
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login, logout

import paramiko
import tempfile

def login_view(request):
  if request.method == 'POST':
    username = request.POST.get('username')
    password = request.POST.get('password')
    captcha_solution = request.POST.get('captcha_solution')
    captcha_key = request.POST.get('captcha_key')

    # 验证码校验
    if captcha_key and captcha_solution:
      if not CaptchaStore.objects.filter(response=captcha_solution, hashkey=captcha_key).exists():
        messages.error(request, '验证码错误')
        return redirect('login')

    # 身份验证
    user = authenticate(request, username=username, password=password)
    if user:
      login(request, user)
      return redirect('upload')
    else:
      messages.error(request, '用户名或密码错误')
      return redirect('login')

  new_key = CaptchaStore.generate_key()
  image_url = captcha_image_url(new_key)

  return render(request, 'login.html', {'key': new_key, 'image_url': image_url})


@login_required
def user_logout(request):
    logout(request)
    messages.info(request,'退出登录')
    return redirect('login')

#定义限流装饰器
from django.core.cache import cache
from django.http import HttpResponseForbidden

def rate_limit(limit_count):
    def decorator(view_func):
        def wrapper(request, *args, **kwargs):
            # 获取当前用户
            user = request.user

            # 检查该用户的访问次数
            cache_key = f'rate_limit:{user.username}'
            access_count = cache.get(cache_key, 0)

            # 如果访问次数超过限制,返回 403 Forbidden
            if access_count >= limit_count:
                # logging.error('用户 {}  查看上传文件列表失败'.format(request.user.username, datetime.now()))
                return HttpResponseForbidden('访问次数超过限制')

            # 增加访问次数并设置缓存时间为 1 分钟
            cache.set(cache_key, access_count + 1, 60)

            # 继续执行视图函数
            return view_func(request, *args, **kwargs)

        return wrapper

    return decorator

#上传视图
@login_required
def upload_file(request):
    if request.method == 'POST':
        file = request.FILES.get('file')
        if file:
            # 连接远程服务器
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            # ssh.connect('remote_server_ip', username='username', password='password')
            ssh.connect('10.0.0.127', username='root', password='123456')


            try:
                # 创建临时文件
                with tempfile.NamedTemporaryFile(delete=False) as temp_file:
                    # 将上传的文件内容写入临时文件
                    for chunk in file.chunks():
                        temp_file.write(chunk)
                    temp_file.seek(0)  # 将文件指针移动到文件开头

                    # 上传临时文件到远程服务器的/data目录
                    sftp = ssh.open_sftp()
                    #使用用户密码/秘钥连接
                    sftp.putfo(temp_file, '/home/yunwei/apache-jmeter-5.5/ProCase/scrpit/' + file.name)

                    sftp.close()
                    ssh.close()

                messages.success(request, '文件上传成功')
                return redirect('upload')  # 重定向到上传页面
            except Exception as e:
                messages.error(request, '文件上传失败:{}'.format(str(e)))
        else:
            messages.error(request, '请选择要上传的文件')

    return render(request, 'upload.html')

 

 

解决方案

在Django中,可以使用login_required装饰器来对视图函数进行登录验证。当用户没有登录时,装饰器会将用户重定向到默认的登录页面或者自定义的登录页面。

默认情况下,Django的login_required装饰器会将用户重定向到名为/accounts/login/的URL。如果你希望自定义登录跳转的URL,你可以在项目中进行相关配置。

首先,你需要在项目的URL配置文件(通常是urls.py)中定义一个URL来处理登录验证失败重定向的请求

from django.urls import path

from django.contrib.auth.views import LoginView

urlpatterns = [
    path('my-login/', LoginView.as_view(), name='my_login'),
    # other URLs
]

my-login/路由将被用于处理登录验证失败的跳转请求。LoginView是Django内置的登录视图,它会自动渲染一个登录页面。

接下来,你需要告诉Django在登录验证失败时应该重定向到哪个URL。你可以在项目的设置文件(通常是settings.py)中添加以下配置:

LOGIN_URL = '/my-login/'

在这个配置中,LOGIN_URL设置为/my-login/,即登录验证失败时应该重定向到my-login/路由。

通过以上配置,当使用login_required装饰器的视图函数登录验证失败时,用户将被重定向到my-login/路由,即自定义的登录页面。

请注意,login_required装饰器需要和Django的认证系统一起工作。你需要在项目中启用认证系统并配置相关认证后端和用户模型。

 

访问验证

 

 

 

 

标签:知识点,required,request,captcha,key,import,login
From: https://www.cnblogs.com/weiweirui/p/17643392.html

相关文章

  • spring配合hibernate报错:sessionFactory or hibernateTemplate is required
    Causedby:java.lang.IllegalArgumentException:'sessionFactory'or'hibernateTemplate'isrequired atorg.springframework.orm.hibernate3.support.HibernateDaoSupport.checkDaoConfig(HibernateDaoSupport.java:118) atorg.springframework.......
  • 解决小程序报错 getLocation:fail the api need to be declared in the requiredPriva
    一、unipp项目打开uniapp项目的配置文件manifest.json,选择“源码视图”。/*小程序特有相关*/"mp-weixin":{"appid":"你的开发者id","setting":{"urlCheck":true,"es6":true,"postcss":......
  • 【数学】高中数学必考立体几何知识点汇总,附8大解题技巧!
    立体几何必考知识汇总一空间几何体结构1.空间结合体:如果我们只考虑物体占用空间部分的形状和大小,而不考虑其它因素,那么由这些物体抽象出来的空间图形,就叫做空间几何体。2.棱柱的结构特征:有两个面互相平行,其余各面都是四边形,每相邻两个四边形的公共边互相平行,由这些面围成的图形叫做......
  • MySQL面试题全解析:准备面试所需的关键知识点和实战经验
    MySQL有哪几种数据存储引擎?有什么区别?MySQL支持多种数据存储引擎,其中最常见的是MyISAM和InnoDB引擎。可以通过使用"showengines"命令查看MySQL支持的存储引擎。存储方式:MyISAM引擎将数据和索引分别存储在两个不同的文件中,一个是.MYD文件用于存储数据,一个是.MYI文件用于存储索......
  • 王道408---CO---存储系统知识点
    一、读写信号线一般是两根(如无特殊说明)二、如果DRAM采用复用技术,虽然地址线减半,但需要添加行片选线和列片选线三、SRAM与DRAM1、SRAM是六晶体管MOS(半导体材料),DRAM是电容2、SRAM依靠双稳态电路的两个稳定状态来分别存储0和1,DRAM依靠电容来存储信息四、U盘采用Flash存储技......
  • 动态 DP - 知识点梳理
    DP用于解决多阶段性决策性问题,方法是每个阶段分开转移,各个阶段转移是独立的,不会影响到其他阶段的转移。因此,整个DP的过程其实就是原始数据(即边界)顺次按照阶段转移,最终成为答案。矩阵代表着一种线性变换,矩阵的乘法其实就是变换的合成,所以我们可以将DP每个独立阶段的转移抽象......
  • .NET相关知识点分享一
    第一章.NETCore入门1.NET为什么要跨平台?A.安全考虑(Linux开源)B.成本原因(Windows收费)C.软件生态(服务器软件生态优先在Linux)2.NETFramework和.NETCore的区别?跨平台支持:.NETFramework:最初是为Windows平台设计的,因此只能在Windows操作系统上运行。.NETCore:专注于......
  • Spring 与 Spring MVC 相关知识点回顾整合
    1.Spring框架1.1.Spring框架的作用Spring框架主要解决了创建对象和管理对象的相关问题。通过Spring创建并管理对象,可以使得开发者不再反复关心对象的创建过程,并且,默认情况下,由Spring创建的对象都是单例的,这是非常有必要的!由Spring创建的对象通常称之为SpringBean。由于Sp......
  • C++语言常见知识点
    C++基础变量存在的意义是什么?作用:给一段指定的内存空间起名,方便我们管理操作这块内存。inta=10;常量的两种定义方式1、#definePI3.14 2、constinta=10;用于记录程序中不可更改的数据。标识符的命名规则1、不能是关键字2、只能由字母、下划线、数字构成3、不能数字......
  • C/C++基础知识点——设计原则及设计模式
    如何实现模块间高内聚、低耦合?封装与抽象;添加中间层;模块化;设计思想与原则单一职责;接口隔离原则;依赖倒置;迪米特原则;多用组合少用继承;设计模式:观察者模式设计原则及设计模式六大设计原则:单一职责原则;里氏替换原则;开闭原则;依赖倒置原则;接口隔离原则;最少知识原则。......