Python Django API项目构建

2023-05-16

项目构建心得

    • Python Django项目构建心得
    • 一、基础
        • 1.1 虚拟环境
          • 1.1.1、安装
          • 1.1.2、创建虚拟环境
          • 1.1.3、激活、退出 虚拟环境
        • 1.2 Django命令
    • 二、项目构建
      • 2.1 创建项目
      • 2.2 构建分类配置文件
      • 2.3 安装好项目所需要的插件环境并生成requirements.txt文件
      • 2.4 将项目提交git
      • 2.5 创建一个auth模块app,并加入到APPS
      • 2.6 创建auth所需要的表,这里使用Mysql数据库
        • 2.6.1 切换连接到Mysql数据库
        • 2.6.2 编写models文件
      • 2.7 编写登录接口和处理路由
        • 2.7.1 安装配置redis连接
        • 2.7.2 编写简单的ApiResult
        • 2.7.2 编写登录接口
        • 2.7.3 编写路由配置
        • 2.7.4 编写认证装饰器 类似于SpringAOP
      • 2.8 编写用户CRUD接口和处理路由
      • 2.9 使用Django中间件实现访问日志记录和全局异常拦截
        • 2.9.1 访问日志记录
        • 2.9.2 全局异常拦截
    • 总结

Python Django项目构建心得

基于Python3.7

一、基础

1.1 虚拟环境

1.1.1、安装
pip3 install virtualenv
1.1.2、创建虚拟环境
virtualenv 环境名称 --python=python3.7
#创建的环境路径是在当前命令行所处路径下 比如:D:/python/环境名称,如果电脑上有多个Python版本可以指定对应版本python3.7,也可以直接使用python执行文件绝对路径:C:\python\python3.7.exe
1.1.3、激活、退出 虚拟环境
激活:
wim:
		>>> cd Scripts 进入虚拟环境 Scripts目录
		>>> activate.bat 激活虚拟环境
mac:
		>>> source 环境名称/bin/activate

退出
wim:
		>>> cd Scripts 进入虚拟环境 Scripts目录
		>>> deactivate.bat 退出虚拟环境
mac:
		>>> 任意目录 deactivate命令退出

#如果安装的是python3.7环境,建议使用Django1.11.28及以上版本

1.2 Django命令

1、创建Django项目
django-admin startproject 项目名称
2、启动服务器
python manage.py runserver 0.0.0.0:80
3、创建一个应用
python manage.py startapp sales
4、创建数据库
python manage.py migrate
5、检查项目指定模块common是否改变 如果有改变添加一个修改配置在对应app的migrations中
python manage.py makemigrations common
6、启动python shell脚本
python manage.py shell

二、项目构建

2.1 创建项目

项目基于Python3.7+Django1.11.28 使用自建虚拟环境创建

在这里插入图片描述

2.2 构建分类配置文件

在这里插入图片描述

引入代码
try:
    from .local_settings import *
except ImportError:
    pass

2.3 安装好项目所需要的插件环境并生成requirements.txt文件

1、生成requirements.txt文件
pip freeze > requirement.txt
2、安装requirements.txt文件中指定的所有插件
pip install -r requirements.txt

2.4 将项目提交git

提前在项目根目录创建一个.gitignore文件用于处理不需要提交的文件
#pycharm
.idea/

__pycache__/
*.py[cod]
*$py.class

# database migrations
*/migrations/*.py
!*/migrations/__init__.py

# Django
local_settings.py
*.sqllite3

2.5 创建一个auth模块app,并加入到APPS

在这里插入图片描述

2.6 创建auth所需要的表,这里使用Mysql数据库

2.6.1 切换连接到Mysql数据库

安装pip3 install mysqlclient
在这里插入图片描述

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': BASE_DIR / 'db.sqlite3',
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'pet_home',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    }
}

2.6.2 编写models文件

在这里插入图片描述

from django.db import models

# 角色表
class Role(models.Model):
    role_name = models.CharField(max_length=200)

# 用户表
class User(models.Model):
    user_name = models.CharField(max_length=200)
    account = models.CharField(max_length=200)
    password = models.CharField(max_length=200)
    roles = models.ManyToManyField(Role, through='UserRole')

