广州广告公司排行榜,湖南专业关键词优化服务水平,工程建设的基本步骤,外销网站有哪些文章目录 一、用户认证系统二、案例#xff1a;登陆认证2.1 平台登入2.2 平台登出2.3 login_required装饰器 三、Django Session管理3.1 Django使用Session3.1.1 Cookie用法3.1.2 Session用法 3.2 案例#xff1a;用户登录认证 四、Django CSRF安全防护机制 一、用户认证系统… 文章目录 一、用户认证系统二、案例登陆认证2.1 平台登入2.2 平台登出2.3 login_required装饰器 三、Django Session管理3.1 Django使用Session3.1.1 Cookie用法3.1.2 Session用法 3.2 案例用户登录认证 四、Django CSRF安全防护机制 一、用户认证系统 Django内置一个用户认证系统使用auth模块实现。auth模块提供了登录、注册、效验、修改密码、注销、验证用户是否登录等功能。 Django默认创建的数据库表。 表名作用auth_user用户表auth_user_groups用户所属组的表auth_user_user_permissions用户权限表auth_group用户组表auth_group_permissions用户组权限表auth_permission存放全部权限的表其他的表的权限都是从此表中外键连接过去的django_session保存HTTP状态django_migrations数据库迁移记录
二、案例登陆认证
2.1 平台登入
1.登陆成功进入平台首页登陆失败返回错误信息。
###################################################
1、定义url路由规则ORM/urls.py文件。
from django.contrib import admin
from django.urls import path,include,re_path
from ORM import views
urlpatterns [path(admin/, admin.site.urls),re_path(^$,views.home),path(myapp/,include(myapp.urls)),path(login/,views.login)
]
###################################################
2、定义视图ORM/views.py文件。
from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
def home(request):return render(request,index.html)
def login(request):if request.method GET:return render(request, login.html)elif request.method POST:username request.POST.get(username)password request.POST.get(password)user auth.authenticate(usernameusername, passwordpassword)if user:##验证通过后将session信息保存到数据库中。auth.login(request, user) return redirect(/)else:msg 用户名或密码错误return render(request,login.html,{msg:msg})
###################################################
3、定义html模板templates/login.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title管理后台页面/title
/head
body
ht欢迎访问管理后台/ht
form action methodpost用户名 : input typetext nameusernamebr密码 : input typetext namepasswordbrbutton typesubmit登录/buttonspan stylecolor: red{{ msg }}/span
/form
/body
/html
###################################################
4、平台首页渲染模板templates/index.html新增”退出登录“按钮。
!DOCTYPE html
html langen
headmeta charsetUTF-8title平台首页/title
/head
body
h1网站首页/h1
a href/logoutbutton退出登录/button/a
/body
/html2.进入django管理后台新增一个测试用户xiaoming添加auth权限。 3.测试效果。
2.2 平台登出 就是清空django_session表中记录的用户登录状态信息若数据存在该表中则认定处于登陆状态删除数据则认定登出。 1.退出登录返回到登陆页面。
###################################################
1、定义url路由规则ORM/urls.py文件。
from django.contrib import admin
from django.urls import path,include,re_path
from ORM import views
urlpatterns [path(admin/, admin.site.urls),re_path(^$,views.home),path(myapp/,include(myapp.urls)),path(login/,views.login),path(logout/,views.logout), ##新增url
]
###################################################
2、新增视图ORM/views.py文件。
def logout(request):# 清除当前用户的session信息auth.logout(request)return redirect(/login)2.3 login_required装饰器 login_required装饰器判断用户是否登录如果没有登录引导至登录页面登录成功后跳转到目的页面。 1.在settings.py文件设置没有登录默认跳转页面。
##文件末尾添加。
LOGIN_URL /login/2.在需要登录后才能访问页面的视图添加装饰器。
from django.contrib.auth.decorators import login_requiredlogin_required() ##语法糖引用装饰器。
def user_add(request):............3.效果验证。
三、Django Session管理 Session与Cookie是什么? 网站采用是HTTP协议它本身就是一个无状态的记不住我们上次来浏览器上做了什么事。这时服务器给每个用户贴了一个小纸条上面记录了服务器给我们返回的一些信息。后面服务器看到这张小纸条就知道我们是谁了。这个小纸条就是Cookie。 Cookie工作原理 浏览器第一次访问服务器时服务器此时肯定不知道它的身份所以创建一个独特的身份标识数据格式为keyvalue放入到Set-Cookie字段里随着响应报文发给浏览器。浏览器看到有Set-Cookie字段以后就知道这是服务器给的身份标识于是就保存起来下次请求时会自动将此keyvalue值放入到Cookie字段中发给服务器。服务器收到请求报文后发现Cookie字段中有值就能根据此值识别用户的身份然后提供个性化的服务。 Session的作用 试想一下如果将用户账户的一些信息都存入Cookie中的话一旦信息被拦截那么所有的账户信息都会可能被泄露丢这是不安全的。所以就出现了Session在一次会话中将重要信息保存在Session中浏览器只记录SessionId一个SessionId对应一次会话请求。 3.1 Django使用Session
3.1.1 Cookie用法 在settings.py配置文件中设置客户端Cookie。 参数描述SESSION_COOKIE_NAME “sessionid”Session的cookie保存在浏览器上时的key即sessionid随机字符串默认SESSION_COOKIE_PATH “/”Session的cookie保存的路径默认SESSION_COOKIE_DOMAIN NoneSession的cookie保存的域名默认SESSION_COOKIE_SECURE False是否Https传输cookie默认SESSION_COOKIE_HTTPONLY True是否Session的cookie只支持http传输默认SESSION_COOKIE_AGE 1209600Session的cookie失效日期2周默认SESSION_EXPIRE_AT_BROWSER_CLOSE False是否关闭浏览器使得Session过期默认SESSION_SAVE_EVERY_REQUEST False是否每次请求都保存Session默认修改之后才保存默认
1.设置Cookie过期时间单位s。
##ORM/settings.py文件末尾添加此行。
SESSION_COOKIE_AGE 30*602.设置关闭浏览器使得Session过期。
##ORM/settings.py文件末尾添加此行。
SESSION_EXPIRE_AT_BROWSER_CLOSE True3.1.2 Session用法 在视图中操作Session。 参数描述request.session[‘key’] value向Session写入键值request.session.get(‘key’,None)获取Session中键的值request.session.flush()清除Session数据request.session.set_expiry(value)Session过期时间
1.自定义向Session写入键值前端可以拿到该value值。
3.2 案例用户登录认证
1.自己实现登陆验证功能。
############################################################################
##根据上文内容将login接口试图修改成如下内容。
def login(request):if request.method GET:return render(request, login.html)elif request.method POST:username request.POST.get(username)password request.POST.get(password)if username qingjun and password citms123:#登录成功is_login设置为Truerequest.session[is_login] True request.session[ username] username #保存用户名到数据库。return redirect(/)else:msg 用户名或密码错误 !return render(request,login.html,{msg: msg})############################################################################
1、定义装饰器可以给其他视图引用新增文件ORM/main.py。
from django.shortcuts import render,HttpResponse,redirect
def self_login_required(func):def inner(request):is_login request.session.get(is_login, False)if is_login:return func(request)else:return redirect(/login)return inner
############################################################################
2、引用装饰器。
from ORM.main import self_login_required
self_login_required
def home(request):return render(request, index.html)2.查看效果。
四、Django CSRF安全防护机制 概念 CSRFCross Site Request Forgery跨站请求伪造实现的原理是CSRF攻击者在用户已经登录目标网站之后诱使用户访问一个攻击页面利用目标网站对用户的信任以用户身份在攻击页面对目标网站发起伪造用户操作的请求达到攻击目的。 Django怎么验证一个请求是不是CSRF Django处理客户端请求时会生成一个随机Token放到Cookie里一起返回然后需要前端每次POST请求时带上这个Token可以放到POST数据里键为csrfmiddlewaretoken或者放到请求头键为X-CSRFTokenDjango从这两个位置取每次处理都会拦截验证通过比对两者是否一致来判断这个请求是不是非法非法就返回403状态码。 可以携带CSRF Token发送给服务端的方法 from表单添加{% csrf_token %}标签表单会携带一同提交。如果你是Ajax请求需要把csrf token字符串也是通过拿{% csrf_token %}标签产生的值放到data里一起提交并且键名为csrfmiddlewaretoken或者放到请求头传递服务端。指定取消某函数视图CSRF防护。 1.Django默认启用CSRF保护机制当有post请求时就会被拦截。 2.此时可以给html模板中添加csrf标签浏览器可以其值与表单一起提交给服务端。 3.还有其他两种方式。
##########################################################
方式2不建议使用建议在html模板中添加标签方式返回。
from django.views.decorators.csrf import csrf_exempt
csrf_exempt
def index(request):
return render(request, index.html)
##########################################################
var csrf_token $([namecsrfmiddlewaretoken]).val();
var data {id: 123, csrfmiddlewaretoken: csrf_token};
$.ajax({type: POST,url: /api,data: data,dataType: json
})