热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库自带_Django从入门到大作业:4数据库amp;登入登出

关于前后端参数传递问题,欢迎移步我的文章koko可可:Django从入门到大作业:3-前后端传参​zhuanlan.zhihu.comDj

关于前后端参数传递问题,欢迎移步我的文章

koko可可:Django从入门到大作业:3-前后端传参​zhuanlan.zhihu.com

Django与Java Web最最最最最不同的地方,就是ORM(Object Relational Mapping)。对Django中所有数据表列元素的操作,都可以映射到某个Object上,实现整个项目零SQL。换言之,这种操作最大的好处,就是你可以无限更换底层数据库,而不用考虑代码问题。

细心的你,可能发现,从项目创建之初,就出现了一个名叫db.sqlite3的文件。Django自带轻量级数据库SQLite,这免去了你安装其他数据库的烦恼。

如果只是为了实现华而不实的大作业,SQLite足够了,但如果项目在其他方面有需求,建议一开始就更换底层数据库。(虽说ORM将后端与SQL分离,但更换完数据库总是会出现玄学bug,尽早更换数据库,避免后期一蹶不振的情况,这简直是我的血泪史)


1. 创建user表

牢记:user表=User类,表中列属性=类变量

各种教程中花里胡哨的model讲解,让我对这个东西充满困惑,但拨云见雾,就是上面那句话。不要觉得model是个可怕的东西,它只是与数据库之前的一个映射文件。

由于第一阶段的目的是登入登出,最快捷的方法就是借用Django自带的user表,进一步可以使用大量好用的内置函数。

首先创建一个Django自带的User:终端下执行

python manage.py migrate

9e5947c1a2024b62ecb7abe4f54d701b.png

用Navicat打开db.sqlite3,发现下面已经建好了这些表,其中auth_user就是Django自带的User,有很多已经存在的API可以直接调用。其他表暂时不用管。

b0f92fda7566445220441fb4b892202a.png

可以看到,auth_user下有这些字段

1baf8404112151b449a9b62c31a6faea.png

但有很大的可能,auth_user并不能满足你的要求,比如学号、身份证号、职务等等

Django提供了扩展user的可能性,来左边跟我一起画条龙

7d8287c9e7e00de58bb19502cddbba09.png

from django.contrib.auth.models import AbstractUser
import django

下面的User是我为教务管理系统设计的,不难看懂,不多解释。

class User(AbstractUser):username = models.CharField(max_length=20, primary_key=True, db_index=True)password = models.CharField(max_length=100, null=False)name = models.CharField(max_length=50)id_card = models.CharField(max_length=20)sex = models.CharField(max_length=2)school = models.CharField(max_length=20)major = models.CharField(max_length=20)sclass = models.CharField(max_length=20)admin_data = models.DateField(blank=True, default=django.utils.timezone.now)is_teacher = models.BooleanField(default=False)def __str__(self):return self.name

在setting.py下添加一行声明,也就是告诉项目“我不用你的user了,爸爸自己有”

AUTH_USER_MODEL = "usermng.User"

da95ab53f79893be72028bfa2209d745.png

做完这一步,我们要更新项目数据库(建表)

终端先后输入

python manage.py makemigrations usermng
python manage.py migrate usermng

如果出现报错,可以参考下面的解决方案。(我也报错,真的解释不清)

报错django.db.migrations.exceptions.InconsistentMigrationHistory - WoLykos - 博客园​www.cnblogs.com
79ac9594b4149ede2f4d415c759eed80.png

不出意外,自定义的user表就出现了,里面会包含User自带属性+自定义属性

bd0cc3f607c5e42b48e421914c3cc04d.png

2. 登录

登录操作借助Django自带函数实现(除了登录,Django还提供了登出、登录状态判断、注册等内置函数,真香!)

为了方便后续测试,我们先创建一个超级管理员用户。在终端输入

python manage.py createsuperuser

6c1fb907bc9326debb88b9a4dd5dd2de.png
用户名admin,密码123456,邮箱可以不填

从Navicat看一下,已经创建成功了

9f69ecdfe2fd9778354aa9611a11512f.png

Django默认使用pbkdf2_sha256的动态加密方式,因此数据库中密码为密文保存。下面,我们借助这个刚创建的用户,测试登录功能。

回到我们的菜鸡登录函数index(),导包

from django.contrib.auth import authenticate, login

authenticate用于认证用户名与密码,login执行登录功能

def index(request):if request.method == "POST":user = authenticate(username=request.POST.get("username"), password=request.POST.get("password"))if user:login(request, user)return render(request, "welcome.html", {"username": request.POST.get("username")})else:return render(request, "index.html", {"error_message": "用户名或密码错误!"})else:return render(request, "index.html")

aaecafce4a9d413f19e5d63bc007d15d.png

可以看到,通过认证的用户,跳转至welcome.html页面,而未通过验证的用户,将停留在原地,并弹出alert提示。前端welcome不动,index.html添加报错引导:

{% if error_message %}
{% endif %}

a900013c3dfdab9df6d5b4cb14fd9e40.png

我个人比较倾向于error_message走天下 ,这样只用修改后端不同的报错消息,前端无脑显示即可。你也可以通过return不同的state,在前端展示更为复杂的功能。


3. 测试

首先正常登录

c3eb2dbad0eff4b7a50b5d8e4ba65e20.png
b3116b282c3c39b4a6f56cc0fe3c4e05.png

再试试输错的情况

a89eb45b93dc46f1a3391b0b238d0627.png
fd5e7e4d1605a18f7a993cb0801befaa.png

测试通过


4. 登出

首先,在welcome.html添加一个登出按钮

a32c24327b8d1d179c57c3a01ce94c5b.png

再在urls.py中配置这个超链接的映射。

path('logout/', views.user_logout, name='user_logout'),

edf0fde519e66113c99e15a2a46eacf9.png

views.py下配置登出函数,记得前面引入一下登出函数from django.contrib.auth import authenticate, login, logout

def user_logout(request):logout(request)return render(request, "index.html")

测试看看

ee0b1307b8016bdd0a8e068d2e924039.png
ba04db17f73dcb0c98c734205665f0e8.png

登出成功


5. 访客阻挡

直接访问welcome.html地址,发现,不经登录也能访问

668ac2383601fb2f28c6361717de6e61.png
没有登录信息也能访问

那这搞了半天的登录,没屁用啊好像。一拍脑壳,咱得搞个访客阻挡!

{% if not user.is_authenticated %}
{% endif %}

c66c943d86002d7570d61a97954a3208.png
判断用户不存在登录身份,alert弹出提示,并强制跳转登录界面

访问看看,成功拦截!

9319554619560a74b96022964e090c48.png
强制访问将弹出警告

这一节涉及到不少内容,但都点到为止。下一节会更加深入讨论数据库与后端的交互,增删查改,欢迎移步。

koko可可:Django从入门到大作业:5-ORM操作​zhuanlan.zhihu.com



推荐阅读
author-avatar
nup1764819
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有