csrf装饰器、中间件思想、auth认证模块、bbs项目分析
csrf装饰器、中间件思想、auth认证模块、bbs项目分析

csrf相关装饰器
1、什么是csrf: 跨站请求伪造Cross Site Request Forgery
2、举例子:什么是跨站请求攻击:用户a 访问可信站点1做业务处理,此时浏览器会保存该网站的cookie,当用户a 访问不可信站点2时,如果站点2有指向站点1的链接时候,那么攻击就用可能发生
3、Django怎么做的:使用了csrf的中间件,具体操作是这样的,当浏览器第一次和Django服务交互的时候,后台会生成一个唯一标识码, 放入到前端,同时后台也保存,那么之后再提交数据 服务端就会做csrf的校验,如果通过那么就正常处理,否则返回403
基于这个中间件,我们可以通过以下操作来使用或关闭它
如果使用开启csrf校验需要先注释掉中间件中的/此操作代表全局不在使用csrf检测
'django.middleware.csrf.CsrfViewMiddleware'
@csrf_protect # 开启csrf校验
@csrf_exempt # 忽略csrf校验
# 针对FBV
@csrf_protect\@csrf_exempt
def login(request):
return render(request,'login.html')
# 针对CBV
csrf_protect 三种CBV添加装饰器的方式都可以
csrf_exempt 只有一种方式可以生效(给重写的dispatch方法装)
基于中间件思想编写项目
conformity 整合文件夹
settings.py 功能字典
# 拼接对应功能的地址
NOTIFY_FUNC_LIST = [
'func.NO1.No1',
'func.NO2.No2',
'func.NO3.No3'
]
start.py 启动函数
import func
if __name__ == '__main__':
func.recommend('百尺竿头更进一步') # 调用并传参
func 对应功能文件夹
__init__.py
from conformity import settings
import importlib
def recommend(talk): # 启动文件调用该方法
for i in settings.NOTIFY_FUNC_LIST: # 循环拿出功能字典
pypath, funcpath = i.rsplit('.', maxsplit=1) # 切割
module = importlib.import_module(pypath) # 导入模块
func_name = getattr(module, funcpath) # 反射拿出类
obj = func_name() # 类加括号实例化
obj.intro(talk) # 调用鸭子方法,方法之前的操作各自写入__init__
class No%s(object): # 传统继承新式类
def __init__(self):
print('%s的专属消息')
def intro(self, talk):
print('我是%s', talk)
启动:
no1的专属消息
我是no1 百尺竿头更进一步
no2的专属消息
我是no2 百尺竿头更进一步
no3的专属消息
我是no3 百尺竿头更进一步
如果我想卸载掉no2功能,那么我只需要去在配置文件的功能字典中
# 'func.NO2.No2',

以上编写代码的优点体现于拼接性好,增加功能和移除功能方便
我们只需要对settings.py下的NOTIFY_FUNC_LIST 做增加或删除就可以控制后续功能组件的增加或减少
auth认证模块
我们之前一直练习的登录注册功能······在这一刻
django自带了一个用户登录注册管理系统,该系统相对较为完整

# django提供给你快速完成用户相关功能的模块
用户相关功能:创建、认证、编辑...
# django也配套提供了一张'用户表'
执行数据库迁移命令之后默认产生的auth_user
# django自带的admin后台管理用户登录参考的就是auth_user表
创建admin后台管理员用户:run manage.py task>>:createsuperuser
自动对用户密码进行加密处理并保存
auth模块方法大全
1、authenticate() 身份认证
提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。
如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。
authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。
user = authenticate(username='theuser',password='thepassword')
2、login(HttpRequest, user) 登录
该函数接受一个HttpRequest对象,以及一个经过认证的User对象。
该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user_obj = authenticate(username=username, password=password) # 与数据库做判断
if user_obj:
login(request, user_obj)
# 成功
render(requset,'xx.html') # 返回到登录后页面
else:
# 失败
注意:只要使用login(request, user_obj)之后,request.user就能拿到当前登录的用户对象。否则request.user得到的是一个匿名用户对象(AnonymousUser Object)。
3、logout(request) 登出
该函数接受一个HttpRequest对象,无返回值。
当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
from django.contrib.auth import logout
def logout_view(request):
logout(request)
4、is_authenticated() 判断登录状态
用来判断当前请求是否通过了认证。
def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
5、login_requierd() 装饰器,类似于登录状态确认
auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。
如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。
LOGIN_URL = '/login/' # 这里配置成你项目登录页面的路由
6、create_user() 创建新用户
auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。
from django.contrib.auth.models import User
user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)
普通用户只有username和password必须要
7、create_superuser() 创建超级用户(管理员)
auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。
from django.contrib.auth.models import User
user_obj = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)
超级用户除了username和password以外email也必须要
8、check_password(raw_password) 校验密码
auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。
密码正确返回True,否则返回False。
ok = user_obj.check_password('密码')
或者直接针对当前请求的user对象校验原密码是否正确:
ok = request.user.check_password(raw_password='原密码')
9、set_password(raw_password) 修改密码
auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。
注意:设置完一定要调用用户对象的save方法
user_obj.set_password('新密码')
user_obj.save()
auth扩展表字段
虽然django自带的登录注册功能已经很多字段了,但是相当于项目使用远远不够;所以我们就来学习一下怎么扩展表的字段
类继承:
from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
# 编写需要扩展的字段,不可冲突之前的字段
# 必须是全空的,最好新建一个库直接继承
phone = models.BigIntegerField()
addr = models.CharField(max_length=32)
AUTH_USER_MODEL = 'app01.Users' # 配置字典中添加
继承AbstractUser之后,上述的所有操作方法都可以在新的模型类中使用
注意:类继承后,需要重新执行数据库迁移命令,并且是这个库里面的第一次操作才可以。

bbs数据表分析


浙公网安备 33010602011771号