Django学习之Auth认证系统

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文件,并添加以下代码作为模板:

扫描二维码关注公众号,回复: 13459948 查看本文章
<!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的美化文件,博主还没看明白。

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

猜你喜欢

转载自blog.csdn.net/u012848304/article/details/119643075