Django学习之Auth认证系统_栀椩的博客-程序员秘密

技术标签: 算法、QT开发及web开发等学习笔记  django  

Django学习之Auth认证系统

继续打码学习Django,本次记录的是《Django Web应用开发实战》第10章的内容,主要内容为内置user实现用户管理。

项目创建&应用创建&项目配置

项目创建直接在pycharm中创建Django项目即可,项目应用的创建方式是在pycharm终端输入以下指令:

python manage.py startapp user

其中user就是想要创建的应用名

创建应用后,新建templates和static文件夹,分别用来放置模板文件以及CSS文件。

创建后的项目结构图如下:

项目配置主要是修改settings.py文件,要把项目应用、模板文件和一些静态资源文件添加到Django的运行环境中去,配置如下:

"""
Django settings for MyDjango project.

Generated by 'django-admin startproject' using Django 2.1.2.

For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '#+m+r2vq)0fy2r((-=g4(m3betkfhj7ax5hbwf34v^+fb(kb8g'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'user'
]

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',
]

ROOT_URLCONF = 'MyDjango.urls'

TEMPLATES = [
    {
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
    
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'MyDjango.wsgi.application'

# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

DATABASES = {
    
    'default': {
    
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
    
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
    
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
    
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
    
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

设置路由

随后设置项目路由,分别在MyDjango/urls.py和user/urls.py中添加代码:

# MyDjango/urls.py
from django.urls import path, include
# from django.contrib import admin

urlpatterns = [
    # path('', admin.site.urls),
    path('', include(('user.urls', 'user'), namespace='user')),
]
# user/urls.py
from django.urls import path
from .views import *
urlpatterns = [
	path('login.html', loginView, name='login'),
	path('register.html', registerView, name='register'),
	path('setps.html', setpsView, name='setps'),
	path('logout.html', logoutView, name='logout'),
]

user/urls.py中添加了用户登录、注册、密码修改、注销等功能的路由信息,这些功能将在视图函数中实现。

编写模板文件

在templates文件夹中创建html文件,并添加以下代码作为模板:

<!DOCTYPE html>
<html>
<head>
    {
    % load static %}
	<title>{
    {
     title }}</title>
	<link rel="stylesheet" href="{% static "css/reset.css" %}" />
	<link rel="stylesheet" href="{% static "css/user.css" %}" />
    <script src="{% static "js/jquery.min.js" %}"></script>
    <script src="{% static "js/user.js" %}"></script>
</head>
<body>
<div class="page">
	<div class="loginwarrp">
		<div class="logo">{
    {
     pageTitle }}</div>
        <div class="login_form">
			<form id="Login" name="Login" method="post" action="">
                {
    % csrf_token %}
				<li class="login-item">
					<span>用户名:</span>
					<input type="text" name="username" class="login_input">
                    <span id="count-msg" class="error"></span>
				</li>
				<li class="login-item">
					<span>密 码:</span>
					<input type="password" name="password" class="login_input">
                    <span id="password-msg" class="error"></span>
				</li>
                {
    % if password2 %}
                    <li class="login-item">
                        <span>新密码:</span>
                        <input type="password" name="password2" class="login_input">
                        <span id="password-msg" class="error"></span>
				    </li>
                {
    % endif %}
                <div>{
    {
     tips }}</div>
				<li class="login-sub">
					<input type="submit" name="Submit" value="确定">
				</li>				
           </form>
		</div>
	</div>
</div>
<script type="text/javascript">
	window.onload = function() {
    
		var config = {
    
			vx : 4,
			vy : 4,
			height : 2,
			width : 2,
			count : 100,
			color : "121, 162, 185",
			stroke : "100, 200, 180",
			dist : 6000,
			e_dist : 20000,
			max_conn : 10
		};
		CanvasParticle(config);
	}
</script>
<script src="{% static "js/canvas-particle.js" %}"></script>
</body>
</html>

应当注意的是,原书中{% load static %}写成了{% load staticfiles %},这个写法是有问题的,这是Python2中的写法,Python3中这么写会报错。
讲真,JavaScript我并不熟悉,所以也就看个热闹,大概意思就是写了页面的布局和文本内容吧。

编写视图函数

设置路由的时候介绍到,

user/urls.py中添加了用户登录、注册、密码修改、注销等功能的路由信息,这些功能将在视图函数中实现

现在将在视图函数中添加以下功能:

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

# 用户注册
def registerView(request):
    # 设置模版上下文
    title = '注册'
    pageTitle = '用户注册'
    if request.method == 'POST':
        u = request.POST.get('username', '')
        p = request.POST.get('password', '')
        if User.objects.filter(username=u):
            tips = '用户已存在'
        else:
            d = dict(username=u, password=p, is_staff=1, is_superuser=1)
            user = User.objects.create_user(**d)
            user.save()
            tips = '注册成功,请登录'
    return render(request, 'user.html', locals())

# 用户登录
def loginView(request):
    # 设置模版上下文
    title = '登录'
    pageTitle = '用户登录'
    if request.method == 'POST':
        u = request.POST.get('username', '')
        p = request.POST.get('password', '')
        if User.objects.filter(username=u):
            user = authenticate(username=u, password=p)
            if user:
                if user.is_active:
                    login(request, user)
                return HttpResponse('登录成功')
            else:
                tips = '账号密码错误,请重新输入'
        else:
            tips = '用户不存在,请注册'
    return render(request, 'user.html', locals())

# 修改密码
def setpsView(request):
    # 设置模版上下文
    title = '修改密码'
    pageTitle = '修改密码'
    password2 = True
    if request.method == 'POST':
        u = request.POST.get('username', '')
        p = request.POST.get('password', '')
        p2 = request.POST.get('password2', '')
        if User.objects.filter(username=u):
            user = authenticate(username=u, password=p)
            # 判断用户的账号密码是否正确
            if user:
                user.set_password(p2)
                user.save()
                tips = '密码修改成功'
            else:
                tips = '原始密码不正确'
        else:
            tips = '用户不存在'
    return render(request, 'user.html', locals())

# 使用make_password实现密码修改
from django.contrib.auth.hashers import make_password
def setpsView2(request):
    # 设置模版上下文
    title = '修改密码'
    pageTitle = '修改密码'
    password2 = True
    if request.method == 'POST':
        u = request.POST.get('username', '')
        p = request.POST.get('password', '')
        p2 = request.POST.get('password2', '')
        # 判断用户是否存在
        user = User.objects.filter(username=u)
        if User.objects.filter(username=u):
            user = authenticate(username=u,password=p)
            # 判断用户的账号密码是否正确
            if user:
                # 密码加密处理并保存到数据库
                dj_ps = make_password(p2, None, 'pbkdf2_sha256')
                user.password = dj_ps
                user.save()
            else:
                print('原始密码不正确')
    return render(request, 'user.html', locals())

# 用户注销,退出登录
def logoutView(request):
    logout(request)
    return HttpResponse('注销成功')

视图函数相比模板文件要好理解多了,从上面的代码来看,这个项目用的是FBV视图,也就是函数类视图。

界面展示

完成上面的设置后,总体功能基本上就完成了。运行项目,以修改密码为例,在浏览器中输入以下网址:

http://127.0.0.1:8000/setps.html

即可看到如下界面:

在这里插入图片描述

当然了,这个界面是使用CSS美化过的界面,至于到底是怎么美化的,我也还是一知半解。

总体来说,界面还是比较美观的。但前提是得对CSS有所掌握才行,模板文件中在script标签中加入了CSS的美化文件,博主还没看明白。

总之学习之路还很漫长啊。。。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012848304/article/details/119643075

智能推荐

聊一聊KOA的洋葱模型_willemwei023的博客-程序员秘密

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。其实KOA是什么,相比不用我多说,很多前端的小伙伴都了解...

ES数据迁移记录_maozhandehao的博客-程序员秘密_es 迁移

开发调试是在windows系统上操作的,将es数据从一个服务器迁移到另外一个服务器1.迁移前准备1)环境准备 安装node2)通过安装node安装 elasticdump 操作命令:npm install elasticdump -g3)生产源ES和目标ES能网络访问4)新建一个备份文件夹es_backup2.迁移操作命令:1)进入到安装的elasticdump目录node_modules\elasticdump\bin2)将源ES备份到文件夹中 操作命令:multielasticdump

解决vue中使用ElementUI导航栏重复点菜单出现错误Error: Avoided redundant navigation to current location:的问题_Var_al的博客-程序员秘密

在VUE中使用ElementUI中的导航的时候,默认情况下如果重复点击某选项,会报错,显示是路由重复,虽然说对项目没啥影响,但是看到有红色的bug就想解决有木有。解决方法如下在router.js中加上以下代码// 解决ElementUI导航栏中重复点菜单报错问题 const originalPush = VueRouter.prototype.push VueRouter.prototype.push = function push(location) { return origina

oracle创建一个最简单的表,oracle创建简单的表_榴莲世界的博客-程序员秘密

1)使用规范创建表:create table test(empno number(4)sal number(7,2));2)从子查询创建表:创建表定义,并使用一条语句就可以给表填充行。所有查询都可用作表结构和行的来源。CREATE TABLE [schema.] table as subquery;所有查询都是返回行的二维集合;这个结果保存为新的表。使用子查询创建表的示例:create table...

国际化本地化与编码_brightyuan的博客-程序员秘密_本地化地区和语言编码的意义

1.编码UTF-8 ,GBK, UTF-16LE等UTF8文本头为 EF BB BFUTF16 文本头: unicode big  endian的FE FF;       unicode的FF FE 参考资料ANSI不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码

远程服务器配置python的虚拟环境 与 数据库等[email protected]的博客-程序员秘密

python学习笔记-Pycharm远程连接服务器的Python虚拟环境(Virtualenv)1.拷贝本地代码到远程:scp -r 本地文件路径 [email protected]:远程保存路径scp requirements [email protected]:~/2.连接远程服务:ssh [email protected]先更新 apt 相关源:sudo apt-ge...

随便推点

给VM虚拟机中的CentOS Linux系统挂载U盘的方法图文教程_五师弟的博客-程序员秘密

得到内容的网站地址:http://www.th7.cn/system/lin/201506/108546.shtml

基于Spyder(Python 3.8)网络爬虫东方财经股票数据_tangokaka的博客-程序员秘密_spyder爬虫

基于Python爬取豆瓣电影排行榜单的博主经验,本文将爬取东方股票的某些数据。代码来自网络且基于此稍有改编。

DDF (Diamond Directive File)文件_子曰小玖的博客-程序员秘密_ddf文件怎么打开

已知的 DDF 文件:DDF文件说明.DDF文件属于 Windows 11, 10、Windows 7、Windows 8 / 8.1、Windows Vista、Windows XP 等操作系统中使用的 Settings Files 类别。.DDF 文件与 Microsoft 开发的 Diamond Directive File 关联,采用 Text 格式,并属于 Settings Files 类别。文件格式: .ddf 分类: Diamond Directi...

Mac VMWare Fusion 安装 CentOS 8.2 报错 ‘Section %package does not end with %end‘_Siona_xin的博客-程序员秘密_mac pro 安装centos 失败

一、问题描述在Mac 电脑上使用 VMWare Fusion 安装 CentOS 8.2 虚拟机,一开始就报错。二、原因虚拟机默认加载2个磁盘,把 CD/DVD(IDE) 禁用即可。三、解决方法取消勾选“连接 CD/DVD 驱动器”然后重启虚拟机就可以了。...

SQL Join连接大小表在前在后的重要性(小表在前提高执行效率)_hy_coming的博客-程序员秘密_join大表在前还是小表在前

经常看到一些Hive优化的建议中说当小表与大表做关联时,把小表写在前面,这样可以使Hive的关联速度更快,提到的原因都是说因为小表可以先放到内存中,然后大表的每条记录再去内存中检测,最终完成关联查询。这样的原因看似合理,但是仔细推敲,又站不住脚跟。多小的表算小表?如果所谓的小表在内存中放不下怎么办?我用2个只有几条记录的表做关联查询,这应该算是小表了,在查看reduce的执行日志时依然是有写磁...

Discuz !ML V3.X漏洞复现_Seizerz的博客-程序员秘密

前言:前些天一直在学习新知识,今天抽空做个文档整理,记录下学习情况。废话不多说,正文开始。0X01 漏洞介绍2019年7月11日, Discuz!ML被发现存在一处远程代码执行漏洞,攻击者通过在请求流量的cookie字段中的language参数处插入构造的payload,进行远程代码执行利用,该漏洞利用方式简单,危害性较大。本次漏洞是由于Discuz! ML对于cookie字段的不...

推荐文章

热门文章

相关标签