第一章 django安装与介绍
第二章 django基础使用
第三章 路由层
第四章 虚拟环境、django版本区别、视图层
第五章 模板层
第六章 模型层(上)
第七章 模型层(下)
第八章 ajax
第九章 sweetalert前端插件、序列化组件、批量数据操作、分页器、Forms组件(上)
第十章 forms组件(下)、ModelForm简单使用、cookie与session简单使用
第十一章 django操作cookie补充、django操作session、CBV添加装饰器的三种方式、django中间件常见方法、csrf
csrf中间件是django用于网站防伪的,在配置文件中配置完毕后,只要是有提交数据的操作都要经过csrf组件的防伪验证
当我们在项目中有的位置不需要防伪验证时需要使用csrf的装饰器为对应的功能关闭csrf验证
from django.views.decorators.csrf import csrf_exempt,csrf_protect
csrf_exempt # 忽略csrf校验
csrf_protect # 开启csrf校验
@csrf_protect\@csrf_exempt
def login(request):
return render(request,'login.html')
csrf_protect 三种CBV添加装饰器的方式都可以
class Index(views.View):
@method_decorator(csrf_protect)
def get(self, request):
# username = request.get_signed_cookie('username', salt='加盐')
username = request.session.get('username')
return render(request, 'index.html', locals())
@method_decorator(csrf_protect, name='get')
class Index(views.View):
def get(self, request):
# username = request.get_signed_cookie('username', salt='加盐')
username = request.session.get('username')
return render(request, 'index.html', locals())
class Index(views.View):
@method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def get(self, request):
# username = request.get_signed_cookie('username', salt='加盐')
username = request.session.get('username')
return render(request, 'index.html', locals())
csrf_exempt 只有一种方式可以生效(给重写的dispatch方法装)
class Index(views.View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def get(self, request):
# username = request.get_signed_cookie('username', salt='加盐')
username = request.session.get('username')
return render(request, 'index.html', locals())
项目开发完毕后会在服务器上启动之后没有意外是不会停止的,这种是时候当我们需要修改项目功能(新增、修改、删除、不使用等),这个时候就需要去修改核心的业务逻辑层代码。但随意修改业务逻辑层往往伴随很多问题(需要修改的代码正在使用、修改部分为核心代码必选先停止服务器等),针对这些问题,往往修改一次需要付出很高的代价,这个时候以中间件和配置文件的形式来使功能模块化,可随意修改删除将节省很高的成本
通过学习django7个中间件,我们知道在MIDDLEWARE中配置的不单单是一个字符串而是相当于导入模块的操作
importlib模块
该模块能够将字符串转化为对应的py文件路径,然后获取py文件(注:不能导入py文件中的类)
python反射
使用反射获取对象中的类、方法、变量
通过以上俩种代码可以完成将字符串路径所对应的py中的类、方法、变量转变为
1.创建一个my_mid包
创建func1.py、func2.py、func3.py
2.为三个py文件设置功能函数
func1.py
class Show1(object):
def __init__(self, msg):
self.msg =msg
def show_p(self):
print(f'你启用了func1组件的show_p功能,你传入了一个参数:%s'% self.msg)
def show_p1(self):
print(f'你启用了func1组件的show_p1功能,你传入了一个参数:{self.msg}')
func2.py
class Show2(object):
def __init__(self, msg):
self.msg = msg
def show_p(self):
print(f'你启用了func2组件的show_p功能,你传入了一个参数:%s'%self.msg)
def show_p1(self):
print(f'你启用了func2组件的show_p1功能,你传入了一个参数:{self.msg}')
func3.py
class Show3(object):
def __init__(self, msg):
self.msg = msg
def show_p(self):
print(f'你启用了func3组件的show_p功能,你传入了一个参数:%s'%self.msg)
def show_p1(self):
print(f'你启用了func3组件的show_p1功能,你传入了一个参数:{self.msg}')
3.编写获取配置文件并转化为对象调用功能
def run_way():
# 1.获取配置文件中的路径
from djangoceshi1 import settings
# 2.对获取的路径进行处理
total_mid = []
# 3.将配置文件中的路径分开处理
for MY_MID in settings.MY_MIDS:
py_name, class_name = MY_MID.rsplit('.', maxsplit=1)
# 4. 获取py文件后获取class对象
import importlib
py_obj = importlib.import_module(py_name)
class_obj = getattr(py_obj, class_name)
total_mid.append(class_obj)
# 5.使用封装好的total_mid 可以不封装直接在for中调用
for mid in total_mid:
obj = mid('参数')
obj.show_p()
obj.show_p1()
完成以上步骤只需要触发即可
eg:
#随意在任意地方调用
run_way()
auth是django提供给的快速完成用户相关功能的模块:
用户相关功能:创建、认证、编辑…
auth模块django也配套提供了一张用户表
执行数据库迁移命令之后默认产生的auth_user
django自带的admin后台管理用户登录参考的就是auth_user表
创建admin后台管理员用户:
python manage.py createsuperuser
使用auth模块需要先导入
from django.contrib import auth
提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。
如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。
authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。
user = auth.authenticate(username='username',password='password')
该函数接受一个HttpRequest对象,以及一个经过认证的User对象。
该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据(一般情况储存在django_session中)。
def login(request):
user = auth.authenticate(username='username',password='password')
login(request, user)
对request使用.user可以获取当前请求中的user对象
def login(request):
user = request.user
用来判断当前请求是否通过了认证(是否已存在session)。(实质上就是查看session)
request.user.is_authenticated()
auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。
from django.contrib.auth.decorators import login_required
@login_required(login_url='/lg/') # 局部配置
@login_required # 全局配置
LOGIN_URL = '/lg/' # 需要在配置文件中添加配置
若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ’ 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。
如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。
from django.contrib.auth.decorators import login_required
# 1.局部配置
@login_required(login_url='/lg/') # 局部配置 只对此处有效
# 2.全局配置
@login_required # 全局配置,之后使用该装饰器都会生效
LOGIN_URL = '/lg/' # 需要在配置文件中添加配置
auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。
密码正确返回True,否则返回False。
request.user.check_password('密码')
auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。
注意:设置完一定要调用用户对象的save方法
request.user.set_password('新密码')
request.user.save()
该函数接受一个HttpRequest对象,无返回值。
当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
auth.logout(request)
auth为我们提供了俩种用户的创建
create_superuser为超级用户,该方法需要提供用户名、密码、邮箱等
create_suser为普通用户,该方法需要提供用户名、密码等
from django.contrib.auth.models import User
User.objects.create_superuser(username='用户名1', password='密码1', email='[email protected]')
User.objects.create_suser(username='用户名2', password='密码2')
直接使用一对一关系让别的表关联auth_user表
这样可以变相的增加auth_user表的字段
当我们设计用户表时想要拥有更多字段并且可以使用django提供的登录、注册等功能。这个时候继承auth_user表,这样可以拓展字段还能继续使用django提供的便捷功能。
from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
# 编写AbstractUser类中没有的字段 不能是AbstractUser已拥有的字段
phone = models.BigIntegerField()
addr = models.CharField(max_length=32)
编写完毕需要去配置文件中设置
AUTH_USER_MODEL = 'app01.Users'
此时迁移表就能完成拥有auth_user功能和字段的新用户表
注意:
1.迁移操作是否已有记录,有就将其删除
2.迁移操作是否已生成表,是最好删除所有表(可以只删除auth前缀的表)
练手项目:
bbs论坛