Django前后端分离之后端实践2

小实践:实现用户登录、注销及ORM管理功能、事务开启小实践

models.py

class Books(models.Model):
    id = models.CharField(primary_key=True,max_length=20,verbose_name="图书ID")
    name = models.CharField(max_length=20,verbose_name='图书名称')
    status = models.BooleanField(default=False,verbose_name='是否出借',blank=True)
    class Meta:
        db_table = 'books'
        verbose_name = '图书表'
    def __str__(self):
        return self.name

class Record(models.Model):
    book = models.ForeignKey('Books',on_delete=models.CASCADE,verbose_name="图书")
    name = models.CharField(max_length=20,verbose_name='借书姓名')
    s_time = models.DateTimeField(auto_created=True,verbose_name='借书时间',auto_now=True) # auto_created  自动创建当前时间
    e_time = models.DateTimeField(auto_created=True,verbose_name='还书时间',auto_now=True)  # auto_now 任意一个字段变更都会自动更新时间
    state = models.BooleanField(default=False,verbose_name='是否归还',blank=True)
    class Meta:
        db_table = 'records'
        verbose_name = '图书记录'

 urls.py[注意:路由结尾要记得加$符号,负责会匹配其他的视图函数]

from django.contrib import admin
from django.urls import path,re_path,include
from news import views


urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^news/',include('news.urls')),
    re_path(r'logout/$',views.LogoutView.as_view()),
    re_path(r'login/$',views.LoginView.as_view()),
    re_path(r'book/$',views.BookView.as_view()),
    re_path(r'book/hanlde/$',views.RecordView.as_view())
]

用户登录注销:

from django.http import HttpResponse,JsonResponse
from django.views import View
from django.contrib.auth import authenticate,logout,login

class LogoutView(View):
    def get(self,request):
        logout(request)
        return JsonResponse({'code':200,'message':'已退出登录'},status=200)

