https://ciang.top/ https://ciang.top/
首页
  • 首页
  • python
  • 工具经验
  • 教程
  • c++
  • mysql
  • 登录
搜索历史 清空
写文章

登录

账号密码登录
扫码登录
扫码登录
请使用手机扫码登录
注册登录即表示同意用户协议和隐私政策
编程
java c/c++ mysql python excel html/css/js 工具经验
思路/心得
传奇私服-V8M2引擎学习笔记
教程
翻译
游戏
推荐 最新
django之主路由包含子路由
benojan 2025-2-6

django之主路由包含子路由

假设你的drf项目中有一个名为api的app 在 app 中创建 urls.py 文件 在api文件夹中,创建一个名为urls.py的文件。 from django.urls import path from . import views urlpatterns = [ path('index/', views.index, name='index'), ] drf的项目文件夹的urls.py文件 from django.urls import include, path urlpatterns = [ path('api/', include('api.urls')), ]

425 27 0
django
django之DRF的views.py实现方式概览
benojan 2025-1-31

django之DRF的views.py实现方式概览

Django 的视图实现方式主要有两种:FBA(Function-Based Views,函数视图) 和 CBA(Class-Based Views,类视图)。 而在 Django REST Framework(DRF)中,视图的实现方式更加丰富和灵活,主要包括以下几种: 1. Django 的视图实现方式 (1) FBA(Function-Based Views) 函数视图是基于函数的视图,适合简单的逻辑处理。 from django.http import HttpResponse def my_view(request): if request.method == 'GET': return HttpResponse('Hello, GET request!') elif request.method == 'POST': return HttpResponse('Hello, POST request!') (2) CBA(Class-Based Views) 类视图是基于类的视图,适合复杂的逻辑处理,支持代码复用和扩展。 from django.views import View from django.http import HttpResponse class MyView(View): def get(self, request): return HttpResponse('Hello, GET request!') def post(self, request): return HttpResponse('Hello, POST request!') 2. DRF 的视图实现方式 DRF 在 Django 的基础上提供了更强大的视图实现方式,主要用于构建 RESTful API。以下是 DRF 中常见的视图实现方式: (1) APIView APIView 是 DRF 中最基础的类视图,类似于 Django 的 View,但提供了更多的功能(如请求解析、响应渲染、异常处理等)。 from rest_framework.views import APIView from rest_framework.response import Response class MyAPIView(APIView): def get(self, request): return Response({'message': 'Hello, GET request!'}) def post(self, request): return Response({'message': 'Hello, POST request!'}) (2) GenericAPIView GenericAPIView 是 APIView 的扩展,提供了更多的通用功能(如获取单个对象、获取对象列表等),通常与 Mixin 类一起使用。 from rest_framework.generics import GenericAPIView from rest_framework.mixins import ListModelMixin, RetrieveModelMixin from .models import MyModel from .serializers import MyModelSerializer class MyGenericView(ListModelMixin, RetrieveModelMixin, GenericAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) (3) ViewSet ViewSet 是 DRF 中更高级的视图实现方式,它将多个视图逻辑(如列表、详情、创建、更新、删除等)组合到一个类中。ViewSet 通常与路由器(Router)一起使用,自动生成 URL 配置。 ModelViewSet ModelViewSet 是 ViewSet 的子类,提供了完整的 CRUD 操作。 from rest_framework.viewsets import ModelViewSet from .models import MyModel from .serializers import MyModelSerializer class MyModelViewSet(ModelViewSet): queryset = MyModel.objects.all() serializer_class = MyModelSerializer ReadOnlyModelViewSet ReadOnlyModelViewSet 是 ModelViewSet 的子类,只提供只读操作(列表和详情)。 from rest_framework.viewsets import ReadOnlyModelViewSet from .models import MyModel from .serializers import MyModelSerializer class MyReadOnlyViewSet(ReadOnlyModelViewSet): queryset = MyModel.objects.all() serializer_class = MyModelSerializer 自定义 ViewSet 你可以通过继承 ViewSet 或 GenericViewSet 来实现自定义逻辑。 from rest_framework.viewsets import ViewSet from rest_framework.response import Response class MyCustomViewSet(ViewSet): def list(self, request): return Response({'message': 'Hello, list action!'}) def retrieve(self, request, pk=None): return Response({'message': f'Hello, retrieve action for pk={pk}!'}) (4) 路由器(Router) DRF 提供了路由器(Router)来自动生成 ViewSet 的 URL 配置。 from rest_framework.routers import DefaultRouter from .views import MyModelViewSet router = DefaultRouter() router.register(r'mymodels', MyModelViewSet) urlpatterns = router.urls 3. 推荐使用哪种方式? (1) 简单场景 如果逻辑简单,可以直接使用 APIView 或函数视图。 (2) 标准 CRUD 操作 如果需要对模型进行标准的 CRUD 操作,推荐使用 ModelViewSet,因为它可以快速生成完整的 API。 (3) 复杂逻辑 如果需要自定义逻辑,可以使用 ViewSet 或 GenericAPIView,结合 Mixin 类实现灵活的功能。 (4) 只读 API 如果只需要提供只读 API,可以使用 ReadOnlyModelViewSet。 (5) 代码复用 如果需要复用代码,推荐使用 GenericAPIView 和 Mixin 类。 4. ViewSet 的优势 代码简洁:将多个视图逻辑组合到一个类中,减少代码量。 自动 URL 配置:通过路由器自动生成 URL 配置,减少手动配置的工作量。 标准化:提供标准的 CRUD 操作,适合快速开发 RESTful API。

