首页 > 其他分享 >【Django DRF Apps】从零搭建一个上传图片app

【Django DRF Apps】从零搭建一个上传图片app

时间:2025-01-17 12:02:13浏览次数:3  
标签:app py Apps Django import 上传 image 图片

Django REST Framework 图片上传app完整指南

以下是一个通过 Django REST Framework (DRF) 实现图片上传功能的完整示例,涵盖从环境配置到功能实现的所有步骤,同时增加了功能点和知识点的解析,便于理解与扩展。


功能点

  1. 图片上传功能:实现通过 API 接口上传图片并保存到服务器。
  2. 文件大小与类型验证:限制上传的图片大小和文件类型。
  3. 图片存储路径设置:将图片保存到自定义路径,并支持本地存储与云存储扩展。
  4. 图片访问功能:提供图片的公开访问 URL。
  5. 分页功能:支持图片数据的分页展示,适合大数据量场景。
  6. 权限控制:为上传和访问接口添加用户权限验证。
  7. 图片优化:对上传图片进行压缩和尺寸调整以节省存储空间。
  8. 扩展与生产支持:支持在本地开发和生产环境下的配置切换。

知识点

  1. DRF 基础ModelViewSet 的使用,结合序列化器与模型完成 CRUD。
  2. 图片上传解析器MultiPartParserFormParser 的作用与用法。
  3. Django 文件存储系统MEDIA_URLMEDIA_ROOT 的配置。
  4. 数据验证:如何在序列化器中添加自定义验证逻辑。
  5. 分页设置:自定义分页类实现分页功能。
  6. 信号机制:使用 Django 的信号 (post_save) 实现图片处理。
  7. 安全性优化:限制文件大小和文件类型,防止恶意上传。

完整实现步骤

1. 安装依赖

在项目开始前,确保安装以下依赖库:

pip install django djangorestframework pillow
  • Django:Web 框架。
  • Django REST Framework (DRF):用于构建 API 的工具集。
  • Pillow:Python 图像处理库,用于图片验证和处理。

