博客项目第二天

一、用户系统

一、用户model
(1)新建userapp:python manage.py startapp user
(2)setting文件的APPS中加入user
(3)model中的类继承models.MODEL类,字符使用model.charfield类型;email使用model.emailfield类型;图像使用model.Imagefield,参数upload_to说明图片文件上传到的MEDIA_ROOT子路径下,此处需要在setting中配置(匹配上传文件的url)MEDIA_URL,(上传到的路径名)MEDIA_ROOT。需要使用在主url中配置。urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT),
时间字段使用DateTimeField,auto_now_add表示记录创建时间,auto_now表示记录更新时间

二、注册
1)、前端ajax的编写
function regist(){
var username = $(’.username’).val();
var email = $(’.email’).val();
var password_1 = $(’.password_1’).val();
var password_2 = $(’.password_2’).val();
var phone = $(’.phone’).val()
var sms_num = $(’.sms_num’).val()
var post_data = {‘username’:username,‘email’:email,‘password_1’:password_1,‘password_2’:password_2,‘phone’:phone,‘sms_num’:sms_num};
$.ajax(({
type:“post”,
contentType:“application/json”,
dataType:“json”,
data:JSON.stringify(post_data),
url:“http://127.0.0.1:8000/v1/users”,
success:function (result){
if(result.code ==200){
alert(“注册成功”)
}
else
alert(result.error)
}
}))
}

在主路由配置url,使用视图类绑定时需要在后面添加.as_view(),例如:
path(‘v1/users’, user_views.UserViews.as_view())

编写user.view下的函数或者视图类。视图类需要继承(View),类的方法会自动匹配请求的方式。

用户名存在判断,使用filter会返回一个queryset,而get会返回唯一匹配的对象

密码加密存储:生成一个hashMD5对象:p_m=hashlib.md5(),使用此对象加密字符串,p_m.update(‘字符串’.encode()),读取加密后的结果p_m.hexdigest()

三、登录功能
创建dtoken应用,注册应用。配置主路由,编写ajax请求
function login(){
// var username= ( ′ . u s e r n a m e ′ ) . v a l ( ) / / v a r p a s s w o r d = ('.username').val() // var password= (.username).val()//varpassword=(’.password’).val()
//
// var post_data = {‘username’:username,‘password’:password}
// $.ajax(({
// type:“post”,
// contentType:“application/json”,
// data:JSON.stringify(post_data),
// url:“http://127.0.0.1:8000/v1/tokens”,
// success:function (result){
// if(result.code==200){
// window.localStorage.setItem(‘dnblog_token’,result.data.token);
// window.localStorage.setItem(‘dnblog_user’,result.username)
// window.location.href = ‘/’+result.username+’/topics’
// }
// else
// alert(result.error)
// }
// }))
// }

编写view函数,校验用户名和密码,使用get函数查看用户是否存在,注意使用try避免报错。使用hashmd5对密码加密,进行比对。p_w=hashlib.md5(), p_w.update(’’.encode),p_w.hexdigest()

3、会话状态的保存
cookie存在浏览器上,浏览器每次发请求自动将cookies提交至浏览器。服务器存储压力小,但是用户名,用户ID,明文存储不安全,可能被篡改。
session讲会话存储在服务器数据库中,需要借助cookies发送sessionid。服务器集中式管理,安全,但是服务器存储压力大。
JWT(JSON WEB TOKEN)规范用来认证用户信息,使用服务器的key对字符串加密,再返回给客户端,客户端存储。需要验证时再将jwt传送给服务器。历史:base64-》HMAC-SHA256-》JWT。两个点把字符串分割为三部分字典,第一部分为header,包含算法(alg)和(typ);第二部分为payload,包含公有声明(内建关键字,可选)和私有声明,公有声明exp表示过期时间,iss表示签发者,iat表示创建时间,aud表示签发的群体。私有声明可随意自定义添加;第三部分为sinature,是对header+payload使用key和算法加密后的结果。

校验JWT:1)解析header,确认alg 2)签名校验:根据header和payload按alg指明的算法进行签名,将签名结果域传过来的sign进行对比,若一致,则通过。 3)获取payload内容