533 27 0
djangopythondrf
django之装饰器的介绍
benojan 2025-1-31

django之装饰器的介绍

1. @method_decorator 的作用 @method_decorator 是 Django 提供的一个工具,用于将普通的函数装饰器应用到类视图的方法上。因为类视图的方法(如 get、post、dispatch 等)是实例方法,而不是普通函数,直接使用函数装饰器会报错。@method_decorator 的作用就是解决这个问题。 示例: from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt @method_decorator(csrf_exempt, name='post') class Login(View): def post(self, request): return HttpResponse('Hello Post') 在这个例子中,csrf_exempt 是一个函数装饰器,通常用于函数视图。通过 @method_decorator,我们将 csrf_exempt 应用到 Login 类的 post 方法上。 2. 使用 @method_decorator 的好处 (1) 复用函数装饰器 Django 提供了许多有用的函数装饰器(如 csrf_exempt、login_required、permission_required 等),这些装饰器原本是为函数视图设计的。通过 @method_decorator,可以在类视图中复用这些装饰器,而不需要重写逻辑。 (2) 简化代码 如果不使用 @method_decorator,你可能需要手动重写 dispatch 方法来实现装饰器的功能。例如: class Login(View): def dispatch(self, request, *args, **kwargs): # 手动实现 csrf_exempt 的逻辑 return super().dispatch(request, *args, **kwargs) 而使用 @method_decorator 可以更简洁地实现相同的功能。 (3) 灵活性 @method_decorator 可以应用到类视图的特定方法上(如 get、post 等),也可以应用到整个类上(通过 name='dispatch')。这种灵活性使得你可以根据需要选择性地装饰方法。 3. @method_decorator 的注意事项 (1) 装饰器的顺序 如果同时使用多个装饰器,需要注意装饰器的顺序。例如: @method_decorator(login_required, name='dispatch') @method_decorator(csrf_exempt, name='dispatch') class Login(View): pass 在这个例子中,csrf_exempt 会先生效,然后是 login_required。 (2) 应用到特定方法 如果只需要装饰某个特定的方法(如 get 或 post),可以直接将装饰器应用到该方法上: class Login(View): @method_decorator(csrf_exempt) def post(self, request): return HttpResponse('Hello Post') (3) 避免重复装饰 如果多个方法需要相同的装饰器,可以将装饰器应用到 dispatch 方法上,因为 dispatch 是所有请求的入口点。这样可以避免重复装饰。 4. @method_decorator 的替代方案 如果你不想使用 @method_decorator,也可以直接在 dispatch 方法中调用装饰器的逻辑。例如: from django.views.decorators.csrf import csrf_exempt class Login(View): @csrf_exempt def dispatch(self, request, *args, **kwargs): return super().dispatch(request, *args, **kwargs) 这种方式与 @method_decorator 的效果相同,但代码更直接。 5. 总结 @method_decorator 的作用是将函数装饰器应用到类视图的方法上,dispatch 方法的名称不会改变。 使用 @method_decorator 的好处包括复用函数装饰器、简化代码和增加灵活性。 在实际开发中,@method_decorator 是处理类视图装饰器的推荐方式,尤其是在需要复用 Django 内置装饰器时。 如果是为了 API 开发,建议使用 Django REST Framework(DRF),它提供了更安全的认证机制(如:Token认证、JWT认证),而不需要禁用 CSRF。

