当前位置: 首页 > article >正文

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': "出借成功"})

http://www.kler.cn/news/234742.html

相关文章:

  • LeetCode跳跃游戏 VI
  • 【linux系统体验】-archlinux简易折腾
  • c# avalonia 实现正方体翻转效果
  • 探索数据可视化:Matplotlib在Python中的高效应用
  • python+flask+django医院预约挂号病历分时段管理系统snsj0
  • uniapp微信小程序开发踩坑日记:Pinia持久化
  • 【Linux】Linux下的基本指令
  • 瓦片边移动边绘制的性能优化
  • RPA财务机器人之UiPath实战 - 自动化操作Excel进行财务数据汇总与分析之流程建立与数据读取、处理、汇总、分析
  • 边缘计算的重要性与应用场景
  • 117.乐理基础-五线谱-音值组合法(二)
  • List stream的9种常用功能
  • SpringCloud-Nacos服务分级存储模型
  • 【机器学习】数据清洗之识别异常点
  • 视觉SLAM十四讲学习笔记(二)三维空间刚体
  • JAVA面试题15
  • 【VTKExamples::PolyData】第二十五期 IntersectionPolyDataFilter
  • 口腔助手|口腔挂号预约小程序|基于微信小程序的口腔门诊预约系统的设计与实现(源码+数据库+文档)
  • C++数据类型、变量常量
  • opencv mat用法赋值克隆的操作和一些基本属性
  • 备战蓝桥杯---数学基础1
  • 代码随想录算法训练营第二九天 | 递增子序列、排列
  • 【C++第二阶段】空指针访问成员函数常成员函数常成员属性
  • 【电路笔记】-串联电感
  • 使用C#快速创建一个非常实用的桌面应用程序
  • python笔记12
  • Shell - 学习笔记 - 2.11 - Shell数组:Shell数组定义以及获取数组元素
  • 使用Express 构建高效的Web应用程序
  • c++ STL系列——(四)queue
  • 在C++的union中使用std::string(非POD对象)的陷阱