2. 配置 Django 项目
  1. 创建 Django 项目与应用

    django-admin startproject myproject
    cd myproject
    python manage.py startapp myapp
    
  2. 配置 settings.py

    • 添加 INSTALLED_APPS

      INSTALLED_APPS = [
          ...
          'rest_framework',
          'myapp',
      ]
      
    • 配置媒体文件路径:

      import os
      
      MEDIA_URL = '/media/'
      MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
      
  3. 配置 urls.py
    在项目的 myproject/urls.py 中添加媒体文件支持:

    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns = [
        ...
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

3. 创建模型

myapp/models.py 中创建用于存储图片的模型:

from django.db import models

class ImageUpload(models.Model):
    image = models.ImageField(upload_to='images/')  # 指定存储路径
    uploaded_at = models.DateTimeField(auto_now_add=True)  # 自动记录上传时间

    def __str__(self):
        return self.image.name

功能点:

  • upload_to='images/':指定图片上传的目录为 media/images/
  • uploaded_at:记录图片的上传时间。

4. 创建序列化器

myapp/serializers.py 中创建一个序列化器:

from rest_framework import serializers
from .models import ImageUpload

class ImageUploadSerializer(serializers.ModelSerializer):
    class Meta:
        model = ImageUpload
        fields = ['id', 'image', 'uploaded_at']

    def validate_image(self, value):
        # 验证文件类型
        if not value.content_type.startswith('image/'):
            raise serializers.ValidationError('Uploaded file is not a valid image.')
        # 验证文件大小
        if value.size > 5 * 1024 * 1024:  # 限制大小为5MB
            raise serializers.ValidationError('Image size should not exceed 5MB.')
        return value

知识点:

  • validate_<field_name> 方法用于对字段值进行自定义验证。
  • 可以通过 content_type 验证文件类型,通过 size 限制文件大小。

5. 创建视图

myapp/views.py 中创建图片上传接口的视图:

from rest_framework import viewsets
from rest_framework.parsers import MultiPartParser, FormParser
from .models import ImageUpload
from .serializers import ImageUploadSerializer

class ImageUploadViewSet(viewsets.ModelViewSet):
    queryset = ImageUpload.objects.all().order_by('-uploaded_at')  # 按上传时间倒序
    serializer_class = ImageUploadSerializer
    parser_classes = (MultiPartParser, FormParser)  # 处理文件上传的解析器

知识点:

  • MultiPartParserFormParser:处理多部分表单数据,适用于文件上传。
  • ModelViewSet:提供标准的 CRUD 操作,减少代码量。

6. 配置 URL

myapp/urls.py 中注册路由:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ImageUploadViewSet

router = DefaultRouter()
router.register(r'images', ImageUploadViewSet)  # 注册路由

urlpatterns = [
    path('', include(router.urls)),
]

7. 数据库迁移

运行以下命令创建和迁移数据库:

python manage.py makemigrations
python manage.py migrate

8. 运行开发服务器

启动开发服务器进行测试:

python manage.py runserver

9. 测试图片上传
  1. 使用 cURL 测试

    curl -X POST http://127.0.0.1:8000/api/images/ -F "image=@/path/to/image.jpg"
    
  2. 使用 Postman 测试

    • 设置请求方法为 POST
    • URL 为 http://127.0.0.1:8000/api/images/
    • 在表单数据中添加 image 字段并上传图片。

10. 访问上传的图片

上传成功后,可以通过以下 URL 访问图片:

http://127.0.0.1:8000/media/images/<image-name>

附加优化

  1. 分页设置
    settings.py 中全局配置分页:

    REST_FRAMEWORK = {
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
        'PAGE_SIZE': 10,  # 每页显示 10 条记录
    }
    
  2. 图片处理
    对上传图片进行压缩或缩放:

    from PIL import Image
    
    def resize_image(image, max_width=800, max_height=800):
        with Image.open(image) as img:
            img.thumbnail((max_width, max_height))
            img.save(image.path, optimize=True, quality=85)
    

    在模型保存后调用:

    from django.db.models.signals import post_save
    from django.dispatch import receiver
    
    @receiver(post_save, sender=ImageUpload)
    def process_image(sender, instance, **kwargs):
        resize_image(instance.image)
    
  3. 权限控制
    限制接口访问权限:

    from rest_framework.permissions import IsAuthenticated
    
    class ImageUploadViewSet(viewsets.ModelViewSet):
        permission_classes = [IsAuthenticated]
    

通过以上步骤,你将实现一个功能完整且安全的图片上传 API,同时具备高可扩展性,支持未来在生产环境中的部署与优化。

标签:app,py,Apps,Django,import,上传,image,图片
From: https://blog.csdn.net/qq_59344127/article/details/145153687

相关文章

  • uniapp仿微信动态功能实现思路供参考
    1,创建三个数据表,一个朋友圈动态表,一个点赞表,一个评论表动态表创建 例如:dtlist包括用户uid,内容about,文字是否base64格式iszy,动态图片allimg,发布时间addtime(根据自己项目需要创建合适的字段)点赞表创建 例如:dzlist包括用户uid,点赞动态id:dtid,点赞时间addtime(根......
  • 基于STM32单片机自动售货机扫码支付无人超市语音播报无线蓝牙APP/WIFI-APP控制/WIFI视
    STM32-S147语音播报+二维码付+4种商品+4路电机出货+选货+手付+库存+缺货+找零+声光+按键+TFT屏+(无线方式选择)产品功能描述:本系统由STM32F103C8T6单片机核心板、1.44寸TFT彩屏、(无线蓝牙/无线WIFI/无线视频监控模块-可选)、步进电机控制电路、语音播报模块接口、蜂鸣器报警电......
  • Android14.0 app调用hal层接口功能实现系列三(frameworks层实现)
    1.前言 在14.0的系统产品定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后在jni层实现hal层接口调用,在framework层实现添加服务调用jni接口,接下来就实现第三部分的相关功能2.a......
  • 【三江学院毕业论文】露营爱好者APP(基于SpringBoot+UniApp)的设计与实现
    注:仅展示部分文档内容和系统截图,需要完整的视频、代码、文章和安装调试环境请私信up主。摘 要随着计算机行业的不断发展,计算机的应用也在不断随着其发展速度进行着更新。而现今对于一个网络应用非常广泛的社会,商品采购管理对计算机管理商品采购要求更加紧密,更加完善,特别......
  • 2025-1-12至16-uniapp初体验
    2025-1-12今天主要就是在熟悉app开发软件应用,发现它的页面开发起来跟我们的web是一样的,初始界面就跟VScode操作一样,毕竟第一步是要做页面,然后它的控制台跟tomcat集成之后使用很像,之后就是复习一下web的css。盒子模型:margin:外边距控制边框离屏幕的距离(top上,left左等)paddi......
  • Django Admin 实战:实现 ECS 集群批量同步功能
    引言在管理大规模AWSECS(ElasticContainerService)集群时,保持本地数据库与AWS实际状态的同步是一项关键任务。手动更新既耗时又容易出错,因此自动化这个过程变得尤为重要。本文将介绍如何利用DjangoAdmin的自定义动作功能来实现ECS集群的批量同步操作,从而大幅......
  • Python+Django的社区爱心捐赠(Pycharm Flask Django Vue mysql)
    收藏关注不迷路,防止下次找不到!文章末尾有惊喜项目介绍Python+Django的社区爱心捐赠(PycharmFlaskDjangoVuemysql)项目展示详细视频演示请联系我获取更详细的演示视频,相识就是缘分,欢迎合作!!!所用技术栈前端vue.js框架支持:django数据库:mysql5.7数据库......
  • Python+Django的老年群体安全用药管理系统(角色:用户、医生、药师、管理员)(Pycharm Flas
    收藏关注不迷路,防止下次找不到!文章末尾有惊喜项目介绍Python+Django的老年群体安全用药管理系统(角色:用户、医生、药师、管理员)(PycharmFlaskDjangoVuemysql)项目展示详细视频演示请联系我获取更详细的演示视频,相识就是缘分,欢迎合作!!!所用技术栈前端......
  • 计算机毕业设计Springboot运动健康APP 基于Spring Boot框架的健身与健康管理移动应用
    计算机毕业设计Springboot运动健康APPu8mr9vrk(配套有源码程序mysql数据库论文)本套源码可以先看具体功能演示视频领取,文末有联xi可分享随着科技的飞速发展和人们对健康生活方式的追求,运动健康APP应运而生,成为现代生活中不可或缺的健康管理工具。这类APP不仅能够帮助用户记......
  • drf:django restframework(一)
    1.快速上手安装:pipinstalldjangorestframework配置,在settings.py中添加配置(这个drf是有默认app的,就是rest_framework。),后面的drf相关配置是在REST_FRAMEWORK里面配置。INSTALLED_APPS=[...#注册rest_framework(drf)'rest_framework',]#drf相关配......