Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
在授权登录验证前,需要对本项目的模型(Model)进行设计。设计模型时,需要考虑用户和应用之间有怎样的联系,用户可以添加多个应用和删除某个应用,在这样需求下,可以将用户和应用设置成多对多的关系,即一个用户可以关联多个应用。
一、模型(Model)设计
本项目的User 模型,没有继承Django自带的AbstractBaseUser类。而是 models.Model 自定义用户模型。models.ManyToManyField 是用户和应用多对多的外键。
class User(models.Model): open_id = models.CharField(max_length=32, unique=True, help_text="用户ID", verbose_name="用户ID") nickname = models.CharField(max_length=256, help_text="用户昵称", verbose_name="用户昵称") # 菜单 app menu = models.ManyToManyField(App, help_text="关联应用", verbose_name="关联应用")
class Meta: # 添加索引,数组 indexes = [ # 组合索引 models.Index(fields=['open_id', "nickname"]), ]
def __str__(self): return "用户昵称:%s" % self.nickname
本项目的应用APP 模型
class App(models.Model): # 唯一 id appid = models.CharField(primary_key=True, max_length=32, verbose_name="appid", help_text="appid") # 分类 category = models.CharField(max_length=128, verbose_name="分类", help_text="分类") # 功能名字 application = models.CharField(max_length=128, verbose_name="功能名字", help_text="功能名字") # 中文名字 name = models.CharField(max_length=128, verbose_name="中文名字", help_text="中文名字") # 发布时间 publish_date = models.DateField(verbose_name="发布时间", help_text="发布时间") # 请求链接 url = models.CharField(max_length=128, verbose_name="请求链接", help_text="请求链接") # 描述 desc = models.TextField(verbose_name="描述", help_text="描述") # 字段序列化 def to_dict(self): return { "appid": self.appid, "category": self.category, "application": self.application, "name": self.name, "publish_date": self.publish_date, "url": self.url, "desc": self.desc }
def __str__(self): return str(self.to_dict())
def __repr__(self): return str(self.to_dict())
二、服务端登录验证
流程
1.使用微信小程序登录和获取用户信息Api接口
2.把Api获取的用户资料和code发送给django后端
3.通过微信接口把code换取成openid
4.后端将openid作为用户名和密码
5.后端通过JSON web token方式登录,把token和用户id传回小程序
6.小程序将token和用户id保存在storage中
下次请求需要验证用户身份的页面时,在header中加入token这个字段
① 小程序获取用户信息
② 用户资料和code发送给django后端
③ 微信接口把code换取成openid
使用 wx.login 的临时 code 到微信提供的 code2session 接口授权。
使用Django设置Session,Session就是保存了会话里面的数据,通过request.session进行获取。
https://api.weixin.qq.com/sns/jscode2session?appid=appid&secret=secret&js_code=code&grant_type=authorization_code
获取步骤: (1)获得appid,secret,js_code (2)用appid,secret,js_code分别替换如上接口地址的APPID、SECRET、JSCODE,其它不变,组装成完整的地址。