Django---用户登陆注册系统的实现(一)

Django---用户登陆注册系统的实现(一)

  • 1 搭建项目环境
  • 2 设计数据库模型
  • 3 路由与视图函数框架搭建
  • 4 session会话与登录的视图函数

1 搭建项目环境

(1)创建项目
Django---用户登陆注册系统的实现(一)_第1张图片

(2)创建app:

python manage.py startapp login
  • 设置语言和时区:

Django---用户登陆注册系统的实现(一)_第2张图片
(3)数据库表生成

  • 将迁移脚本的内容写入数据库并创建数据库表:
  python manage.py migrate
  • 创建后台登录的超级用户:
 python manage.py createsuperuser

(3)启动开发服务器

  • 方法一(终端):python manage.py runserver
  • 方法二:配置Django Server

Django---用户登陆注册系统的实现(一)_第3张图片

Django---用户登陆注册系统的实现(一)_第4张图片

(4)测试:

Django---用户登陆注册系统的实现(一)_第5张图片

Django---用户登陆注册系统的实现(一)_第6张图片
git提交项目代码到本地仓库

安装插件
Django---用户登陆注册系统的实现(一)_第7张图片

Django---用户登陆注册系统的实现(一)_第8张图片

Django---用户登陆注册系统的实现(一)_第9张图片

git commit -m loginregist1
git init # 安装插件.ignore, 并生成python上传git项目需要忽略内容的文件.gitignore  git add *  # 添加修改到暂存区
git commit -m "搭建项目开发环境" # 将暂存区的代码提交到本地git仓库  
git log # 查看历史提交记录

2 设计数据库模型

(1)作为一个用户登录和注册项目,需要保存的都是各种用户的相关信息。需要一张用户表User,在用户表里需要保存下面的信息:

用户名(name): 必填,最长不超过128个字符且唯一(unique)
密码(password): 必填,最长不超过256个字符
邮箱地址(email): 使用Django内置的邮箱类型且唯一
性别(gender): 性别, 使用choice,只能选择男或者女或者未知,默认为未知;
创建时间(create_time): 用户创建时间
注意点: auto_now_add=True时为添加时的时间,更新对象时不会有变动。
$ git init # 安装插件.ignore, 并生成python上传git项目需要忽略内容的文件.gitignore $ git add * # 添加修改到暂存区 $ git commit -m "搭建项目开发环境" # 将暂存区的代码提交到本地git仓库 $ git log # 查看历史提交记录
修改时间(modify_time):用户最后一次修改时间
注意点: auto_now=True无论是你添加还是修改对象,时间为你添加或者修改的时间。
最后一次登录时间(last_login_time): 最后一次登录时间
注意点:null=True的话,数据库中该字段是NULL,即允许空值
注意点:blank=False(默认)的话,字段没被赋值则会抛错;和数据验证(表单验证等)有
关.

(2)编辑文件:login/models.py

from django.db import models

# Create your models here.
class SiteUser(models.Model):
    gender_choice=(
        (0,"未知"),
        (1,"男"),
        (2,"女"),
    )

    "用户的数据库模型,注册登录需要"
    name=models.CharField(max_length=128,unique=True,verbose_name="用户名")
    ## unique=True,名字唯一
    password=models.CharField(max_length=256,verbose_name="密码")
    email=models.EmailField(unique=True,verbose_name="电子邮箱")
    gender=models.IntegerField(choices=gender_choice,default=0,verbose_name="性别")
    # auto_now_add=True为添加时间,更新对象时不会有变化
    create_time=models.DateTimeField(auto_now_add=True,verbose_name="创建时间")
    modify_time=models.DateTimeField(auto_now=True,verbose_name="最后一次修改的时间")
    # null针对数据库层面,blank针对表单的
    last_login_time=models.DateTimeField(null=True,blank=True,verbose_name="最后一次登陆的时间")
    def __str__(self):
        return self.name
    class Meta:
        verbose_name="网站用户管理"
        verbose_name_plural=verbose_name

(2)注册app:loginRegister/settings.py
Django---用户登陆注册系统的实现(一)_第10张图片
(3)生成迁移脚本,并写入数据库

python manage.py makemigrations
python manage.py migrate

Django---用户登陆注册系统的实现(一)_第11张图片
Django---用户登陆注册系统的实现(一)_第12张图片
(4)数据库模型后台管理:login/admin.py

