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.nameclass 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 viewsurlpatterns = [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,loginclass 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):passimport 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):passdef 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 statusbook.status = Truebook.save()# add recordRecord.objects.create(name=name, book=book)return JsonResponse({'code': 1000, 'messages': "出借成功"})

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统安装mysql数据库并利用自己电脑远程连接

在新装的linux系统中,我们得先开启网络服务才能下载包啊什么的,所以在这之前,我们默认已经开启网络服务。 首先我们需要先下载一个wget命令工具用于从网上下载软件安装包。 首先我们需要先下载一个wget命令工具用于从网上下载软件安装包。下…

mhz_c1f

信息收集 探测到存活主机的IP地址为 192.168.101.32 # nmap -sT --min-rate 10000 -p- 192.168.101.32 -oN port.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-03 13:41 CST Nmap scan report for 192.168.101.32 Host is up (0.0020s latency). Not shown: 6553…

EasyExcel分页上传数据

EasyExcel分页上传数据 一、实例 controller上传入口 PostMapping("/upload")ResponseBodyLog(title "导入工单", businessType BusinessType.IMPORT)public AjaxResult uploadFile(HttpServletRequest request, MultipartFile files) throws Exceptio…

项目02《游戏-08-开发》Unity3D

基于 项目02《游戏-07-开发》Unity3D , 本次任务做物品相互与详情的功能, 首先要做 点击相应, 接下来用接口实现点击相应事件,具体到代码中,我们找到需要响应鼠标事件的对象, 双击PackageCell…

【3D分割】GARField: 辐射场的物体分组

题目:GARField: Group Anything with Radiance Fields 来源:UC Berkeley 和 Luma AI 项目: https://www.garfield.studio/ 文章目录 摘要一、前言二、相关工作2.1 层次分组2.2 NeRF的分割2.3 3D 特征场 三、method3.1 2D Mask 生成3.2 Scale-…

Python __file__属性:查看模块的源文件路径

除可以查看模块的帮助信息之外,还可以直接阅读模块的源代码来掌握模块功能,提升 Python 编程能力。 不管学习哪种编程语言,认真阅读那些优秀的框架、库的源代码都是非常好的学习方法。 通过模块的 __file__ 属性即可查看到指定模块的源文件…

数据库学习案例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…

Rust 数据类型使用注意点

文章目录 前言一、Rust 的数据类型基本数据类型:复合数据类型: 二、使用注意点📢整型溢出 总结 前言 Rust 学习系列 ,学习rust的数据类型。牢记其中的注意点📢 一、Rust 的数据类型 Rust 提供了丰富的数据类型&#…

新火种AI|寒武纪跌落神坛!七年连亏50亿,AI芯片第一股不行了吗?

作者:文子 编辑:小迪 连年亏损,烧钱不止,寒武纪终是走到悬崖边缘。 寒武纪市值腰斩,连续七年累亏50亿 继连续六年亏损之后,寒武纪又迎来第七年亏损。 1月30日晚,寒武纪正式对外发布2023年年…

ref用法

目录 React中提供两种方法创建ref对象: 类组件获取 Ref 三种方式 ① Ref属性是一个字符串。 ② Ref 属性是一个函数。 ③ Ref属性是一个ref对象。 高级用法1:forwardRef 转发 Ref 高级用法2:ref实现组件通信 【ref作用】:最…

GPTs保姆级教程之实践

GPTs什么 使用GPTs的前提:ChatGPT Plus帐号 GTPs的作用:把我们和GPT对话的prompt,封装起来成为一个“黑匣子”。 主要有两个作用: 1、避免反复输入prompt,“黑匣子”打开,输入问题即可使用 2、在别人可以…

Verilog刷题笔记21

题目: A priority encoder is a combinational circuit that, when given an input bit vector, outputs the position of the first 1 bit in the vector. For example, a 8-bit priority encoder given the input 8’b10010000 would output 3’d4, because bit[4…