day71——auth模块、项目开发流程、bbs七张表
Auth模块
我们在创建好一个django项目之后直接执行数据库迁移命令会自动生成很多表,auth_user表就是其中的一张。django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且还必须是管理员用户才能进入。
方法总结:
-
命令行创建超级用户(管理员)
python3 manage.py createsuperuser # 输入用户名、密码、邮箱(邮箱可以不填)
-
比对用户名和密码是否正确
user_obj = auth.authenticate(request,username=username,password=password) # 括号内必须同时传入用户名和密码
-
保存用户状态
auth.login(request,user_obj)
类似于
request.session[key] = username
,只要执行了该方法,可以在任何地方通过request.user获取到当前登录的用户对象。 -
判断当前用户是否登录
request.user.is_authenticated()
-
获取当前登录用户
request.user
-
校验用户是否登录装饰器
from django.contrib.auth.decorators import login_required # 局部配置 @login_required(login_url='/login/') # login_url 用户没有登录时跳转到哪个页面 def func(request): pass # 全局配置 # settings.py配置文件 LOGIN_URL = '/login/' @login_required() # login_url 用户没有登录默认跳转到登录页面 def func(request): pass # 当全局和局部都进行了配置,优先级: # 局部 > 全局
全局的好处在于无需重复写代码 但是跳转的页面却很单一,局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面。
-
比对原密码
request.user.check_password(old_password)
-
修改密码
request.user.set_password(new_password) # 仅仅是在修改对象的属性 request.user.save() # 这一步才是真正的操作数据库
一定记得
.save()
保存用户对象,将新密码刷到数据库中。 -
注销登录用户
auth.logout(request)
-
注册用户
操作auth_user表写入数据
from django.contrib.auth.models import User # 先要导入user表 # 方式1:create User.objects.create(username=username,password=password) # 写入数据不能用create,密码没有加密处理 # 方式2:create_user创建普通用户 User.objects.create_user(username=username,password=password) # 方式3:create_supseruser管理员 User.objects.create_superuser(username=username,email='123@qq.com',password=password) # 一般不会将创建管理验的功能暴露给用户,这里邮箱是必填的, # 而用命令创建则可以不填
如何扩展auth_user表
方式一
之前我们在推导一对一表关系的时候,是当一个表中的字段特别的多而且不是每次只用到了少部分字段,我们可以将该表拆成两张表,并建立一对一关系,这种方法其实也可以理解为给一个表变向的扩充了额外的字段,我们可以用这种方式给auth_user表扩展额外的字段,但是这种方式对于auth模块来说不够简便,所以不推荐。
from django.db import models
# 第一种:一对一关系 不推荐
class UserDetail(models.Model):
phone = models.BigIntegerField()
user = models.OneToOneField(to='User')
方式二
面向对象的继承
from django.db import models
from django.contrib.auth.models import User,AbstractUser
class UserInfo(AbstractUser):
"""
如果继承了AbstractUser
那么在执行数据库迁移命令的时候auth_user表就不会再创建出来了
而UserInfo表中会出现auth_user所有的字段外加自己扩展的字段
这么做的好处在于你能够直接点击你自己的表更加快速的完成操作及扩展
前提:
1.在继承之前没有执行过数据库迁移命令
auth_user没有被创建,如果当前库已经创建了那么你就重新换一个库
2.继承的类里面不要覆盖AbstractUser里面的字段名
表里面有的字段都不要动,只扩展额外字段即可
3.需要在配置文件中告诉django你要用UserInfo替代auth_user(******)
AUTH_USER_MODEL = 'app01.UserInfo'
'应用名.表名'
"""
phone = models.BigIntegerField() # 扩展字段
项目开发流程
1.需求分析
架构师、产品经理、开发者组长在跟客户谈需求之前,会大致先了解客户的需求,然后自己先设计一套比较好写方案,在跟客户沟通交流中引导客户往我们之前想好的方案上面靠拢,形成一个初步的方案。
2.项目设计
由架构师负责项目设计,项目设计包括:
-
编程语言选择
-
框架选择
-
数据库选择
- 主库:MySQL、postgreSQL...
- 缓存数据库:redis、mongodb、memcache...
-
功能划分:将整个项目划分成几个功能模块
-
为各小组分发开发任务
-
项目报价
""" 技术这块需要多少人,多少天(一个程序员一天1500~2000计算(大致)) 产品经理公司层面 公司财务签字确认 公司老板签字确认 产品经理去跟客户沟通 后续需要加功能 继续加预算"""
3.分组开发
组长找组员开会,安排各自功能模块;程序员其实就是在架构师设计好的框架里面填写代码而已,写代码的时候,写完需要自己先测试是否有bug,如果是一些显而易见的bug,你没有避免而是直接交给了测试部门测出来那就不太好了。
4.测试
5.交付上线
-
1.交给对方的运维人员
-
2.直接上线到我们的服务器上,收取维护费用。
表设计
一个项目中最最最重要的不是业务逻辑的书写,而是前期的表设计,只要将表设计好了,后续的功能书写才会一帆风顺。
bbs小作业的表设计
七张表:
# 1.用户表
"""
继承AbstractUser
普通字段:
phone 电话号码
avatar 用户头像
create_time 创建时间
外键字段:
一对一个人站点表"""
# 2.个人站点表
"""
普通字段:
site_name 站点名称
site_title 站点标题
site_theme 站点样式"""
# 3.文章标签表
"""
普通字段:
name 标签名
外键字段:
一对多个人站点"""
# 4.文章分类表
"""
普通字段:
name 分类名
外键字段:
一对多个人站点"""
# 5.文章表
"""
普通字段:
title 文章标题
desc 文章简介
content 文章内容
create_time 发布时间
ps:数据库字段设计优化
(虽然下述的三个字段可以从其他表里面跨表查询计算得出,但是频繁跨表效率,
做成普通字段跟其他同步更新,提高效率)
up_num 点赞数
down_num 点踩数
comment_num 评论数
外键字段:
一对多个人站点
多对多文章标签
一对多文章分类"""
# 6.点赞点踩表
"""
(记录哪个用户给哪篇文章点了赞还是点了踩)
外键字段:
user ForeignKey(to="User")
article ForeignKey(to="Article")
is_up BooleanField()"""
# 7.文章评论表
"""
(记录哪个用户给哪篇文章写了哪些评论内容)
普通字段:
content CharField()
comment_time DateField()
外键字段:
user ForeignKey(to="User")
article ForeignKey(to="Article")
ORM专门提供的自关联写法
parent ForeignKey(to="self",null=True)"""
根评论子评论的概念
根评论就是直接评论当前发布的内容的,子评论是评论别人的评论。
如:
- 1.PHP是世界上最牛逼的语言
- 1.1 PHP不行,python才是最牛逼的
- 1.2 PHP不行,java才是最牛逼的语言