class LoginView(View):
    def post(self,request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(request,username=username,password=password)
        if user is not None:
            login(request,user)
            return JsonResponse({'code':200,'message':'登录成功'})
        else:
            return JsonResponse({'code':400,'message':'登录失败'})

admin.py  可后台查看数据

from .models import Books,Record
class BookAdmin(admin.ModelAdmin):
    list_display = ['id','name','status']

class RecordAdmin(admin.ModelAdmin):
    list_display = ['id','book','name','s_time','e_time','state']

admin.site.register(Books,BookAdmin)
admin.site.register(Record,RecordAdmin)

 ORM功能的增删改成实现

class BookView(View):
    def get(self,request):
        if not request.user.is_authenticated:
            return JsonResponse({'code':2002,'messages':"认证失败你没有权限访问,请重新登录"})
        bs= Books.objects.all()
        result = []
        for i in bs:
            item = dict(id=i.id,name=i.name,status=i.status)
            result.append(item)
        return JsonResponse({'code':200,'data':result,'message':'ok'},safe=False)
    def post(self,request):
        pass
        import json
        # param =request.POST if len(request.POST)> 0 else json.loads(request.body.decode())
        id = request.POST.get('id')
        name = request.POST.get('name')
        try:
            Books.objects.create(id=id,name=name)
        except Exception as e:
            return JsonResponse({'code':2001,'message':'书籍编号已存在,异常:{}'.format(e)},safe=False)
        else:
            return JsonResponse({'code':1001,'message':'添加成功'},safe=False)


    def delete(self,request):
        id = request.POST.get('id')
        if not id:
            return JsonResponse({'code':1001,'message':'删除失败'})
        try:
            book = Books.objects.get(id=id)
        except Exception as e:
            return JsonResponse({'code': 1001, 'message': '删除失败:{}'.format(e)})
        else:
            book.delete()
            return JsonResponse({'code': 200, 'message': '删除成功'})

 应用结果:

事务实现:

class RecordView(View):
    def get(self, request):
        pass

    def post(self, request):
        book_id = request.POST.get('id')
        name = request.POST.get('name')
        try:
            book = Books.objects.get(id=book_id)
        except Exception as e:
            return JsonResponse({'code': 2001, 'messages': "{}".format(e)})
        if book.status:
            return JsonResponse({'code': 2001, 'messages': "该书籍已借书,请确认书籍的状态是否已出借"})
        with transaction.atomic():
            # update status
            book.status = True
            book.save()
            # add record
            Record.objects.create(name=name, book=book)
        return JsonResponse({'code': 1000, 'messages': "出借成功"})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/375681.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 小技巧:利用 xtrabackup 完全备份,增量备份及还原

案例:利用 xtrabackup 8.0 完全备份,增量备份及还原 MySQL8.0 在面对海量数据时,我们无法做到每天全量备份,因此 只能每周做一次全量备份。 而每天的话则进行增量备份,确保数据安全。 注意点:MySQL 8.0.26 版本对应需要…

基于Springboot的考编论坛网站的设计与实现(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的考编论坛网站的设计与实现(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层…

Netty重点——ByteBuf特别篇(十五)

ByteBuf为什么好用 在网络编程中,基本都是基于TCP报文的字节流的操作,所以Java的NIO又新增了ByteBuffer,只不过Java原生的ByteBuffer,非常难操作,也不能扩容缩容,所以Netty又重新封装了自己的Bytebuf&#…

力扣经典题:相交链表

题目分析:两个链表如果相交且不存在环,那么这两个链表从相交节点往后的节点都相同,所以,遍历一个链表,在遍历时不断遍历另一个链表,只要相等就可以返回了 struct ListNode *getIntersectionNode(struct Li…

2024智慧城市新纪元:引领未来,重塑都市生活

随着科技的飞速发展和数字化转型的不断深入,2024年智慧城市领域迎来了全新的发展格局。 这一年,智慧城市的建设更加注重人性化、可持续性和创新性,为城市居民带来了前所未有的便捷与舒适。以下将重点关注智慧城市的几个核心内容,…

LeetCode:14.最长公共前缀

14. 最长公共前缀 - 力扣(LeetCode) 目录 题目: 思路: 代码有限注释: 每日表情包: 题目: 思路: 仅有一种,LeetCode的四种解法,三种都是来水的&#…

单片机学习笔记---串口通信(1)

目录 通信的基本概念 通信的方式 1.按照数据传送的方式,可分为串行通信和并行通信。 1.1串行通信 1.2并行通信 2.按照通信的数据同步方式,又可以分为异步通信和同步通信。 2.1 异步通信 2.2同步通信 3.按照数据的传输方向,又可以分为…

C#(C Sharp)学习笔记_If条件判断语句【五】

前言: 本期学习的是编程语言中的主要语句:if-条件判断语句。在这里我们会学到:if语法,if-else,和if嵌套。话不多说,我们开始吧! 什么是条件判断语句? 条件语句是用来判断给定的条件…

数据库学习案例20240206-ORACLE NEW RAC agent and resource关系汇总。

1 集群架构图 整体集群架构图如下: 1 数据库启动顺序OHASD层面 操作系统进程init.ohasd run启动ohasd.bin init.ohasd run 集群自动启动是否被禁用 crsctl enable has/crsGIHOME所在文件系统是否被正常挂载。管道文件npohasd是否能够被访问, cd /var/t…

Android14音频进阶:MediaPlayerService如何启动AudioTrack 下篇(五十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘

因为PIL版本升级 # image image.resize((int(image.size[0] * (64 / image.size[1])), 64), Image.ANTIALIAS).convert(L) image image.resize((int(image.size[0] * (64 / image.size[1])), 64), Image.LANCZOS).convert(L)

Vue源码系列讲解——变化侦测篇【下】(Array的变化侦测)

目录 1. 前言 2. 在哪里收集依赖 3. 使Array型数据可观测 3.1 思路分析 3.2 数组方法拦截器 3.3 使用拦截器 4. 再谈依赖收集 4.1 把依赖收集到哪里 4.2 如何收集依赖 4.3 如何通知依赖 5. 深度侦测 6. 数组新增元素的侦测 7. 不足之处 8. 总结 1. 前言 上一篇文…

Unity类银河恶魔城学习记录3-4 EnemyBattleState P50

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Enemy.cs using System.Collections; using System.Collections.Generic; …

【RT-DETR有效改进】计算训练好权重文件对应的FPS、推理每张图片的平均时间(科研必备)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是利用我们训练好的权重文件计算FPS,同时打印每张图片所利用的平均时间,模型大小(以MB为单位),同时支持batch_size功能的选择,对于轻量化模型的读者来说,本文的内容对你一定有…

网络基础(三)

网络层与数据链路层 1.网络层2.IP2.1 基本概念2.2 协议头格式2.3 网段划分2.4 特殊的IP地址2.5IP地址的数量限制2.6 私有IP地址和公网IP地址2.7 路由 3.数据链路层4.以太网(MAC帧协议)4.1 认识以太网4.2 以太网帧格式4.3 认识MAC地址4.4 对比理解MAC地址…

【Unity游戏设计】跳一跳Day1

一、创建场景 Assets/Secnes:GameAssets创建游戏资源Prefabs存放预制体,Scripts脚本,Sounds声音,Textures图片资源,Materiais材质资源分类存放意识 二、场景建模 注意:alt鼠标左键切换视角 视角与摄像机视角保持一致:Main CameraGameObjectAlign Vie…

RabbitMQ-4.MQ的可靠性

MQ的可靠性 4.MQ的可靠性4.1.数据持久化4.1.1.交换机持久化4.1.2.队列持久化4.1.3.消息持久化 4.2.LazyQueue4.2.1.控制台配置Lazy模式4.2.2.代码配置Lazy模式4.2.3.更新已有队列为lazy模式 4.MQ的可靠性 消息到达MQ以后,如果MQ不能及时保存,也会导致消…

Asp .Net Core 集成 NLog

简介 NLog是一个基于.NET平台编写的日志记录类库,它可以在应用程序中添加跟踪调试代码,以便在开发、测试和生产环境中对程序进行监控和故障排除。NLog具有简单、灵活和易于配置的特点,支持在任何一种.NET语言中输出带有上下文的调试诊断信息…

相机图像质量研究(3)图像质量测试介绍

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

用python编写爬虫,爬取房产信息

题目 报告要求 工程报告链接放在这里 https://download.csdn.net/download/Samature/88816284使用 1.安装jupyter notebook 2.用jupyter notebook打开工程里的ipynb文件,再run all就行 注意事项 可能遇到的bug 暂无,有的话私信我