基于Django用户认证系统详解

下面是关于“基于Django用户认证系统详解”的完整攻略,包含两条示例说明。

什么是Django用户认证系统?

Django用户认证系统是Django框架提供的一个内置模块,它可以帮助我们轻松地实现用户认证、授权和管理等功能。

Django用户认证系统的使用

准备工作

首先,我们需要创建一个Django项目,并且在settings.py文件中将'django.contrib.auth'添加到INSTALLED_APPS中,以启用Django用户认证系统。

INSTALLED_APPS = [
    ...
    'django.contrib.auth',
    ...
]

然后运行以下命令,以创建Django用户认证系统所需的数据表:

python manage.py migrate

注册用户

要在Django用户认证系统中注册用户,我们可以使用以下代码:

from django.contrib.auth.models import User

# 创建一个新用户
user = User.objects.create_user('username', 'email', 'password')

这里的'username'是要注册的用户名,'email'是用户的电子邮件地址,'password'是用户的密码。

用户登录

要在Django用户认证系统中实现用户登录,我们可以使用以下视图函数:

from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect

def user_login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('home')
        else:
            return render(request, 'login.html', {'error': 'Invalid Login Credentials'})
    else:
        return render(request, 'login.html')

这里我们首先使用authenticate()函数来验证用户的用户名和密码是否正确,如果验证通过,我们就使用login()函数将用户登录,并且重定向到home页面,如果验证失败,我们就返回一个包含错误消息的登录页面。

用户登出

要在Django用户认证系统中实现用户注销,我们可以使用以下视图函数:

from django.contrib.auth import logout
from django.shortcuts import render, redirect

def user_logout(request):
    logout(request)
    return redirect('home')

这里我们只需要使用logout()函数将用户登出,并且重定向到home页面。

示例说明

示例1:注册和登录

以下是一个简单的示例,演示如何使用Django用户认证系统进行注册和登录。

  1. 首先,我们创建一个名为“auth_demo”的Django项目,并将'django.contrib.auth'添加到INSTALLED_APPS中。然后运行“python manage.py migrate”命令,以创建Django用户认证系统所需的数据表。

  2. 然后,我们创建一个包含注册和登录视图函数的auth/views.py文件。

from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
from django.contrib.auth.models import User

def user_register(request):
    if request.method == 'POST':
        username = request.POST['username']
        email = request.POST['email']
        password = request.POST['password']
        user = User.objects.create_user(
            username=username,
            email=email,
            password=password
        )
        login(request, user)
        return redirect('home')
    else:
        return render(request, 'register.html')

def user_login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('home')
        else:
            return render(request, 'login.html', {'error': 'Invalid Login Credentials'})
    else:
        return render(request, 'login.html')

def user_logout(request):
    logout(request)
    return redirect('home')
  1. 然后,我们创建一个包含注册和登录表单的auth/templates文件夹,并分别在其中创建register.html和login.html模板文件。以下是register.html模板文件的示例代码:
{% extends 'base.html' %}

{% block content %}
  <form method="post">
    {% csrf_token %}
    <div>
      <label for="username">Username:</label>
      <input type="text" name="username" required>
    </div>
    <div>
      <label for="email">Email:</label>
      <input type="email" name="email" required>
    </div>
    <div>
      <label for="password">Password:</label>
      <input type="password" name="password" required>
    </div>
    <button type="submit">Register</button>
  </form>
{% endblock %}

以下是login.html模板文件的示例代码:

{% extends 'base.html' %}

{% block content %}
  {% if error %}
    <p>{{ error }}</p>
  {% endif %}
  <form method="post">
    {% csrf_token %}
    <div>
      <label for="username">Username:</label>
      <input type="text" name="username" required>
    </div>
    <div>
      <label for="password">Password:</label>
      <input type="password" name="password" required>
    </div>
    <button type="submit">Login</button>
  </form>
{% endblock %}

这里的templates/base.html文件是一个包含网站标题和基本样式的通用模板文件。

  1. 最后,我们创建一个包含home视图函数的auth/views.py文件,并创建home.html模板文件。以下是home视图函数的示例代码:
from django.shortcuts import render

def home(request):
    return render(request, 'home.html')

以下是home.html模板文件的示例代码:

{% extends 'base.html' %}

{% block content %}
  {% if user.is_authenticated %}
    <h2>Welcome, {{ user.username }}</h2>
    <p><a href="{% url 'user_logout' %}">Logout</a></p>
  {% else %}
    <p><a href="{% url 'user_register' %}">Register</a></p>
    <p><a href="{% url 'user_login' %}">Login</a></p>
  {% endif %}
{% endblock %}

这里的{% if user.is_authenticated %}代码块是一个用于检查用户是否已经登录的模板标签。如果用户已经登录,我们就显示一个欢迎消息和一个注销链接,否则就显示一个注册链接和一个登录链接。

示例2:使用装饰器限制访问权限

以下示例演示如何使用装饰器限制用户的访问权限。

  1. 在auth/views.py文件中,我们添加一个叫做“user_only”的装饰器函数。如果用户已经登录,我们就允许他们访问资源,否则就重定向到登录页面。
from django.contrib.auth.decorators import login_required

@login_required(login_url='user_login')
def secret_page(request):
    return render(request, 'secret.html')

这里的@login_required装饰器函数会检查用户是否已经登录。如果用户已经登录,我们就允许他们访问secret_page视图函数,否则就重定向到user_login视图函数。

  1. 然后我们在auth/templates文件夹中创建一个secret.html模板文件。
{% extends 'base.html' %}

{% block content %}
  <h2>Secret Page</h2>
  <p>This is a secret page that only logged in users can access.</p>
{% endblock %}
  1. 最后,我们修改auth/templates/home.html模板文件,添加一个指向secret_page视图函数的链接。
{% extends 'base.html' %}

{% block content %}
  {% if user.is_authenticated %}
    <h2>Welcome, {{ user.username }}</h2>
    <p><a href="{% url 'user_logout' %}">Logout</a></p>
    <p><a href="{% url 'secret_page' %}">Secret Page</a></p>
  {% else %}
    <p><a href="{% url 'user_register' %}">Register</a></p>
    <p><a href="{% url 'user_login' %}">Login</a></p>
  {% endif %}
{% endblock %}

现在,当用户点击“Secret Page”链接时,我们就会检查用户的登录状态,并且将他们重定向到登录页面,如果用户已经登录,我们就允许他们访问secret_page视图函数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Django用户认证系统详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Django3.X使用富文本编辑器kindereditor上传图片时一直转圈圈,如何解决

    问题描述: 在写bbs项目的时候,老师用的是Django1.X结合富文本编辑器kindeditor,实现了图片上传,但是我在用Django3.X的时候,代码和老师一模一样,上传图片的时候一直转圈圈???但是文件夹article_img已经创建,并且图片已经成功上传到服务端。 如下图: 各部分代码截图如下 add_article.html   {% exten…

    2023年4月10日
    00
  • django xadmin多个model的数据渲染在统一个template中

    adminx.py demo class ModelAdmin(object): #…. def get_context(self): context = super(SimCardServicesAdmin, self).get_context() f = context.get(‘form’,None) if f: card_id = f[‘card…

    Django 2023年4月16日
    00
  • django 类视图的使用

    使用django框架也有挺长时间了,但是一直都没有用过django的类视图,因为之前跟着网上教程学习时,觉得类视图是进阶的知识,可能目前还达不到吧 但今天在做项目的时候用到了,感觉真的太方便了吧,而且也没有想象中的那么难或者深奥呀,可能这就是对新知识的恐惧吧,呵呵~也就那样罢了 使用django的类视图首先要在app应用中的views.py文件中导入djan…

    Django 2023年4月9日
    00
  • Django笔记十二之defer、only指定返回字段

    本篇笔记为Django笔记系列之十二,首发于公号【Django笔记】 本篇笔记将介绍查询中的 defer 和 only 两个函数的用法,笔记目录如下: defer only 1、defer defer 的英语单词的意思是 延迟、推迟,我们可以通过将字段作为参数传入,可以达到在获取数据的时候指定不获取该字段数据,常用于一些 textfield 字段上。 假设我…

    2023年4月10日
    00
  • django 框架模型之models常用的Field,及常见错误原因及处理方案。

    1. django 模型models 常用字段          1、models.AutoField          自增列 = int(11)        如果没有的话,默认会生成一个名称为 id 的列        如果要显式的自定义一个自增列,必须设置primary_key=True。   2、models.CharField          …

    Django 2023年4月11日
    00
  • Django在Win7下的安装及创建项目hello word简明教程

    下面我就为你详细讲解“Django在Win7下的安装及创建项目hello word简明教程”的完整攻略。 安装Django 安装Python:下载安装Python 3.x 版本,安装完成后记得勾选“Add Python to PATH”选项。 安装Django:在命令行界面(CMD)输入以下命令进行安装:pip install django 测试是否安装成功…

    Django 2023年5月16日
    00
  • django1.9的static文件配置

    django的static配置查了不少文章,都是复制粘贴的,都没搞定,后来没办法,只能去官网查英文文档。 虽然英文不行,但是能看懂基本的配置信息。照着官方的配置,果然成功了。大致配置如下: 修改setting.py,后面加入 STATIC_URL = ‘/static/’上面那句是写死的,让django能调用静态文件,下面这句是配置静态文件的路径,路径可以填…

    Django 2023年4月13日
    00
  • Pycharm创建Django项目示例实践

    下面为您详细讲解“Pycharm创建Django项目示例实践”的完整攻略。 Pycharm创建Django项目示例实践 环境准备 安装Python环境:首先需要安装最新版Python环境,可以去Python官网下载安装,安装完成后可以在命令行中输入python -V查看Python的版本,如果成功安装,会显示Python的版本号。 安装Pycharm:Pyc…

    Django 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部