PyCharm社区版创建Django基于DRF的纯后端项目

一、系统环境:

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

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值