django实现登录和登录的鉴权

这篇具有很好参考价值的文章主要介绍了django实现登录和登录的鉴权。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、创建数据库的管理员表

在models.py 中定义admin表,为了简单,表里只有用户名和密码还有默认加的id 三个字段

from django.db import models

# Create your models here.

class Admin(models.Model):
    username = models.CharField(verbose_name="用户名",max_length=16)
    passwd = models.CharField(verbose_name="密码",max_length=64)

执行创建表的语句

py -3 manage.py makemigrations
py -3 manage.py migrate

然后自己手动插入一些用户

2、登录界面和登录视图

在urls.py中加入路径

from django.urls import path
from app01.views import user,depart,pretty,admin,account

urlpatterns = [
    #path('admin/', admin.site.urls),
    path('depart/list/', depart.depart_list),
    path('depart/add/', depart.depart_add),
    path('depart/delete/', depart.depart_delete),
    #http://127.0.0.1:8000/depart/2/edit/
    path('depart/<int:nid>/edit/', depart.depart_edit),

    path('user/list/', user.user_list),
    path('user/add/', user.user_add),
    path('user/<int:nid>/edit/', user.user_edit),
    path('user/<int:nid>/delete/', user.user_delete),

    path('pretty/list/', pretty.pretty_list),
    path('pretty/add/', pretty.pretty_add),
    path('pretty/<int:nid>/edit/', pretty.pretty_edit),
    path('pretty/<int:nid>/delete/', pretty.pretty_delete),

    path('admin/add/', admin.admin_add),
    path('admin/list/', admin.admin_list),
    path('admin/<int:nid>/edit/',admin.admin_edit),

    path('login/account/',account.login),      #这个是登录的
]

在写登录的视图函数account.py
我把不同模块的视图函数拆分了,不同功能模块的一个py文件,在app01目录下创建目录views, 在views目录下分类写视图函数,主要要把原始的views.py文件删除
登录使用的Form组件
获取到用户输入的数据后要对数据进行校验,根数据库里面的值
再有如果验证通过要request.session 通过这个生成session, django会自动处理,生成一个session保存到数据库,并把这个session返回给浏览器。

from django.shortcuts import render,redirect
from django import forms
from app01.utils.encrypt import md5
from app01 import models


class LoginForm(forms.Form):
    username = forms.CharField(
        label="用户名",
        widget=forms.TextInput,
        required=True,
    )
    passwd = forms.CharField(
        label="密码",
        widget=forms.PasswordInput(render_value=True),
        required=True
    )
    # 这个init方式是给自己加样式的
    def __init__(self, *args,**kwargs):
        super().__init__(*args,**kwargs)

        for name ,field in self.fields.items():
            #字段中有属性,保留原来的属性,没有属性,才增加
            if field.widget.attrs:
                field.widget.attrs["class"] = "form-control"
                field.widget.attrs["placeholder"] = field.label
            else:
                field.widget.attrs = {"class":"form-control"}


def login(request):
    """用户登录"""
    if request.method == 'GET':
        form = LoginForm()
        return render(request,'login.html',{'form':form})

    form = LoginForm(data=request.POST)
    if form.is_valid():
        #print(form.cleaned_data)   #获取到的值是一个字典{'username': 'root', 'passwd': '1234'}
        #校验数据库的用户名和密码
        admin_object = models.Admin.objects.filter(**form.cleaned_data).first()
        if not admin_object:
            form.add_error('passwd','用户名或密码错误')
            return render(request,'login.html',{'form':form})
        #用户名和密码正确
        #网站生成随机字符串; 写到用户浏览器的cookie中,再写入到session中
        request.session['info'] = {'id':admin_object.id,'name':admin_object.username}
        return redirect('/admin/list/')
    return render(request,'login.html',{'form':form})

login.html 的内容

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}">
    <style>
        .account {
            width: 400px;
            border-radius: 5px;
            border: 1px solid #dddddd;
            box-shadow: 5px 5px 20px #aaa;

            margin-left: auto;
            margin-right: auto;
            margin-top: 100px;
            padding: 20px 40px;
        }
        .account h2 {
            margin-top: 10px;
            text-align: center;
        }
    </style>
</head>
<body>
<div class="account">
    <h2>用户登录</h2>
      <form  method="post" novalidate>
          {% csrf_token %}
                    {% for field in form %}
                      <div class="form-group">
                        <label >{{ field.label }}</label>
                        {{ field }}
                      <span style="color:red">{{ field.errors.0 }}</span>
                      </div>
          {% endfor %}
          <button type="submit" class="btn btn-primary">提交</button>
      </form>

</div>

<script src="{% static 'js/jquery-3.7.0.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script>
</body>
</html>

3、中间件实现登录鉴权

在开始我们写了一个功能后,把django项目运行起来,直接方法url就能访问到了,正常来说是只有登录后的用户才能访问到,django中给我们提供了中间件,可以通过中间件来实现鉴权

django实现登录和登录的鉴权,python,django,sqlite,数据库
在django 中可以定义多个中间件,中间件就是一个类,类里面定义有两个函数一个是process_request进入的,穿过所有的中间件到达视图函数,视图函数返回结果通过process_response函数返回给浏览器

  • 定义中间件
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect

class AuthMiddleWare(MiddlewareMixin):
    """中间件判断是否登录"""

    def process_request(self,request):
        # 1、排除那些不需要登录就能访问的页面
        # request.path_info  获取当前用户请求的URL  ru /login/account/
        if request.path_info == '/login/account/':
            return
        # 2、读取当前访问的用户的session信息,如果能读到,说明以登录过,就可以继续向后走
        info_dict = request.session.get("info")
        if info_dict:
            return
        # 3、没有登录过,重新回到登录页面
        return redirect('/login/account/')

  • 使用中间件,在settings.py中注册中间件
    会按这个顺序执行,中间件定义好后,会自动调佣
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'app01.middleware.auth.AuthMiddleWare',
]

中间件添加好后,你再没有登录的情况下去访问http://127.0.0.1:8000/user/list/ 这些页面会自动跳转到登录界面。文章来源地址https://www.toymoban.com/news/detail-638991.html

到了这里,关于django实现登录和登录的鉴权的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 搞懂K8s的鉴权

    作者:陈亦帅,中国移动云能力中心软件研发工程师,专注于云原生、微服务、算力网络等 本文介绍K8s中的鉴权模块。对其4种鉴权模式都进行了概述讲解。结合例子着重对大家日常中使用最多的RBAC鉴权模式进行了说明。 《搞懂K8s认证》中,我们提到不论是通过kubectl客户端

    2024年02月21日
    浏览(48)
  • Unity 制作登录功能02-创建和链接数据库(SQlite)

    在Unity开发游戏时使用SQLite有多种原因,以下是其中一些主要原因: 嵌入式数据库:SQLite是一个嵌入式数据库引擎,这意味着它不需要单独的服务器进程。这使得使用SQLite非常方便,并且可以轻松地在不同的平台和操作系统上使用。 易于使用:SQLite易于学习和使用,具有简洁

    2024年02月04日
    浏览(56)
  • nacos添加权限控制的鉴权功能

    nacos如果使用权限控制的鉴权功能,需要在配置文件添加特定参数,我这边是k8s部署的,需要在k8s yaml文件中添加如下参数才能使用权限控制的鉴权功能: 如果是非docker和k8s环境的,可以直接修改application.properties文件: 开启鉴权之后,application.properties中的配置信息为: 鉴权

    2024年02月16日
    浏览(62)
  • [Python+Django]Web学生信息管理系统数据库设计及系统实现

    本文我们完成数据的设计,并通过Django框架完成数据库构建同时利用Django框架模式实现学生信息管理系统的功能。 简单的包装下毕设应该没问题了。 Python,Mysql,Pycharm的安装本文就不做特别介绍了,有需要的同学请参考如下博文。 Python + Django4 搭建个人博客(二):准备开

    2024年02月03日
    浏览(65)
  • Python数据库模块(sqlite3,SQLite3)

    创建数据库:在控制台sqlite3 name sqlite3.connect(database [,timeout ,other optional arguments]) 打开数据库;如果指数据库存在则返回一个连接对象,如果不存在则会创建一个数据库; connection.cursor() 创建一个cursor; cursor.execute(sql) 执行一个sql语句,该语句可以被参数化; connection.execut

    2024年03月19日
    浏览(61)
  • python在Django中,如何使用MySQL数据库进行分页怎么实现

    在Django中,使用MySQL数据库进行分页是一个相对简单的任务。Django的ORM提供了内置的分页功能,你只需要使用Paginator类即可。以下是一个基本的示例,展示了如何在Django中使用MySQL进行分页: 首先,确保你已经安装了Django和MySQL,并且已经配置了Django项目以使用MySQL数据库。

    2024年04月29日
    浏览(47)
  • AndroidStudio-实现登录界面(数据存储在SQLite)

      要求:每种错误信息采用Toast进行提示 (1)未注册的用户不能进行登录; (2)用户名和密码不能为空; (3)用户名不能重复; 一、创建新工程  点击next 修改名字 ,language看自己情况修改,sdk最好选21,这样21之后的都可以用,location自己改,点击finish 点击左上角的And

    2024年02月03日
    浏览(36)
  • SQLite数据库实现数据增删改查

    当前文章介绍的设计的主要功能是利用 SQLite 数据库实现宠物投喂器上传数据的存储,并且支持数据的增删改查操作。其中,宠物投喂器上传的数据包括投喂间隔时间、水温、剩余重量等参数。 实现功能: 创建 SQLite 数据库表,用于存储宠物投喂器上传的数据。 实现对数据库

    2024年02月12日
    浏览(59)
  • sqlite3数据库的实现

    sqlite3代码实现数据库的插入、删除、修改、退出功能

    2024年02月12日
    浏览(62)
  • 使用Python进行数据库连接与操作SQLite和MySQL【第144篇—SQLite和MySQL】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在现代应用程序开发中,与数据库进行交互是至关重要的一环。Python提供了强大的库来连接和操作各种类型的数据库,其中包括SQLite和MySQL。

    2024年03月27日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包