每日测验

"""
今日考题
1.什么是django中间件,它的作用是什么,如何自定义中间件,里面有哪些用户可以自定义的方法,这些方法有何特点
2.基于django中间件的功能设计,你有啥感悟和心得
3.什么是跨站请求伪造,你可以用一个具体的实例描述一下,django中如何防止及通过跨站请求伪造校验(form表单与ajax)
4.跨站请求伪造相关的装饰器有哪些,应用在FBV与CBV上的有什么异同
"""

昨日内容回顾

  • django请求生命周期流程图

  • django中间件

    """
    django中间件类似于django的保安
    1.请求来的时候需要先经过中间件才能到达urls.py继续匹配
    2.响应走的时候最后也需要经过中间件才能真正离开django后端 django中间件能够做的事情
    只要是涉及到项目全局的功能,你一定要想到中间件
    1.全局身份校验
    2.全局访问频率校验
    3.全局权限校验
    ... django默认有七个中间件(每个中间件其实就类似于一块独立的功能) django除了有自带的七个之外还支持用户自定义中间件并且暴露给用户五个可以自定义的方法
    """
    # 如何自定义中间件
    1.在应用或者项目下创建一个任意名称的文件夹
    2.在该文件夹内创建任意名称的py文件
    3.在py文件内书写类 这个类需要继承所有中间件类都继承的MiddlewareMixin
    4.需要在配置文件中书写类的完整路径 # 需要掌握的两个
    1.process_request(self,request)
    1.请求来的时候会按照配置文件中注册的中间件从上往下依次经过每一个中间件里面的该方法,如果没有定义直接跳过
    2.该方法也可以自己返回HttpResponse对象,一旦返回则请求不再继续往后执行直接原路返回(可以借助于该方法实现很多限制校验功能) 2.process_response(self,request,response)
    1.响应走的时候会按照配置文件中注册的中间件从下往上依次经过每一个中间件里面的该方法,如果没有定义直接跳过
    2.形参response就是返回给前端浏览器的内容,也就意味着该方法要么将response返回要么自己返回一个HttpResponse对象
    # 只要是形参中带有response的方法,那么该方法就必须返回response或者HttpResponse对象 """
    注意
    当process_request返回HttpResponse对象之后会直接走同级别的process_response而不会将所有的process_response都走一遍 但是在flask框架也有类似的中间件
    但是它的特点只要返回响应就必须将所有类似于process_response功能方法全部走一遍
    """ # 了解即可的三个
    1.process_view(self,view_name,*args,**kwargs)
    路由匹配成功之后执行视图函数之前 2.process_exception(self,request,exception)
    当后端视图函数出现报错的时候 3.process_template_response(self,request,response)
    返回的HttpResponse对象必须含有render属性
  • csrf跨站请求伪造

    """
    钓鱼网站
    本质:
    用假网站代替真网站,获取用户数据朝真网站提交,中途修改一些参数
    eg:网页银行转账的例子 解决办法:
    在给用户返回的具有可以提交post请求的页面上添加一个唯一标记
    之后该页面发送post请求到后端,会先校验该唯一标记
    """
    # form表单如何获取
    在form表单内书写{% csrf_token %}
    <input type='hidden' name='csrfmiddlewaretoken' value='唯一的随机字符串'/> # ajax如何如何
    1.自己利用标签查找获取值
    data:{'csrfmiddlewaretoken':'$("[name=csrfmiddlewaretoken]").val()'}
    2.利用模版语法
    data:{'csrfmiddlewaretoken':'{{ csrf_token }}'}
    3.通用的 js文件
    拷贝固定的js代码导入到你的html页面上即可
  • csrf相关装饰器

    """
    from django.views.decorators.csrf import csrf_protect,csrf_exempt
    csrf_protect:需要校验csrf
    跟我们之前学习的三种给CBV加装饰器的玩法一样 csrf_exempt:忽略校验csrf
    只能作用于dispatch方法 他们两个在FBV上使用方式一致,就是普通的装饰器玩法
    而在CBV上两者却有区别
    """
  • 参考django中间件功能设计扩展知识

    # 模块 importlib
    能够以字符串的形式帮助你导入模块,但是需要注意最小单位只能到模块名 # 功能的插拔式设计
    1.配置文件注册功能
    2.importlib模块
    3.字符串切割split
    4.反射
    5.面向对象及鸭子类型
    # 一定要总结吸收该思想

今日内容概要

  • 权限管理(RBAC)

    你可以借助于django中间件实现网站的权限校验(课外兴趣扩展)

  • Auth模块

    只要是跟用户相关的登陆、注册、校验、修改密码、注销、验证用户是否登陆

  • BBS(仿博客园小作业)

    项目开发流程

    表设计(七张表)

    你们回去之后好好的把这七张关系捋一捋

今日内容详细

Auth模块

"""
其实我们在创建好一个django项目之后直接执行数据库迁移命令会自动生成很多表
django_session
auth_user
django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且还必须是管理员用户才能进入 创建超级用户(管理员)
python3 manage.py createsuperuser 依赖于auth_user表完成用户相关的所有功能
""" from django.shortcuts import render,redirect,HttpResponse from django.contrib import auth
# Create your views here. #使用auth模块要用就用全套 #登录
def login(request):
if request.method =='POST':
username = request.POST.get('username')
password = request.POST.get('password')
#去用户表中校验数据
#1.表怎么获取
#2.密码如何比对
user_obj = auth.authenticate(request,username=username,password=password)
#print(user_obj) #用户对象 数据不符合则返回none和报错
#print(res.username)
#print(res.password)
"""
1.自动查找auth_user表
2.自动给密码加密再比对
该方法注意事项:
括号内必须同时传入用户名和密码
不能只传用户名
""" #判断用户是否存在
if user_obj:
auth.login(request, user_obj) # 类似于request.session[key] = user_obj
# 主要执行了该方法 你就可以在任何地方通过request.user获取到当前登陆的用户对象
return redirect('/home/') return render(request,'login.html') from django.contrib.auth.decorators import login_required #@login_required(login_url='/login/') #(局部配置)加上之后,直接自动帮你自动验证 必须登录之后才能访问 未登录访问,指定跳转到login
@login_required #(全局配置)在setting中全局配置之后,括号里面就不用写了
def home(request):
"""
用户登录之后才能看home页面
"""
print(request.user) #用户对象
#判断用户是否登录
print(request.user.is_authenticated()) # True为已登录 False为未登录的匿名用户
#自动去django_session里面查找对应的用户对象给你封装到request.user中
return HttpResponse("我是主页") #@login_required(login_url='/login/') (局部配置)
@login_required #在setting中全局配置之后,括号里面就不用写了 (全局配置)
def index(request):
"""
1.如果局部和全局都有 该听谁的?
局部 > 全局
2.局部和全局哪个好呢?
全局的好处在于无需重复写代码 但是跳转的页面却很单一
局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面
"""
return HttpResponse("我是index页面") #用户修改密码(登录之后才能修改密码)
@login_required
def set_password(request):
if request.method == 'POST':
old_password = request.POST.get('old_password')
new_password = request.POST.get('new_password')
confirm_password = request.POST.get('confirm_password')
#先校验两次密码是否一致
if new_password == confirm_password:
#校验老密码对不对
is_right = request.user.check_password(old_password) #自动加密比对密码
if is_right:
#修改密码
request.user.set_password(new_password)
request.user.save() #这一步才是真正的操作数据库 保存新密码到数据库
return redirect('/login/')
return render(request,'set_password.html',locals()) #用户注销功能(登录之后才能进行注销操作)
@login_required
def logout_view(request):
auth.logout(request) #在数据库中找到当前登录页面直接删除当前用户
return redirect('/login/') from django.contrib.auth.models import User
#注册功能
def register(request):
if request.method =='POST':
username = request.POST.get('username')
password = request.POST.get('password')
#操作auth_user表写入数据
#User.objects.create(username=username,password=password) #写入数据 不能用create 密码没有加密处理
#创建普通用户
User.objects.create_user(username=username,password=password)
#创建超级用户(了解) 使用代码创建超级用户 邮箱是必填的 而用命令行创建邮箱可不填
#User.objects.create_superuser(username=username,email='123@qq.com',password=password)#注意邮箱必填
return render(request,'register.html')

方法总结

# 1.比对用户名和密码是否正确
user_obj = auth.authenticate(request,username=username,password=password)
# 括号内必须同时传入用户名和密码
print(user_obj) # 用户对象 jason 数据不符合则返回None
print(user_obj.username) # jason
print(user_obj.password) # 密文 # 2.保存用户状态
auth.login(request,user_obj) # 类似于request.session[key] = user_obj
# 主要执行了该方法 你就可以在任何地方通过request.user获取到当前登陆的用户对象 # 3.判断当前用户是否登陆
request.user.is_authenticated() # 4.获取当前登陆用户
request.user # 5.校验用户是否登陆装饰器
from django.contrib.auth.decorators import login_required
# 局部配置
@login_required(login_url='/login/')
# 全局配置
LOGIN_URL = '/login/'
1.如果局部和全局都有 该听谁的?
局部 > 全局
2.局部和全局哪个好呢?
全局的好处在于无需重复写代码 但是跳转的页面却很单一
局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面 # 6.比对原密码
request.user.check_password(old_password) # 7.修改密码
request.user.set_password(new_password) # 仅仅是在修改对象的属性
request.user.save() # 这一步才是真正的操作数据库 # 8.注销
auth.logout(request) # 9.注册
# 操作auth_user表写入数据
User.objects.create(username=username,password=password) # 写入数据 不能用create 密码没有加密处理
# 创建普通用户
User.objects.create_user(username=username,password=password)
# 创建超级用户(了解):使用代码创建超级用户 邮箱是必填的 而用命令创建则可以不填
User.objects.create_superuser(username=username,email='123@qq.com',password=password)

如何扩展auth_user表

#在models.py文件中设置
from django.db import models
from django.contrib.auth.models import User,AbstractUser
# Create your models here. # 第一种:一对一关系 不推荐
# class UserDetail(models.Model):
# phone = models.BigIntegerField()
# user = models.OneToOneField(to='User') # 第二种:面向对象的继承
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() """
你如果自己写表替代了auth_user那么
auth模块的功能还是照常使用,参考的表页由原来的auth_user变成了UserInfo 我们bbs作业用户表就是用的上述方式
"""

项目开发流程

# 1.需求分析
架构师+产品经理+开发者组长
在跟客户谈需求之前,会大致先了解客户的需求,然后自己先设计一套比较好写方案
在跟客户沟通交流中引导客户往我们之前想好的方案上面靠
形成一个初步的方案 # 2.项目设计
架构师干的活
编程语言选择
框架选择
数据库选择
主库:MySQL,postgreSQL,...
缓存数据库:redis、mongodb、memcache...
功能划分
将整个项目划分成几个功能模块
找组长开会
给每个组分发任务
项目报价
技术这块需要多少人,多少天(一个程序员一天1500~2000计算(大致))
产品经理公司层面 再加点钱
公司财务签字确认
公司老板签字确认
产品经理去跟客户沟通 后续需要加功能 继续加钱 # 3.分组开发
组长找组员开会,安排各自功能模块
我们其实就是在架构师设计好的框架里面填写代码而已(码畜) 我们在写代码的时候 写完需要自己先测试是否有bug
如果是一些显而易见的bug,你没有避免而是直接交给了测试部门测出来
那你可能就需要被扣绩效了(一定要跟测试小姐姐搞好关系)
薪资组成 15K(合理合规合法的避税)
底薪 10K
绩效 3K
岗位津贴 1K
生活补贴 1K # 4.测试
测试部门测试你的代码
压力测试
...
# 5.交付上线
1.交给对方的运维人员
2.直接上线到我们的服务器上 收取维护费用
3.其他...

表设计

"""
一个项目中最最最重要的不是业务逻辑的书写
而是前期的表设计,只要将表设计好了,后续的功能书写才会一帆风顺 bbs表设计
1.用户表
继承AbstractUser
扩展
phone 电话号码
avatar 用户头像
create_time 创建时间 外键字段
一对一个人站点表 2.个人站点表
site_name 站点名称
site_title 站点标题
site_theme 站点样式 3.文章标签表
name 标签名 外键字段
一对多个人站点 4.文章分类表
name 分类名 外键字段
一对多个人站点 5.文章表
title 文章标题
desc 文章简介
content 文章内容
create_time 发布时间 数据库字段设计优化(******)
(虽然下述的三个字段可以从其他表里面跨表查询计算得出,但是频繁跨表效率)
up_num 点赞数
down_num 点踩数
comment_num 评论数 外键字段
一对多个人站点
多对多文章标签
一对多文章分类 6.点赞点踩表
记录哪个用户给哪篇文章点了赞还是点了踩
user ForeignKey(to="User")
article ForeignKey(to="Article")
is_up BooleanField() 1 1 1
1 2 1
1 3 0
2 1 1 7.文章评论表
记录哪个用户给哪篇文章写了哪些评论内容
user ForeignKey(to="User")
article ForeignKey(to="Article")
content CharField()
comment_time DateField()
# 自关联
parent ForeignKey(to="Comment",null=True)
# ORM专门提供的自关联写法
parent ForeignKey(to="self",null=True) id user_id article_id parent_id
1 1 1
2 2 1 1 根评论子评论的概念
根评论就是直接评论当前发布的内容的 子评论是评论别人的评论
1.PHP是世界上最牛逼的语言
1.1 python才是最牛逼的
1.2 java才是 根评论与子评论是一对多的关系 """

七张表的关系

作业

"""
必做题
1.整理今日内容至个人博客或笔记中
2.创建自己的模型表扩展auth_user表字段,验证auth模块功能方法
3.理解bbs表设计及表关系 选做题
1.创建表并尝试着完成注册功能
"""

最新文章

  1. 解决.NET WebService引用后添加HTTP Header的问题
  2. zmNgFrameWork 架构升级ng1.5和md5静态资源缓存方案【angular1.x】
  3. easyUI数据表格datagrid之笔记
  4. squid代理服务器配置详解
  5. DNS Prefetch
  6. REST风格URL
  7. git的一些指令
  8. 比较HTML元素和Native组件的区别
  9. Mysql的2003错误 cant connect to mysql 10060的解决
  10. 【转】千万不要在JS中使用连等赋值操作
  11. HashTable与ConcurrentHashMap的区别
  12. [python]获取当前路径用来构造相对路径的几种方法
  13. javascript数组方法
  14. Java、mysql、html、css、js 注释&amp;大小写
  15. LeetCode: Triangle 解题报告
  16. Web 项目遇到的乱码问题
  17. Nginx的负载均衡的几种方式
  18. Qt SD卡 文件系统挂载、文件预览
  19. Spring cloud 之Feign基本使用
  20. BGP&amp;RIP

热门文章

  1. HCNA Routing&amp;Switching之访问控制列表ACL
  2. 中文屋 Chinese room
  3. SIM900A—基础指令
  4. 【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
  5. NOIP 模拟 9 考试总结
  6. @Transactional-同一个类中方法自调,调用方法事物失效
  7. 页面的跳转MVVM,带参数的传递
  8. pyspark启动与简单使用----本地模式(local)----shell
  9. mzy对于反射的复习
  10. Struts2之Json插件的使用