一、系统环境:
windows 10 企业版(21H2)
已安装 Python 3.12.0
已安装 PyCharm 2023.2.5 (Community Edition)
二、创建 Django 项目
1.键盘 Win+R 调出‘运行’输入cmd打开电脑自带的命令行
2.用命令 pip install django 安装 Django (如已安装就跳过)
3.cd到要创建项目的文件夹下用 django-admin startproject 创建 Django 项目 (iotback是我的项目)
pip install django
cd /d e:/python/django
django-admin startproject iotback
三、用 PyCharm 打开 Django 项目
1.其实就是在 PyCharm 里 Open... 刚才创建的项目那个文件夹 iotback
2.在弹出的对话框中勾选 Trust projects in xxx ,然后点击 Trust Project 信任该并打开目录
四、创建新的虚拟环境(根据自己的需求可以不用虚拟环境)
1.第一次用 PyCharm 打开项目是没有配置虚拟环境的,点开项目下的 manage.py 文件,出现提示点击 Configure Python Interpreter 进行环境配置,这个时候看自己的情况,如果想用之前配置过的虚拟环境,可以选择之前配置过的,如果没有,就点击 Interpreter Settings...
(也可以依次点击 设置 - Settings... - Project:iotback - Python Interpreter 进入)
2.创建新的虚拟环境,然后依次点击 OK 关闭设置窗口,新的虚拟环境就创建好了
五、安装必要的包
1.刚创建的虚拟环境应用后,重新启动一下 PyCharm ,打开 PyCharm 命令行可以发现已经在虚拟环境中,敲入 pip list 发现现在是没有包的(连django也没有)
2.在虚拟环境中安装必要的包,pyjwt 是用来做 token 用户认证的
pip install django
pip install djangorestframework
pip install pyjwt
::安装django会同时安装一些依赖包 Successfully installed asgiref-3.8.0 django-5.0.3 sqlparse-0.4.4 tzdata-2024.1
::DRF安装完成 Successfully installed djangorestframework-3.15.0
::pyjwt安装完成 Successfully installed pyjwt-2.8.0
________________________________.-~割~-.________________________________
六、开始项目
1.本项目是针对前后端分离模式,专门用来做小程序的后端API的,所以要创建一个 api 应用
python manage.py startapp api
2. 在项目的 settings.py 的 INSTALLED_APP 中注册 DRF 模块和 api 应用,即在列表末尾添加:
'api.apps.ApiConfig',
'rest_framework',
3.创建 jwt 认证中间件:在 api 文件夹下创建 extensions 文件夹并在其中创建 auth.py
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from django.conf import settings
import jwt
class JwtQueryParamsAuthentication(BaseAuthentication):
def authenticate(self, request):
# token = request.query_params.get('token')
token = request.headers.get('token')
salt = settings.SECRET_KEY
try:
payload = jwt.decode(token, salt, algorithms='HS256')
except jwt.exceptions.ExpiredSignatureError:
raise AuthenticationFailed({'code':1003, 'error':'token已失效'})
except jwt.DecodeError:
raise AuthenticationFailed({'code':1003, 'error':'token认证失败'})
except jwt.InvalidTokenError:
raise AuthenticationFailed({'code':1003, 'error':'非法的token'})
return payload, token
import datetime
def createJwtToken(payload, timeout=1):
salt = settings.SECRET_KEY
payload['exp'] = datetime.datetime.now(datetime.UTC) +datetime.timedelta(minutes=timeout)
headers = {'typ':'jwt', 'alg':'HS256'} # 指定token类型和算法
token = jwt.encode(payload=payload, key=salt, algorithm='HS256', headers=headers)
return token
4.在项目的 settings.py 的末尾为全局视图添加用户认证中间件
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ['api.extensions.auth.JwtQueryParamsAuthentication',]
}
5.在 api 应用的 models.py 中添加数据库模型
from django.db import models
class Users(models.Model):
object = models.Manager()
username = models.CharField(max_length=32)
password = models.CharField(max_length=20)
class Devices(models.Model):
object = models.Manager()
devSn = models.IntegerField()
devType = models.CharField(max_length=32)
devName = models.CharField(max_length=32)
6.命令行中为数据模块执行迁移
python manage.py makemigrations
python manage.py migrate
7.在项目的 urls.py 中添加登录和修改用户的路由,并在后面使用注册路由的方式添加路由用于登录后访问资源
from django.contrib import admin
from django.urls import path, re_path
from api import views
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', views.LoginView.as_view()),
re_path('user/(?P<un>[a-zA-Z]{1}[a-zA-Z0-9]{2,16})', views.UserView.as_view()),
]
from rest_framework import routers
router = routers.DefaultRouter()
router.register('device', views.DevicesView, basename='book')
urlpatterns += router.urls
8.在 api 应用的 views.py 中添加模型序列化器和视图类
from .models import Users
from .models import Devices
from rest_framework import serializers
class UsersSerializers(serializers.ModelSerializer):
class Meta:
model = Users
fields = '__all__' # ['username','password']
class DevicesSerializers(serializers.ModelSerializer):
devId = serializers.IntegerField(source='devSn') # 配合前端重定义字段名
class Meta:
model = Devices
exclude = ['devSn'] # exclude 和 fields 不能同时使用
########################################################################
from rest_framework.views import APIView
from rest_framework.response import Response
from api.extensions.auth import createJwtToken
from rest_framework.viewsets import ModelViewSet
class UserView(APIView): # 修改和删除用户信息需要先登录成功
def put(self, request, un): # 修改用户信息
user = Users.object.filter(username=un).first()
ser = UsersSerializers(instance=user, data=request.data)
if not ser.is_valid():
return Response(ser.errors)
ser.save()
return Response(ser.data)
def delete(self, request, un): # 删除用户信息
password = request.data.get('password')
user = Users.object.filter(username=un, password=password).first()
if not user:
return Response({'code':1004, "error":"用户名或密码不正确"})
user.delete()
return Response({'code':200, 'result':'删除用户成功'})
class LoginView(APIView): # 登录或注册、查询用户是否存在,跳过登录认证
authentication_classes = []
def get(self, request): # 查询用户名是否存在
username = request.query_params.get('username')
if Users.object.filter(username=username).first():
return Response({'result':True})
return Response({'result':False})
def post(self, request):
username = request.data.get('username')
pwd = request.data.get('password')
userInfo = Users.object.filter(username=username).first()
if not userInfo: # 用户不存在则添加用户
ser = UsersSerializers(data=request.data)
if not ser.is_valid():
return Response(ser.errors)
ser.save()
token = createJwtToken({'id': ser.data.get('id'), 'name': username}, 5)
return Response({'code':201, "result":"用户已创建,登录成功", 'token': token})
if not userInfo.password == pwd:
return Response({'code':1000, 'error':'密码错误'})
token = createJwtToken({'id':userInfo.id, 'name':userInfo.username}, 5)
return Response({'code':1001, 'result':'登录成功', 'token':token})
class DevicesView(ModelViewSet):
queryset = Devices.object.all()
serializer_class = DevicesSerializers
10.运行项目
python manage.py runserver
11.用 postman 测试 API