# 菜单表
class Menu(models.Model):
    menu_name = models.CharField(max_length=200)


# 用户角色关联表
class UserRole(models.Model):
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    role = models.ForeignKey(Role, on_delete=models.PROTECT)


# 角色菜单关联表
class RoleMenu(models.Model):
    role = models.ForeignKey(Role, on_delete=models.PROTECT)
    menu = models.ForeignKey(Menu, on_delete=models.PROTECT)

在Terminal中执行生成语言
1、python manage.py makemigrations pet_auth
2、python manage.py migrate pet_auth

2.7 编写登录接口和处理路由

2.7.1 安装配置redis连接

1、因为保证登录状态需要使用redis首先安装redis
pip install django-redis==4.12.1
2、配置redis连接
在这里插入图片描述

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/2",  # 安装redis的主机的 IP 和 端口
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {
                "max_connections": 1000,
                "encoding": 'utf-8',
            },
            "DECODE_RESPONSES": True
            # "PASSWORD": "" # redis密码
        }
    }
}

2.7.2 编写简单的ApiResult

在这里插入图片描述

def success(data):
    result={
        "data": data,
        "msg": "success",
        "status": 200
    }
    return result


def error(msg):
    result = {
        "data": "",
        "msg": msg,
        "status": 500
    }
    return result

2.7.2 编写登录接口

在这里插入图片描述

from django.http import JsonResponse
from pet_auth.models import User
from utils.api import ApiResult
from django_redis import get_redis_connection
import uuid

conn = get_redis_connection("default")

# 登录接口
def login(request):
    account = request.GET.get("account", None)
    password = request.GET.get("password", None)

    try:
        iuser = User.objects.get(account=account)
        restUser = {
            "userName": iuser.user_name
        }
        if (iuser.password != password):
            print("密码错误")
            return JsonResponse(ApiResult.error("密码错误"))

        # 生成一个token储存到redis中
        token = str(uuid.uuid4())
        conn.set(token, str(restUser))

        restUser["token"] = token

        return JsonResponse(ApiResult.success(restUser))
    except User.DoesNotExist:
        # 记录错误日志
        print("用户不存在")
        return JsonResponse(ApiResult.error("用户不存在"))

2.7.3 编写路由配置

在这里插入图片描述
在这里插入图片描述

2.7.4 编写认证装饰器 类似于SpringAOP

1、编写
在这里插入图片描述

from django.http import JsonResponse
from utils.api import ApiResult

from django_redis import get_redis_connection
conn = get_redis_connection("default")

# 认证装饰器
def loginVal(func):
    def wrapper(request):
        print("认证装饰器")
        token = request.META.get("HTTP_TOKEN")
        redisToken = conn.get(token)
        # 当token不存在时不处理后续逻辑 直接抛出
        if (redisToken == None):
            return JsonResponse(ApiResult.error("用户未登录", 401))

        return func(request)
    return wrapper

2、使用
在这里插入图片描述

2.8 编写用户CRUD接口和处理路由

在这里插入图片描述

# 获取用户信息
@loginVal
def getUserInfo(request):
    token = request.META.get("HTTP_TOKEN")
    return JsonResponse(ApiResult.success(str(conn.get(token))))

# 新增用户
@loginVal
def insertUser(request):
    data = json.loads(request.body)
    user = User.objects.create(user_name=data["userName"], password=data["password"], account=data["account"])
    return JsonResponse(ApiResult.success(user.id))

# 修改用户
@loginVal
def updateUser(request):
    data = json.loads(request.body)
    try:
        user = User.objects.get(id=data["id"])
        user.user_name = data["userName"]
        user.password = data["password"]
        user.account = data["account"]
        user.save()
        return JsonResponse(ApiResult.success(data))
    except User.DoesNotExist:
        return JsonResponse(ApiResult.error())

# 删除用户
@loginVal
def deleteUser(request):
    data = json.loads(request.body)
    try:
        user = User.objects.get(id=data["id"])
        user.delete()
        return JsonResponse(ApiResult.success(data))
    except User.DoesNotExist:
        return JsonResponse(ApiResult.error())