from login.models import SiteUser
class SiteUserAdmin(admin.ModelAdmin):
    list_display = ['name','gender']
    list_filter = ['name']
    list_per_page = 2
    list_display_links = ['name']
admin.site.register(SiteUser,SiteUserAdmin)
  • 添加用户

Django---用户登陆注册系统的实现(一)_第13张图片
Django---用户登陆注册系统的实现(一)_第14张图片
Django---用户登陆注册系统的实现(一)_第15张图片

3 路由与视图函数框架搭建

Django---用户登陆注册系统的实现(一)_第16张图片
(1)主urls文件:loginRegister/urls.py

Django---用户登陆注册系统的实现(一)_第17张图片

(2)创建子urls文件:login/urls.py
Django---用户登陆注册系统的实现(一)_第18张图片
(3)子视图文件:

login/views.py

Django---用户登陆注册系统的实现(一)_第19张图片

(4)模板login的首页html文件:

templates/login/index.html

Django---用户登陆注册系统的实现(一)_第20张图片

(5)模板login的登录html文件:templates/login/login.html
Django---用户登陆注册系统的实现(一)_第21张图片

(6)模板login的注册html文件:templates/login/register.html
Django---用户登陆注册系统的实现(一)_第22张图片
(7)测试:
在这里插入图片描述
Django---用户登陆注册系统的实现(一)_第23张图片

在这里插入图片描述
4 用户登录的实现

(1)前端页面的优化:templates/login/login.html

<div class="col-sm">
            <h3 style="text-align: center">用户登录h3>
            ## 修改1. 有message信息则显示, 没有就不显示。
            {% if message %}
            <div class="alert alert-warning" role="alert">
                <strong>登录失败!strong> {{ message }}
            div>
            {% endif %}

            <form action="/login/" method="post">
            # 提交登录信息时, 以post方法提交给/login/对应的是视图函数处理
            # Django提供了csrf防攻击的机制, 添加该信息则可顺利访问登陆界面
                {% csrf_token %}
            # name="username"指定表单内容存储的key值名称, eg: {"username":"你填的用户名"}
                <div class="form-group">
                    <label>用户名label>
                    <input type="text" class="form-control" name="username">
                div>
                <div class="form-group">
                    <label>Passwordlabel>
                    <input type="password" class="form-control" name="password">
                    <small class="form-text text-muted">密码必须是字母、数字或者特殊符号组成.small>
                div>
                <a href="/register/" class="text-success">
                    <ins>新用户注册ins>
                a>
                <button type="submit" class="btn btn-primary float-right">登录button>
            form>
div>

Django---用户登陆注册系统的实现(一)_第24张图片

(2)视图函数的完善:login/views.py

def login(request):
    if request.method == 'POST':  ## 如果提交表单信息POST
        username = request.POST.get('username').strip() ## 获取用户名
        password = request.POST.get('password').strip()  ## 获取提交的密码
       # print(username, password)
        if username and password:  ## 如果输入账号和密码
            user = SiteUser.objects.filter(name=username, password=password).first()  ## 用户名和密码是否在数据库中匹配
            if user:  ## 账号密码正确重定向到首页
                return redirect('/index/')
            else:
                message = "用户名或者密码错误" ##账号和密码验证未通过,输出报错信息 
                return render(request, 'login/login.html', {'message': message})  
        else:  
            message = "非法的信息"
            return render(request, 'login/login.html', {'message': message})
    return render(request, 'login/login.html')

Django---用户登陆注册系统的实现(一)_第25张图片

4 session会话与登录的视图函数

登录成功, 存储登录的用户信息到session中

(1) 视图函数的完善:login/views.py

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username').strip()
        password = request.POST.get('password').strip()
        print(username, password)
        if username and password:
            user = SiteUser.objects.filter(name=username, password=password).first()
            if user:
                request.session['is_login']=True
                request.session['user_id'] = user.id
                request.session['username'] = user.name
                return redirect('/index/')
            else:
                message = "用户名或者密码错误"
                return render(request, 'login/login.html', {'message': message})
        else:
            message = "非法的信息"
            return render(request, 'login/login.html', {'message': message})
    return render(request, 'login/login.html')

Django---用户登陆注册系统的实现(一)_第26张图片

在这里插入图片描述

  • 登出时,清空session信息
def logout(request):
    # 如果不是登陆状态,无法登出
    if request.session.get('is_login'):
        request.session.flush()
    return redirect('/login/')

Django---用户登陆注册系统的实现(一)_第27张图片

你可能感兴趣的:(Django)