网站里可以增加网址吗,广告模板app,公司名称域名网站,怎么制作网站步骤一、csrf跨站请求的相关装饰器 django.middleware.csrf.CsrfViewMiddlewareDjango中有一个中间件对csrf跨站做了验证#xff0c;我只要把csrf的这个中间件打开#xff0c;
那就意味着所有的方法都要被验证
在所有的视图函数中#xff1a;只有几个视图函数做验证只有几个函数…一、csrf跨站请求的相关装饰器 django.middleware.csrf.CsrfViewMiddlewareDjango中有一个中间件对csrf跨站做了验证我只要把csrf的这个中间件打开
那就意味着所有的方法都要被验证
在所有的视图函数中只有几个视图函数做验证只有几个函数不做验证csrf_protect: 哪个视图函数加了这个装饰器这个函数就会做验证
csrf_exempt哪个视图函数加了这个装饰器这个函数就不会做验证
-------------------------------------------------------------------------------
注意加入装饰器验证csrf先导入下面这行代码
from django.views.decorators.csrf import csrf_exempt,csrf_protect一、FBV模式下
情境11.先在settings.py配置文件中注释下面这行代码# django.middleware.csrf.CsrfViewMiddleware,2.然后在需要验证的视图函数上面加上 csrf_protect 则说明这个视图函数需要经过验证.csrf_protectdef index(request):return render(request, index.html)def func(request):return render(request, func.html)3. 上述两个视图函数中由于index函数加了装饰器csrf_protect所以需要经过csrf验证而func函数不需要情境21.先打开settings.py配置文件中下面这行代码即不用注释django.middleware.csrf.CsrfViewMiddleware,2.然后在不需要验证的视图函数上面加上 csrf_exempt 则说明这个视图函数不需要经过验证而没有加任何装饰的视图函数必须经过csrf验证csrf_exemptdef index(request):return render(request, index.html)def func(request):return render(request, func.html)return render(request, func.html)3. 上述两个视图函数中在django.middleware.csrf.CsrfViewMiddleware,没有被注释的情况下由于index函数加了装饰器csrf_exempt所以不需要经过csrf验证而func函数需要csrf验证。情境31.在打开settings.py配置文件中下面这行代码的情况下django.middleware.csrf.CsrfViewMiddleware,2.然后在不需要验证的视图函数上面加上 csrf_exempt 则说明这个视图函数不需要经过验证而另一个加了装饰器 csrf_protect 的视图函数也必须经过csrf验证csrf_exemptdef index(request):return render(request, index.html)csrf_protectdef func(request):return render(request, func.html)3. 上述两个视图函数中由于index函数加了装饰器csrf_exempt所以不需要经过csrf验证而func函数加了装饰器csrf_protect需要csrf验证。二、CBV模式下
注意加入装饰器先导入下面代码
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.views import View
from django.utils.decorators import method_decorator方式1在post函数上加入csrf_exempt无效还是报错Forbidden (403)1.先打开settings.py配置文件中下面这行代码即不用注释django.middleware.csrf.CsrfViewMiddleware,2.然后在不需要验证的视图函数上面加上 csrf_exempt 则说明这个视图函数不需要经过验证但是结果是还需要验证说明此方式无效。class Login(View):# 不让post方法做验证method_decorator(csrf_exempt)def post(self, request):print(post)return HttpResponse(post)方式2在类的投诉加入csrf_exempt无效还是报错Forbidden (403)1.先打开settings.py配置文件中下面这行代码即不用注释django.middleware.csrf.CsrfViewMiddleware,2.在类的头上加了装饰器但是还是无效method_decorator(csrf_exempt, namepost)class Login(View):# 不让post方法做验证def post(self, request):print(post)return HttpResponse(post)方式3CBV的验证只有在dispatch函数上加装饰器需要验证的函数才能通过验证class Login(View):method_decorator(csrf_exempt)def dispatch(self, request, *args, **kwargs):return super(Login, self).dispatch(request, *args, **kwargs)# 不让post方法做验证def post(self, request):print(post)return HttpResponse(post)注意在settings.py配置文件中注释下面这行代码#django.middleware.csrf.CsrfViewMiddleware,然后对三种方式进行验证csrf_protect都可以CBV针对于csrf_exempt只有第三张方式才生效其余两种方式不行
CBV针对于csrf_protect三种方式都可以# method_decorator(csrf_protect,namepost) # 第二种方式也行
class Login(View):method_decorator(csrf_protect) # 第三种方式可以def dispatch(self, request, *args, **kwargs):return super().dispatch(request, *args, **kwargs)# 不让post方法做验证# method_decorator(csrf_protect) # 第一种方式行def post(self, request):print(post)return HttpResponse(post)二、Auth模块的使用
Auth模块是什么Auth模块是Django自带的用户认证模块我们在开发一个网站的时候无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能这还真是个麻烦的事情呢。Django作为一个完美主义者的终极框架当然也会想到用户的这些痛点。它内置了强大的用户认证系统–auth它默认使用 auth_user 表来存储用户数据。注意事项在执行数据库迁移命令的时候会自动生成一个默认的表其中有auth_开头的很多表auth_user表的作用djagno自带的后台管理系统所依赖的数据就在这张表中默认情况下auth_user表是空表没有用户名和密码因此我们需要自己创建用户数据需要创建一个超级管理员账号才能登录
创建超级管理员命令python manage.py createsuperuser在配置文件settings.py中修改语言为中文和时区
# 语言
LANGUAGE_CODE zh-hans
# 时区
TIME_ZONE Asia/Shanghai
USE_I18N True
USE_L10N True
USE_TZ False
三、Auth模块的相关方法
登录功能、注册功能、修改密码、退出系统、认证功能等学习如何使用# http://127.0.0.1:8000/accounts/login/?next/order/
# login_required # :http://127.0.0.1:8000/accounts/login/?next/order/
当局部和全局都存在的时候按局部的如果局部没有按照全局的login_required(login_url/order/login/) # 局部设置
def order(request):pass###################配置文件中全局配置LOGIN_URL /login/ # 全局配置
如果没有登录则 跳转到 http://127.0.0.1:8000/accounts/login/?next/order/
但是若加了装饰器则跳转到指定的路由页面在settings.py配置文件中全局配置
LOGIN_URL /login/当局部和全局都在的时候按局部的若局部没有则按全局的login_required(login_url/login/) # 局部设置登录
def order(request):# 验证用户是否已经登录认证print(request.user.is_authenticated) # True# 若加了login_required装饰器则下面的判断不需要# if request.user.is_authenticated:# # 处理登录之后的逻辑# pass# else:# # 没有登录跳转登录页面# passreturn HttpResponse(order)def order1(request):return HttpResponse(order)---------------------------------------------------------------------------------------auth模块的后端登录代码
from django.contrib import authdef login(request):if request.method POST:# 1.接收前端传过来的数据username request.POST.get(username)password request.POST.get(password)# 2.验证用户名和密码是否正确# 2.1 去哪个表中查询数据# 2.2 使用这张表中的哪个字段来比较这里的登录我们使用auth模块登录的时候所使用的表是auth_user表# def authenticate(requestNone, **credentials):return user 需要关键字传参user_obj auth.authenticate(request, usernameusername, passwordpassword) # request.session[username] user_obj.usernane返回值是登录成功之后的用户对象print(user_obj) # lindaprint(user_obj.username) # lindaprint(user_obj.password) # pbkdf2_sha256$150000$auQyjuifJ0ie$I8uTuxyATU6FubswdMCTiL2Hg5sqzkvZruPmPdlZ0注意事项1传递参数的时候用户名和密码必须同时传入# if user_obj:# # 保存用户的状态cookie session# request.session[username] user_obj.username# request.session[id] user_obj.id注意事项2由于上面使用了auth模块在此不建议这样写auth模块都提供有相应的方法要么全部使用auth模块的方法要么全部自己写不建议混合使用# 3.使用auth模块提供的方法auth.login(request, user_obj)只要写了auth.login那么就可以在全局有任何request的地方使用request.user拿到用户对象return redirect(/home/)return render(request, login.html)
登录页面前端代码
!DOCTYPE html
html langenheadmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titleDocument/titlestylebody {{#background: url(https://pic2.zhimg.com/3ae866e7992a94069c7e0c417aac807d_r.jpg) no-repeat;#}background: url(https://img0.baidu.com/it/u741268616,1401664941fm253app138sizew931n0fJPEGfmtauto?sec1691859600t5c5bee3052ecec363c1ecc2eea9ac3f7) no-repeat;background-size: 100% 130%;}#login_box {width: 20%;height: 400px;background-color: #00000060;margin: auto;margin-top: 10%;text-align: center;border-radius: 10px;padding: 50px 50px;}h2 {color: #ffffff90;margin-top: 5%;}#input-box {margin-top: 5%;}span {color: #fff;}input {border: 0;width: 60%;font-size: 15px;color: #fff;background: transparent;border-bottom: 2px solid #fff;padding: 5px 10px;outline: none;margin-top: 10px;}button {margin-top: 50px;width: 60%;height: 30px;border-radius: 10px;border: 0;color: #fff;text-align: center;line-height: 30px;font-size: 15px;background-image: linear-gradient(to right, #30cfd0, #330867);}#sign_up {margin-top: 45%;margin-left: 60%;}a {color: #b94648;}/style
/headbody
div idlogin_boxh2登录页面/h2form action methodpostdiv idinput_boxinput typetext placeholder请输入用户名 nameusername/divdiv classinput_boxinput typepassword placeholder请输入密码 namepassword/divbutton提交/button
{# input typesubmit value提交#}br/form
/div
/body
/html
四、Auth模块之退出系统
def logout(request):# 清除cookie或者sessionauth.logout(request)return redirect(/home/)
六、Auth模块之修改密码功能
1.验证老密码是否正确
is_right request.user.check_password(old_password)2.修改密码
request.user.set_password(new_password) # 这种写法没有真正的操作数据库
request.user.save() # 但是执行了save()之后就操作数据库了案例代码
login_required
def set_password(request):if request.method POST:old_password request.POST.get(old_password)new_password request.POST.get(new_password)re_password request.POST.get(re_password)# 先验证两次密码是否输入一致if new_password re_password:# 验证老密码是否正确is_right request.user.check_password(old_password)if is_right:# 修改密码# 方式1这种写法没有真正的操作数据库request.user.set_password(new_password)# 方式1需要保存一下才能修改成功到数据库request.user.save()return redirect(/home/)return render(request, set_password.html, locals())前端代码
div idlogin_boxh2修改密码/h2form action methodpost{% csrf_token %}div idinput_box用户名input typetext nameusername readonly value{{ request.user.username }}/divdiv classinput_box旧密码input typepassword placeholder请输入旧密码 nameold_password/divdiv classinput_box新密码input typepassword placeholder请输入新密码 namenew_password/divdiv classinput_box请确认input typepassword placeholder确认新密码 namere_password/divbutton提交/button
{# input typesubmit value提交#}br/form
/div七、Auth模块之注册功能 入库的三种方式方式1自动入库到auth_user表,但是密码是明文密码登录的时候是经过加密处理的则登录不上User.objects.create(usernameusername, passwordpassword)方式2密码是密文入库User.objects.create_user(usernameusername, passwordpassword)方式3创建超级用户并且密码是密文存入,但是必须指定邮箱否则报错User.objects.create_superuser(usernameusername, passwordpassword, email123qq.com)
from django.contrib.auth.models import Userdef register(request):if request.method POST:username request.POST.get(username)password request.POST.get(password)# 入库# 方式1自动入库到auth_user表,但是密码是明文密码登录的时候是经过加密处理的则登录不上# User.objects.create(usernameusername, passwordpassword)# 方式2创建普通用户密码是密文入库# User.objects.create_user(usernameusername, passwordpassword)# 方式3创建超级用户并且密码是密文存入,但是必须指定邮箱否则报错User.objects.create_superuser(usernameusername, passwordpassword, email123qq.com)return redirect(/login/)return render(request, register.html)八、扩展默认的auth_user表
默认情况下使用的就是auth_user的默认字段
扩展我们自己的字段前提是所有的模型类都继承
from django.contrib.auth.models import AbstractUser现在是要在auth_user表的基础上扩展字段不要继承了models.Model**************************************************************************
注意扩展之后需要在配置文件(settings.py)中加一句话AUTH_USER_MODEL 应用名.表名eg:AUTH_USER_MODEL app01.UserInfo-------------------------------------------------------------------------------------注意在扩展表之前数据库不能够迁移扩展这个表需要在迁移数据库之前做问如果你迁移了还想扩展怎么办?1. 换库2. 需要删除很多个应用的migrations文件夹
注意迁移报错的时候有可能会用到下面这句代码python manage.py migrate myapp --fake---------------重点扩展表之后发生的变化-------------------
扩展表之后发生的变化1. 原来的auth_user表不存在了换成你自己新建的表名了2. 原来的auth_user表中的字段还都在然后多了自己扩展的字段3. 继承的类要发生改变AbstractUser4. 在配置文件中加入下面一句话AUTH_USER_MODEL app01.UserInfoAUTH_USER_MODEL 应用名.类名5. 扩展之后还是按照原来的auth_user表使用6. auth模块中的数据还是你扩展的表7. 扩展之前别迁移.
--------------------------------------------------------------------
案例
因为之前迁移过了所以我选择换库从sqlite3----mysql1.在settings.py配置文件中把数据库换成MySQL
default: {ENGINE: django.db.backends.mysql,NAME: db22,HOST: 127.0.0.1,PORT: 3306,USER: root,PASSWORD: root,CHARSET: utf8},
2.扩展表的字段先导入AbstractUser让扩展表继承AbstractUser
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):phone models.CharField(max_length64)# 头像avatar models.CharField(max_length64)
3.迁移
python manage.py makemigrations
python manage.py migrate