2.9 使用Django中间件实现访问日志记录和全局异常拦截

2.9.1 访问日志记录

1、编写日志记录中间件
在这里插入图片描述

from django.utils.deprecation import MiddlewareMixin
from django.http import JsonResponse
from utils.api import ApiResult


# 处理请求日志中间件
class PetLog(MiddlewareMixin):
    def process_request(self, request):  # 在视图之前执行
        if request.META.get('HTTP_X_FORWARDED_FOR'):
            ip = request.META.get("HTTP_X_FORWARDED_FOR")
        else:
            ip = request.META.get("REMOTE_ADDR")
        print("请求IP: %s" % ip)
        print("请求地址:%s" % request.path)
        print("请求类型:%s" % request.method)
        print("浏览器编码:%s" % request.encoding)
        print("请求用户对象:%s" % request.user)

    # def process_response(self, request, response):  # 在视图之后
    #     print("md1  process_response 方法!", id(request))
    #     return response

2、将中间件加入Django配置
在这里插入图片描述

2.9.2 全局异常拦截

1、编写自定义异常
在这里插入图片描述

class PublicException(Exception):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return repr(self.msg)

2、编写全局异常拦截中间件
在这里插入图片描述

from django.utils.deprecation import MiddlewareMixin
from django.http import JsonResponse
from utils.api import ApiResult


# 用于处理全局异常中间件
class PetException(MiddlewareMixin):
    def process_exception(self, request, exception):  # 处理异常
        msg = "异常"
        if isinstance(exception,PublicException):
            msg = exception.msg
        return JsonResponse(ApiResult.error(msg))  # 返回错误信息

3、将中间件加入Django配置
在这里插入图片描述
4、使用自定义异常 直接将自定义异常抛出 交给中间件处理
在这里插入图片描述

总结

构建的Django项目很简单有很多不足的地方,在实际项目开发中可以在此基础之上做优化,该项目Demo具备一般API项目该有的功能(全局异常捕获,全局异常处理,访问日志记录,用户登录状态,统一参数返回),在实际开发是可以使用中间件对XSS、敏感字等进行处理,用户登录状态也可以使用中间件实现效果会比装饰器要好,可以使用装饰器来进行权限的控制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Django API项目构建 的相关文章