516 27 0
django之DRF框架搭建API项目的步骤
benojan 2025-1-31

django之DRF框架搭建API项目的步骤

创建虚拟环境并安装必要的包 参考:python虚拟环境 创建 Django 项目和应用 django-admin startproject myproject cd myproject python manage.py startapp myapp 在 settings.py 中进行基础配置 NSTALLED_APPS = [ # ... 现有应用 ... 'rest_framework', 'myapp', ] # DRF 配置 REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ], 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication' ], } 创建模型 根据需要自行创建 from django.db import models class Item(models.Model): name = models.CharField(max_length=100) description = models.TextField() created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.name 创建模型的序列化器 from rest_framework import serializers from .models import Item class ItemSerializer(serializers.ModelSerializer): class Meta: model = Item fields = '__all__' 创建视图 from rest_framework import viewsets from .models import Item from .serializers import ItemSerializer class ItemViewSet(viewsets.ModelViewSet): queryset = Item.objects.all() serializer_class = ItemSerializer 配置URL from django.contrib import admin from django.urls import path, include from rest_framework.routers import DefaultRouter from myapp.views import ItemViewSet router = DefaultRouter() router.register(r'items', ItemViewSet) urlpatterns = [ path('admin/', admin.site.urls), path('api/', include(router.urls)), ] 进行数据库迁移 python manage.py makemigrations python manage.py migrate 运行开发服务器 python manage.py runserver 主要注意事项: 确保在 settings.py 中正确配置数据库连接 根据需要添加适当的权限控制 可以根据需求自定义序列化器和视图 建议添加适当的文档(可以使用 drf-yasg 或 drf-spectacular) 考虑添加测试用例 访问地址: API 根目录:http://localhost:8000/api/ 管理后台:http://localhost:8000/admin/

414 27 0
djangodrf
django 接收 post 数据
benojan 2024-4-30

django 接收 post 数据

或许是更好的方式 使用 ser = XXXXModelSerializer(...ModelSerializer) 使用 ser.isValid() 后台校验数据 """ 如果提交的数据中没有test,则test="" 如果提交的数据中有test且test=null,则test=None """ test = request.data.get("test", "")

576 27 0
Python之虚拟环境
benojan 2024-1-9

Python之虚拟环境

一、创建环境 python -m venv ENV_DIR 二、激活环境 windows下: .\ENV_DIR\Scripts\activate mac下: source .\ENV_DIR\bin\activate 三、安装环境 pip install django pip install djangorestframework pip install pymysql pip install django-cors-headers 接下来可以参考: DRF的创建步骤

575 27 0
pythonvenv虚拟环境
Python之Turtle模块
benojan 2023-4-5

Python之Turtle模块

常用命令 窗体和画布 # 窗体大小 turtle.setup(宽, 高, x坐标=屏幕居中, y坐标=屏幕居中) # 画布大小 turtle.screensize(宽, 高, 色) turtle.screensize() # 默认:400 × 300 画笔 turtle.pensize(粗细) # 笔粗 turtle.width(粗细) # 笔粗 turtle.pencolor(色) # 笔色: white, yellow, magenta, cyan, blue, black turtle.pencolor(R,G,B) turtle.pencolor( (R,G,B) ) turtle.colormode(色型) # 色型: 1.0, 255 turtle.fillcolor(色) # 填色 turtle.color(笔色, 填色) 画笔动作 turtle.pendown() # 落笔 turtle.down() # 落笔 turtle.pd() # 落笔 turtle.penup() # 挈笔 turtle.up() # 挈笔 turtle.pu() # 挈笔 turtle.goto(x坐标, y坐标) # 移动 turtle.forward(距离) # 前进 turtle.fd(距离) # 前进 turtle.backward(距离) # 后退 turtle.bk(距离) # 后退 turtle.left(角度) # 左转 turtle.right(角度) # 右转 turtle.seth(角度) # 设置朝向 turtle.setheading(角度) # 设置朝向 turtle.begin_fill() # 开始上色 turtle.end_fill() # 结束上色 turtle.circle(半径, 角度=360) # 画弧线,半径>100,圆心在左侧,半径<100,圆心在右侧 全局 stamp() # 复制当前图形 turtle.write(文字, 字体=("字体名", 字号, "字形")) turtle.showturtle() # 显示海龟 turtle.hideturtle() # 隐藏海龟 turtle.isvisible() # 检查海龟是否可见 turtle.clear() # 清除(只清除绘图) turtle.reset() # 重置(恢复一切到初始) turtle.undo() # 撤销动作 turtle.exitonclick() # 画完不关窗,点窗退出 turtle.done() # 中断绘制,关窗后继续绘制 颜色表 英文名 RGB整数表示色型 RGB小数表示色型 中文名 white 255, 255, 255 1, 1, 1 白 yellow 255, 255, 0 1, 1, 0 黄 magenta 255, 0, 255 1, 0, 1 梅红 cyan 0, 255, 255 0, 1, 1 青 blue 0, 0, 255 0, 0, 1 蓝 black 0, 0, 0 0, 0, 0 乌 seashell 255, 245, 238 1, 0.96, 0.93 海贝 gold 255, 215, 0 1, 0.84, 0 金 pink 255, 192, 203 1, 0.75, 0.80 粉 brown 165, 42, 42 0.65, 0.16, 0.16 棕/褐 purple 160, 32, 240 0.63, 0.13, 0.94 紫 tomato 255, 99, 71 1, 0.39, 0.28 番茄色

656 27 0
pythonturtle
Python之Turtle模块
django之基于类的视图和基于函数的视图
benojan 2022-11-2 c/c++

django之基于类的视图和基于函数的视图

Django中的路由可以对应一个函数,也可以对应一个类。

607 27 0
django视图CBVFBV
django之基于类的视图和基于函数的视图
django之数据库的配置与操作
benojan 2022-11-2 mysql

django之数据库的配置与操作

数据库配置 创建数据库 配置 settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'XXX', 'USER': 'XXX', 'PASSWORD': 'xxx', 'HOST': 'localhost', 'PORT': 3306, } } 修改 __init__.py,更改 mysqldb 为 pymysql import pymysql pymysql.install_as_MySQLdb() 操作表 创建表、修改表、删除表 >python manage.py makemigrations >python manage.py migrate 操作行 增加 models.UserGroup.objects.create(title='销售部') models.UserInfo.objects.create(username='root', password='123', usergroup_id=1) 删除 usergroups = models.UserGroup.objects.filter(id=1).delete() 改变 usergroups = models.UserGroup.objects.filter(id=1).update(title='公关部') from django.db.models import F models.UserInfo.objects.all().update(age=F('age')+1) # update userinfo set age = age + 1; 查找 一般查找 userlist = models.UserGroup.objects.all()#.first() for row in userlist: print(row.id, row.title) userlist = models.UserGroup.objects.filter(id=1, title='aaa') # and userlist = models.UserGroup.objects.exclude(id=1) # != userlist = models.UserGroup.objects.filter(id__gt=1) # > userlist = models.UserGroup.objects.filter(id__lt=1) # < 进阶查找 # 连表查找 # usertype是userinfo的fk字段 obj = models.UserInfo.objects.all().first() print(obj.name, obj.age, obj.usertype_id, obj.usertype.title) # (正向)连表查找 obj = models.UserType.objects.all().first() print(obj.id, obj.title, obj.userinfo_set.all()) # (反向) print(obj.id, obj.title, obj.userinfo_set.filter(name='xx')) # 过滤 # 获取的类型 models.UserInfo.objects.all() # 返回UserInfo类型的QuerySet数组 models.UserInfo.objects.all().values('id', 'name') # 返回字典类型的QuerySet数组 models.UserInfo.objects.all().values_list('id', 'name') # 返回元组类型的QuerySet数组 # 排序 Order By models.UserInfo.objects.all().order_by('id') # 升序 models.UserInfo.objects.all().order_by('-id') # 降序 models.UserInfo.objects.all().order_by('id', 'name') # 多列排序 # 分组 Group By ... Having ... from django.db.models import Count, Sum, Max, Min, Avg v = models.UserInfo.objects.filter(id__gt=2).values('usertype_id').annotate(xxxx=Count('id')).filter(xxxx__gt=2) # 注意前后filter表示的含义不同 print(v.query) # 查看生成的SQL语句 # select usertype_id, count(id) as xxxx from userinfo where id > 2 group by usertype_id having count(id) > 2; # in; between ... and ...; gt lt gte lte ...; models.UserInfo.objects.filter(id__in=[1,2,3]) # in models.UserInfo.objects.filter(id__range=[1,3]) # between...and... models.UserInfo.objects.filter(id__gt=1) # > models.UserInfo.objects.filter(id__lt=1) # < models.UserInfo.objects.filter(id__gte=1) # >= models.UserInfo.objects.filter(id__lte=1) # <= # not ... models.UserInfo.objects.exclude(id__in=[1,2,3]) # in models.UserInfo.objects.exclude(id__range=[1,3]) # between...and... models.UserInfo.objects.exclude(id__gt=1) # > models.UserInfo.objects.exclude(id__lt=1) # < models.UserInfo.objects.exclude(id__gte=1) # >= models.UserInfo.objects.exclude(id__lte=1) # <= # like % models.UserInfo.objects.filter(name__startswith='a') # like '%a' models.UserInfo.objects.filter(name__endswith='a') # like 'a%' models.UserInfo.objects.filter(name__contains='a') # like '%a%' # not like % models.UserInfo.objects.exclude(name__startswith='a') # not like '%a' models.UserInfo.objects.exclude(name__endswith='a') # not like 'a%' models.UserInfo.objects.exclude(name__contains='a') # not like '%a%' # and condition = {'id': 1, 'name': 'root'} models.UserInfo.objects.filter(**condition) # 不推荐 # and or混合,对象方式 (不推荐) from django.db.models import Q models.UserInfo.objects.filter(Q(id=1) | Q(id=2)) # or models.UserInfo.objects.filter(Q(id=1) & Q(id=2)) # and # and or混合,方法方式 (推荐) q1 = Q() q1.connector = 'OR' q1.children.append(('id', 1)) q1.children.append(('id', 10)) q1.children.append(('id', 9)) q2 = Q() q2.connector = 'OR' q2.children.append(('c1', 1)) q2.children.append(('c1', 10)) q2.children.append(('c1', 9)) con = Q() con.add(q1, 'AND') con.add(q2, 'AND') models.UserInfo.objects.filter(con) # select id, name, (select ...) as n from xb; models.UserInfo.objects.all().extra( select={ 'n': 'select ... where id > %s and id < %s', 'm': 'select ... where id = %s and id = %s', }, select_params=[1, 3, 4, 5]) # where (select ... ) models.UserInfo.objects.all().extra( where=["id=%s or id=2", "name=%s"], # and params=[1, 'alex']) # select * from app01_userinfo, app01_usertype; models.UserInfo.objects.all().extra( tables=['app01_usertype'], where=['app01_usertype.id = app01_userinfo.user'] ) 分页 obj = models.UserInfo.objects.all()[0:10]

615 27 0
django数据库ORM
django之数据库的配置与操作

搜索

搜索历史 清空

最新评论

标签

  • 重写
  • 继承
  • 虚函数
  • springboot
  • java
  • drf
  • 私服
  • 脚本
  • Windows窗口程序
  • cmake
  • dll
  • Modeless
  • Accelerators
  • WTL
  • ListCtrl
  • MFC
  • regex
  • 正则表达式
  • 虚拟环境
  • venv
  • radio
  • html
  • vim
  • nodejs
  • Linux
  • 宝塔面板
  • bt
  • chatGPT
  • AI
  • turtle
  • python
  • 我的世界
  • api
  • bukkit
  • 字符串操作
  • docker
  • 本地架设
  • 游戏
  • 编程
  • CodeCombat
  • 教程
  • 插件开发
  • Minecraft
  • GBK
  • Unicode
  • UTF-8
  • 字符集
  • 转换
  • 编码
  • boost

链接

  • 標準吳語字典
  • 台州方言維基
  • 溫嶺吳語微辭典
关于 友链 rss
Powered by benojan

备案号: