创建第一个测试项目
安装djanago
1 | pip install Django==4.2.1 |
创建项目
1 | django-admin startproject [project_name] |
可以看到项目已经创建
然后在pycharm打开项目
项目基本结构
- wsgi.py - 配置WSGI兼容的Web服务站点
- asgi.py - 配置ASGI兼容的Web服务站点
- urls.py - 配置站点转发的路径
- settings.py - Django项目的全局配置文件(重要)
添加项目模块
1 | python manage.py startapp [module_app] |
执行以下命令创建第一个模块
1 | python manage.py startapp first_module |
可以看到第一个模块已经创建成功
添加到settings.py
模块文件结构
- views.py - 视图层,相当于Web开发中的Controller。用于拦截请求,进行逻辑处理并返回数据
- tests.py - 用于编写测试用例
- models.py - 模型层,用于存放与数据库实体相对应的model
- apps.py -
- admin.py - 一般不用
运行项目
1 | python manage.py runserver [port] |
使用7000端口启动项目
1 | python manage.py runserver 7000 |
控制台
输入URL访问 http://127.0.0.1:7000/
连接数据库
连接MySQL
先安装mysql客户端
1 | pip3 install mysqlclient |
启动docker数据库
通过UI启动
或通过命令启动
settings.py添加数据库信息
如果能正常启动则说明配置成功
1 | python3 manage.py runserver 8000 |
DRF实现登录功能
DRF概述
DRF(Django rest framework) 基于Django的封装,是Restful风格的开发框架
官方网站 https://www.django-rest-framework.org
安装
1 | pip3 install djangorestframework |
添加到settings.py
创建user和item模块
1 | python manage.py startapp user |
添加到settings.py
数据表设计
User表
1 | from django.db import models |
Item表
1 | create table `item_tbl`( |
User表 - 根据class自动在mysql db创建
1 | python manage.py makemigrations |
数据表已经创建
Item表 - 在数据库创建表,并自动在项目里生成对应的model class
运行命令生成class
- 如果需要追加则把
>替换为>>
1 | python manage.py inspectdb --database default item_tbl > item/models.py |
对应的class自动生成
在user_tbl插入一条记录作为第一个用户
1 | insert into user_tbl(user_name, is_delete, password) VALUES('test1', 0, '123456'); |
前端UI准备
前后端分离,使用Vue + axios + Bootstrap快速开发
UI source code https://github.com/nauvalazhar/bootstrap-4-login-page
index.html引入vue和axios
1 | <script src="https://cdn.jsdelivr.net/npm/vue@3.4.21"></script> |
修改django主页
settings.py
添加路由和controller
urls.py
views.py
启动效果
添加后端数据查询接口
目的:连接到数据库查询用户表,并且校验用户密码
项目入口文件urls.py添加user路由
User模块下添加序列化器
*文件名必须为serializers.py
1 | from user.models import User |
User模块下views.py添加控制器逻辑
1 | from django.shortcuts import render |
User模块下urls.py添加路由拦截规则
通过postman测试get接口, user id为1
可以看到正常返回了db里的用户信息
目前可以看到访问api返回的是Json数据,而不是状态码
需要添加一个工具类,并且将返回结果进行封装
修改user/views.py
登录改造
一般业务场景下,不会用user_id进行登录,而是使用账号和密码
views.py
这里引入了
ViewSetMixin,用于区分两个get请求- http://127.0.0.1:8000/user/ -> 转发到
login方法, 同时会发送一个request body - http://127.0.0.1:8000/user/1-> 转发到
get方法,参数只有一个id,没有request body
- http://127.0.0.1:8000/user/ -> 转发到
urls.py也要做相应的改动
可以看到同一个get url可以兼容不同的输入参数
添加前端返回结果
通过@click绑定点击事件
1 | <script src="https://cdn.jsdelivr.net/npm/vue@3.4.21"></script> |
JWT认证
Web app的会话控制
- Cookie -> 存储在浏览器(客户端)上的小文件,用于保存用户信息的key-value文件
- Session -> 存储在服务端,用于保存用户会话所需的属性及配置信息。如果用户过多会导致占用的内存过大
- Token -> 用户访问API资源所需的凭证,一般由身份标识、时间戳、用户必要信息等内容组成,是一串加密的字符串
响应流程
JWT:Json web token
JWT格式
1 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c |
通过.连接成的三段字符串
JWT组成
- 第一段:header,指头信息包含算法,字符串是由头信息进行base64加密
- 第二段:payload,指系统自定义存储的信息,如用户名、过期时间等,并进行base64加密
- 第三段:verify signature,指需要系统定义 “salt”,或者称为密钥
JWT服务端解密
获取token,例如
1 | request.GET.get("token") |
然后通过.把字符串分割成三个部分
- 第一步:用base64解密得到
header头部信息 - 第二步:用base64解密得到系统中的
info用户数据 - 第三步:判断 base64 (header + info + 系统密钥) 是否等于分割后的第三部分
*要注意保护好系统的密钥
安装pyjwt
1 | pip install pyjwt |
JWT工具类测试
Django在初始化项目的时候会自动生成一个key,可以使用这个作为密钥
也根据自定义算法生成随机字符串
编写工具类生成token
设置token过期时间为5分钟
jwt_demo.py
1 | import datetime |
运行结果
JWT登录功能整合
首次登录时返回token
1.添加JWT工具类
2.添加View方法
3.添加路由
4.测试接口
成功返回token
针对非登录接口添加JWT验证
1.针对url中携带token进行验证
jwt工具类添加方法
View中的方法也做相应的修改
测试
1.先登录一次拿到token
2.在参数中使用token,然后发送GET请求
控制台也会打印出token的信息
3.等待token过期后再次发起请求
控制台显示token失效
针对请求header中携带token的验证方式
添加工具类
View里做相应的修改
测试接口,也是先拿到token
JWT全局配置
如果每一个类都添加JWT验证类,不方便维护
在settings.py中添加全局配置
所有的url都会被拦截
View里做相应的修改
注释掉类里的authentication
需要验证的方法里面只需要添加如下代码即可
1 | # 判断token状态 |
测试
设置定时任务
安装APSchedule
1 | pip install django_apscheduler |
settings.py添加
执行如下命令完成DB的更改
1 | python3 manage.py makemigrations |
会在DB中创建APScheduler所需的表
修改app folder中的urls.py
启动APP即可看到效果
代码
1 | from apscheduler.schedulers.background import BackgroundScheduler |