Python中使用jwt:安装pyjwt:pip3 install pjwt
使用:import jwt
jwt.encode(payload,key,algorithm) 参数:payload为声明,参数类型为dict。 key为加密用到的key,参数类型为str,algorithm:加密算法为HS256,参数类型为str。 返回值为token串,类型为bytes

jwt.decode(token,key)
返回:payload明文 类型:dict
参数:token串,参数类型:bytes/str ;key:自定义的加密key,需要跟encode中的key保持一致,参数类型为str;issuer:发布者,若encode payload中添加’iss’字段,则肯针对该字段校验,若jss校验失败,则抛出jwt.InvalidissuerError

特殊说明:若encode的时候payload中添加了exp字段,则exp字段的值需为当前时间戳+此token的有效时间,力图希望token300庙后过期{‘exp’:time.time()+300};在执行decode时,若检查到exp字段,切token过期,则抛出jwt.ExpiredSignatureError

前后端分离场景下使用后jwt
原则:
1、jwt签发后,交由浏览器存储(F12,存储)
2、浏览器可将其存储在‘本地存储’中,本地存储按域隔离,不带时间周期,不会过期,不会自动提交数据,提交需要自己取出来提交。
3、需要用户登录才会使用的功能,前端ajax需要即将jwt传至后端;可放在请求头中发送。

后端将token返回给前端,前端在success的返回结果中使用windows.local.setItem(‘dnblog_token’,result.data.token)

需要校验时,在前端使用window.localStorage.getItem(‘dnblog_token’);取出前端本地存储的token(空返回nil),然后再ajax中加入beforesend:function(request){request.setRequestHeasder(‘Authorization’,token)}
,作用是在请求头中加入一个Authorization,值是变量token的值。

用户系统,修改个人系统

修改头像:
前端上传文件
formdata = new FormData(); //生成一个form表单
formdata.append(“avatar”,$("#avatar")[0].files[0]);//生成表单框,获取id为avater的表单的数据。

$(‘xx’)[0].files[0]

①首先得明白jQuery对象只能使用jQuery对象的属性和方法,JavaScript对象只能使用JavaScript对象的属性和方法;

②files[0]是JavaScript的属性;

( ′ x x ′ ) 是 j Q u e r y 对 象 , ('xx')是jQuery对象, (xx)jQuery(‘xx’)[0]是将jQuery对象:$(‘xx’)转换为JavaScript对象,这样才可以使用JavaScript对象的属性和方法;

④我们再看这行代码的背景,HTML5支持multiple属性,即可能会添加multiple属性并赋值:multiple=“multiple”,即,这样一次性可同时上传多张图片,所以获得一张图片的方法就是:$(‘xx’)[0].files[0]

⑤扩展:

( ′ x x ′ ) [ 0 ] . f i l e s [ 0 ] . s i z e 可 获 得 文 件 的 大 小 , 单 位 是 字 节 ( B ) , 使 用 ('xx')[0].files[0].size可获得文件的大小,单位是字节(B),使用 (xx)[0].files[0].sizeB使(‘xx’)[0].files[0].size可用于判断文件的大小。

后端获取文件 request.FILES[‘avatar’] #获取上传的文件。
找到数据库对应的对象,对象.save()更新对象

jwt校验:使用装饰器

(1)类中的方法使用装饰器:使用@method_decorator(装饰器名)包括装饰器名。@method_decorator(logging_check)
(2)前端已经将token放进请求头的AUTHORIZATION,后端装饰器获取token=request.META.get(‘HTTP_AUTHORIZATION’)。
(3)装饰器中使用jet.decode()解析token,使用字典取值方法获取对应的值
(4)在装饰器中对request对象使用orm增加一个user对象属性,对应请求的username,再传送给被修饰函数,避免了发生一个用户登录而修改其余用户的信息。

短信接入

云通信平台,使用类更加灵活,可以使用多个平台。了解云通信平台的使用方法,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值