随机推荐

  • CubeMX生成的代码烧录一次后无法再烧录(识别)STM32,需按住reset后放开才能烧录

    序言 其实很早就遇见过这个问题 xff0c 但因为这个问题太小太基础了 xff0c 就没有做记录 但是过了很久过后再重新回来用CubeMX做STM32开发的时候却总是记不住这点小设置 xff0c 所以又回来写一下这个 这个小问题会在不同的软
  • 程序员晒出了15万的年终奖:辛苦一年,对结果很满意

    又是一年一度炫耀年终奖的日子了 xff0c 在互联网匿名社区 xff0c 有程序员晒出了自己刚到手的年终奖 xff0c 高达15之多的银行流水 xff0c 其称这是税后收入 xff0c 扣税就扣了3 5万之多 xff0c 但对这样的年终奖还
  • 撞库、脱库和洗库是什么意思

  • 解决新安装的 Arch Linux 在 GNOME 中搜狗输入法不显示候选词和输入延迟的问题

    问题描述 新安装的 Arch Linux 系统 在 AUR 中安装 fcitx sogoupinyin 后 fcitx 的图标不显示 xff0c 且切换到搜狗输入法后不显示候选词 xff0c 输入的延迟也极高 xff0c 切换回英文输入法后
  • hashCode和equals作用

    什么是hashCode hashCode 的作用是获取哈希码 xff0c 返回一个int整数 xff0c 作用是查找hashMap的索引位置 hashCode 在JDK的Object类中 xff0c 也就表明每一个类中都有此方法 hashC
  • python学习——while True的用法

    古月金真 while True 是python中经常会被应用到 下面通过个例子进行解释 xff1a 例子 xff1a 建立一个用户登录系统 xff0c 用户输入用户名和密码 xff0c 如果正确就可以进入系统 法一 xff1a d 61 古
  • linux下将gbk文件转换为utf-8

    titledatetagscategories linux下将gbk文件转换为utf 8 2019 11 23 10 49 58 0800 编码 problems 转自Linux下GBK文件编码批量转换UTF 8命令 在工作中 xff0c
  • ubuntu上不了网的解决方法(简便)

    用于我们对于ubuntu的使用比较多 xff0c 网络有时需要更改设置 下面笔者分享一个实用的方法 1 增加多一个网络连接 将鼠标移至左上角上下箭头 xff0c 之后点击爱编辑连接 xff08 不同版本操作方法不一样但其实都是一样的操作路径
  • C++ 快读快输模板

    C 43 43 快读快输模板 快读 span class token keyword inline span span class token keyword int span span class token function read
  • sql server2008支持json函数以及2016版内置json函数

    一 sql server2008支持json函数 1 json 转化成数据集合 1 xff09 转化用函数 CREATE FUNCTION dbo parseJSON 64 JSON NVARCHAR MAX RETURNS 64 hier
  • 家庭宽带 动态公网IP,使用腾讯云DDNS实现实时更新DNS解析记录

    解决DDNS问题 动态公网IP 环境说明 xff1a 我是家庭宽带 只能申请到动态的公网ip xff0c 好处是不花钱 xff0c 弊端是每次重启光猫 xff0c 都会重新获取一个新的公网IP 为解决此办法 xff0c 我尝试了很多个DDN
  • 用c语言实现一个简单的计算器(数据结构)

    概要 xff1a 主要以c语言为例对数据结构中写一个简易的计算器 xff08 计算整数间加减乘除括号运算 xff09 的算法进行大致讲述 xff0c 细说如何去实现符号优先级的比较的函数实现 注 xff1a 由于编辑器缘故 xff0c 本文
  • apache网页中文乱码解决方法

    apache的配置文件 xff1a 进入httpd conf xff0c 在文件的最后添加AddDefaultCharset gb2312 xff0c 注意 xff0c 新版本的apache是没有默认的AddDefaultCharset字段
  • 将ubuntu设置为NAS——搭建Jellyfin影音服务器

    Jellyfin安装 前提是你已经安装好了docker docker ps 查看docker 安装容器 docker ps a 下载docker jellyfin的镜像文件 sudo docker pull jellyfin jellyfi
  • CommonJS概述及使用

    在web开发中 xff0c 我们的js文件都是在html文件中引入 xff0c 在浏览器环境运行 但是在nodejs的环境中可没有html文件 xff0c 且nodejs中 xff0c 有且只有一个入口文件index js xff08 在执
  • HDFS(一)HDFS基本介绍

    HDFS基本介绍 HDFS的Master Slave结构HDFS角色作用简介HDFS 分块存储抽象成数据块的好处HDFS 副本机制名字空间 xff08 NameSpace xff09 NameNode 功能DataNode 功能机架感知原理
  • C++借助宏来实现由枚举值得到枚举变量名的字符串

    定义一个枚举 enum color span class token punctuation span RED span class token operator 61 span span class token number 0 span
  • 阿里云配置域名CDN加速

    前置条件 1 xff1a 阿里云账号 2 xff1a 已备案的域名 3 xff1a 拥有公网IP的服务器 登录控制台 新增源站 xff08 也就是你的云服务器IP xff09 按提示配置完成后进入到CDN管理页面 复制CNAME列的加速域名
  • Mybatis-PageHelper自定义count查询

    1 问题描述 使用分页插件pagehelper实现分页功能 xff0c 有个接口查询速度慢 2 问题原因 排查问题发现是因为在分页时 xff0c 查询总条数的sql执行慢 xff0c 而查询总条数的sql是在分页插件执行时 xff0c 在主
  • Python Django API项目构建

    项目构建心得 Python Django项目构建心得一 基础1 1 虚拟环境1 1 1 安装1 1 2 创建虚拟环境1 1 3 激活 退出 虚拟环境 1 2 Django命令 二 项目构建2 1 创建项目2 2 构建分类配置文件2 3 安装