- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
DRF快速写五个接口,比你用手也快···
Postman
from django.db import models
class User(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=255)
user_type = models.IntegerField(choices=((1, '超级管理员'), (2, '普通管理员'), (3, '普通用户')))
class UserToken(models.Model):
user = models.OneToOneField(to=User,on_delete=models.CASCADE)
token = models.CharField(max_length=32)
class Book(models.Model):
title = models.CharField(max_length=11)
price = models.DecimalField(max_digits=5, decimal_places=2)
authors = models.ManyToManyField(to='Author')
publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
@property
def publish_detail(self):
return {'name': self.publish.name,'Email':self.publish.email}
@property
def author_list(self):
l = []
print(self.authors.all()) # <QuerySet [<Author: Author object (1)>, <Author: Author object (2)>]>
for author in self.authors.all():
print(author.authordetail) # AuthorDetail object (1)
l.append({'name': author.username, 'gender': author.gender,
'address': author.authordetail.address,'telephone':author.authordetail.telephone})
return l
class Author(models.Model):
username = models.CharField(max_length=11)
gender = models.IntegerField(choices=((1, '男'), (2, '女'), (3, '未知')))
authordetail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)
@property
def authordetail_info(self):
return {'telephone': self.authordetail.telephone, 'address': self.authordetail.address}
class AuthorDetail(models.Model):
telephone = models.BigIntegerField()
address = models.CharField(max_length=32)
class Publish(models.Model):
name = models.CharField(max_length=11)
email = models.EmailField()
from rest_framework import serializers
from .models import *
# 用户序列化器
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
# 书序列化器
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
# fields = '__all__'
fields = ['id', 'title', 'price', 'publish', 'authors', 'publish_detail', 'author_list']
extra_kwargs = {
'publish': {'write_only': True},
'authors': {'write_only': True},
}
# 作者序列化器
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
# 指定和哪个表有关系
model = Author
# fields = '__all__'
fields = ['id', 'username', 'gender', 'telephone', 'address', 'authordetail_info']
# 重写字段telephone和addr
telephone = serializers.CharField(write_only=True)
address = serializers.CharField(write_only=True, max_length=8, required=False)
# 重写create,操作两个表
def create(self, validated_data):
# 先存作者详情
authordetail = AuthorDetail.objects.create(telephone=validated_data.get('telephone'),
address=validated_data.get('address'))
# 存作者表
author = Author.objects.create(author_detail=authordetail, gender=validated_data.get('gender'),
username=validated_data.get('username'))
# 这样只返回author对象就行,直接存了两个表,返回反序列化的对象
return author
# 出版社序列化器
class PublishSerializer(serializers.ModelSerializer):
class Meta():
model = Publish
fields = '__all__'
from django.contrib.auth.hashers import make_password, check_password
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ViewSet
from rest_framework.viewsets import ModelViewSet
from .auth import *
from .serializer import *
from .models import *
# 注册视图
class UserRegisterView(ViewSet):
@action(methods=["POST"], detail=False)
def register(self, request):
usernmae = request.data.get('username')
password = request.data.get('password')
re_password = request.data.get('re_password')
user_type = request.data.get('user_type')
if User.objects.filter(username=usernmae):
return Response({'msg': f'用户{usernmae}已注册!', 'code': 4000})
else:
if password == re_password:
# make_password加密:make_password(password, salt=None, hasher='default')
user_date = {'username': usernmae, 'password': make_password(password), 'user_type': user_type}
user_serializer = UserSerializer(data=user_date)
if user_serializer.is_valid():
user_serializer.save()
return Response({'code': 2001, 'msg': f'用户{usernmae}注册成功'})
else:
return Response({'code': 4001, 'msg': '注册失败', 'errors': user_serializer.errors})
else:
return Response({'msg': '两次密码不一致', 'code': 4002})
# 登录视图
class UserLoginView(ViewSet):
@action(methods=["POST"], detail=False)
def login(self, request):
username = request.data.get('username')
password = request.data.get('password')
user = User.objects.filter(username=username).first()
# check_password(password, encoded, setter=None, preferred='default')
if user and check_password(password, user.password):
import uuid
token = str(uuid.uuid4())
UserToken.objects.update_or_create(user=user, defaults={'token': token})
return Response({'code': 2000, 'msg': f'用户{user.username}登录成功', 'token': token})
return Response({'code': 4004, 'msg': '校验失败,用户名或密码错误'})
# 书接视图
class BookView(ModelViewSet):
authentication_classes = [LoginAuth,]
throttle_classes = [IPThrottle,]
queryset = Book.objects.all()
serializer_class = BookSerializer
# 作者视图
class AuthorView(ModelViewSet):
authentication_classes = [LoginAuth,]
queryset = Author.objects.all()
serializer_class = AuthorSerializer
# 出版社视图
class PublishView(ModelViewSet):
authentication_classes = [LoginAuth, ]
permission_classes = [UserPermission,]
queryset = Publish.objects.all()
serializer_class = PublishSerializer
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.permissions import BasePermission
from rest_framework.throttling import SimpleRateThrottle
from app01 import models
# 认证类
class LoginAuth(BaseAuthentication):
# 重写authenticate方法
def authenticate(self, request):
# 获取前端携带的token,token放在哪是自己规定的,比如从查询参数中获取
token = request.query_params.get('token')
# 比对随机字符串
user_token = models.UserToken.objects.filter(token=token).first()
if user_token:
# 登录了,返回当前登录用户和token
return user_token.user, token
else:
# 没有登录,抛异常
raise AuthenticationFailed('您没有登录,请登录')
# 权限类
class UserPermission(BasePermission):
def has_permission(self, request, view):
# 没有权限的提示信息
self.message = '您是:%s,没有权限' % request.user.get_user_type_display()
# 如果有权限,返回True,没有权限返回False
# 权限类,在认证类之后,request.user有了当前登录用户
user_type = request.user.user_type
print(user_type)
if user_type < 3: # 只要不是1,2,就没有权限
return True
else:
return False
# 频率类
class IPThrottle(SimpleRateThrottle):
scope = 'ip'
# get_cache_key返回什么就以什么方法做限制,限制条件必须唯一,比如用户id
def get_cache_key(self, request, view):
# 限制ip地址,从request.META字典中获取ip
'''
request.META:请求头中的数据
'''
return request.META.get('REMOTE_ADDR') # 客户端ip
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES': {
'ip': '5/m' # minute_3是scope的字符串,一分钟访问5次
}, }
from django.contrib import admin
from django.urls import path,include
from app01 import views
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('user',views.UserLoginView,'user')
router.register('user',views.UserRegisterView,'user')
router.register('books',views.BookView,'books')
router.register('author',views.AuthorView,'author')
router.register('publish',views.PublishView,'publish')
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
]
下面是普通用户,403了~
问题情景 混淆群内的小伙伴遇到这么个问题,Mailivery 这个网站登录后,明明提交的表单(邮箱和密码也正确)、请求头等等都没问题,为啥一直重定向到登录页面呢?唉,该出手时就出手啊,我也看看咋回事
实战-行业攻防应急响应 简介: 服务器场景操作系统 Ubuntu 服务器账号密码:root/security123 分析流量包在/home/security/security.pcap 相
背景 最近公司将我们之前使用的链路工具切换为了 OpenTelemetry. 我们的技术栈是: OTLP C
一 同一类的方法都用 synchronized 修饰 1 代码 package concurrent; import java.util.concurrent.TimeUnit; public c
一 简单例子 1 代码 package concurrent.threadlocal; /** * ThreadLocal测试 * * @author cakin */ public class T
1. 问题背景 问题发生在快递分拣的流程中,我尽可能将业务背景简化,让大家只关注并发问题本身。 分拣业务针对每个快递包裹都会生成一个任务,我们称它为 task。task 中有两个字段需要
实战环境 elastic search 8.5.0 + kibna 8.5.0 + springboot 3.0.2 + spring data elasticsearch 5.0.2 +
Win10下yolov8 tensorrt模型加速部署【实战】 TensorRT-Alpha 基于tensorrt+cuda c++实现模型end2end的gpu加速,支持win10、
yolov8 tensorrt模型加速部署【实战】 TensorRT-Alpha 基于tensorrt+cuda c++实现模型end2end的gpu加速,支持win10、linux,
目录如下: 为什么需要自定义授权类型? 前面介绍OAuth2.0的基础知识点时介绍过支持的4种授权类型,分别如下: 授权码模式 简化模式 客户端模式 密码模式
今天这篇文章介绍一下如何在修改密码、修改权限、注销等场景下使JWT失效。 文章的目录如下: 解决方案 JWT最大的一个优势在于它是无状态的,自身包含了认证鉴权所需要的所有信息,服务器端
前言 大家好,我是捡田螺的小男孩。(求个星标置顶) 我们日常做分页需求时,一般会用limit实现,但是当偏移量特别大的时候,查询效率就变得低下。本文将分四个方案,讨论如何优化MySQL百万数
前言 大家好,我是捡田螺的小男孩。 平时我们写代码呢,多数情况都是流水线式写代码,基本就可以实现业务逻辑了。如何在写代码中找到乐趣呢,我觉得,最好的方式就是:使用设计模式优化自己
我们先讲一些arm汇编的基础知识。(我们以armv7为例,最新iphone5s上的64位暂不讨论) 基础知识部分: 首先你介绍一下寄存器: r0-r3:用于函数参数及返回值的传递 r4-r6
一 同一类的静态方法都用 synchronized 修饰 1 代码 package concurrent; import java.util.concurrent.TimeUnit; public
DRF快速写五个接口,比你用手也快··· 实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestfram
一 添加依赖 org.apache.thrift libthrift 0.11.0 二 编写 IDL 通过 IDL(.thrift 文件)定义数据结构、异常和接口等数据,供各种编程语言使用 nam
我正在阅读 Redis in action e-book关于semaphores的章节.这是使用redis实现信号量的python代码 def acquire_semaphore(conn, semn
自定义控件在WPF开发中是很常见的,有时候某些控件需要契合业务或者美化统一样式,这时候就需要对控件做出一些改造。 目录 按钮设置圆角
师父布置的任务,让我写一个服务练练手,搞清楚socket的原理和过程后跑了一个小demo,很有成就感,代码内容也比较清晰易懂,很有教育启发意义。 代码 ?
我是一名优秀的程序员,十分优秀!