侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

django mysql数据库及图片上传接口详解

数据库  /  管理员 发布于 6年前   396

前言

我们在 django-rest-framework解析请求参数 文章中完成了接口文档到参数解析, 一个完整的流程中还缺少对数据库的操作. 本篇内容为django连接数据库, 并编写一个image表用来存储图片路径, 编写图片上传接口和查看数据库中所有图片路径的接口.

前期准备

django操作图片需要安装一个三方库叫做,Pillow

workon python35pip install pillowpip install pymysql

Pillow这个库可以对图片进行操作, 例如生成缩略图等等, 非常强大.

pymysql是python3中用来连接数据库的一个库.

安装mysql数据库. 安装MySQLWorkBench(作用和navicat一样,使用其他软件也可以)

选好点击apply 提交创建新库.

django如何存储图片

一般图片不存数据库单独存储于某个路径, 开发过程中就存在项目的某个路径下.

iOS开发中有个http 304问题. 就是请求图片时, 如果有缓存直接取缓存的图片. 实际上苹果早已帮我们处理好了. 实际开发中不需要针对http 304编写任何代码.

关于http 304的问题

这一篇文章写的非常详细了.

现在我们进行服务端编程, 服务端是如何生成etag, last-modify这些参数的呢?

这个问题涉及到服务端框架对静态资源的管理方法.

在实际将项目部署到服务器上时, 我们对动态资源和静态资源是分开管理的. 我使用nginx+uwsgi 部署, nginx 管理静态资源,ETag 之类的, nginx 会自动生成,管理, 不需要服务端程序员为此编写什么代码.....

图片上传接口, 接收到图片文件, 类型, 大小校验, 将图片保存到静态文件目录下, 生成此图片的url存储到mysql数据库.

编写存储图片路径和id的表.

修改models.py文件.

from django.db import modelsimport datetimeclass Image(models.Model): # url = models.TextField(null=True) image = models.ImageField(upload_to=str('image/{time}'.format(time=str(datetime.date.today().strftime("%Y%m/%d"))))) create_time = models.DateTimeField(auto_now_add=True, null=True) update_time = models.DateTimeField(auto_now=True, null=True) class Meta: pass

ImageField中的upload_to表示图片上传的具体路径.

修改数据库配置连接mysql

修改settings.py文件中的DATABASES 到下面的样式. name是刚刚创建mysql新库的名称. user password 是mysql用户的用户名和密码. mysql端口号默认为3306

DATABASES = { 'default': {  'ENGINE': 'django.db.backends.mysql',  'NAME': 'test',  'USER': 'root',  'PASSWORD': '111111',  'HOST': '127.0.0.1',  'PORT': '3306', }}

记得删除 migrations目录下除了__init__.py 之外的所有文件.

这些文件记录了对数据库定义个整个修改流程. 切换数据库后这个流程和新库根本对不上号. 需要全部删除.

修改与settings.py 同一目录的__init__.py 文件

添加两行代码

import pymysqlpymysql.install_as_MySQLdb()

cd到项目manage.py文件的路径下,运行

workon python35python manage.py makemigrationspython manage.py migrate

使用mysqlworkbench 连接3306打开之前创建的库可以看到表都已经被创建出来

编写图片上传接口

from rest_framework import serializersclass ImageUploadSerializer(serializers.Serializer):  token = serializers.CharField(max_length=100)  image = serializers.ImageField()from .models import *from django.views.decorators.csrf import csrf_exemptimport timeimport hashlibclass ImageUpload(APIView):  '''  图片上传接口 \n  "http://127.0.0.1:8000/pages/uploadImage"   (我简单写了个页面做提交)\n  '''  # coreapi_fields = (DocParam(name='token', description='token'),  #          DocParam(name='image', description='文件', type='file'),)  @csrf_exempt  def post(self, request, *args, **kwargs):    image = request.FILES['image']    data = get_parameter_dic(request)    # 需要判断文件类型是否是图片.    serial = ImageUploadSerializer(data={"token": data["token"],           "image": image})    if serial.is_valid():      print("校验成功")    else:      return JsonError("参数校验失败")    image = serial.validated_data.get("image")    new_image = Image(image=image)    imageName = str(new_image.image.name)    location = str(imageName).find('.')    extension = imageName[location:]    name = imageName[:location]    namestring = name+str(time.time())    md5 = hashlib.md5(namestring.encode('utf-8')).hexdigest()    new_image.image.name = md5[:10] + extension    new_image.save()    return JsonResponse(data=new_image)

运行项目

调用上传图片接口, 我用了postman测试接口

图片存储位置

图片的完整访问路径为

http://localhost:8000/image/201710/20/d527b242d1.jpg

此时请求会失败因为这个路径不允许访问, 需要进行简单配置
setting.py 文件中添加

MEDIA_URL = '/media/'MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/')

urls.py文件中添加

from django.conf.urls import url, includefrom django.contrib import adminfrom rest_framework.schemas import get_schema_viewfrom mytest.views import ReturnJsonimport mytestfrom mytest.views import SwaggerSchemaViewfrom mytest.views import ImageUploadfrom django.views.static import servefrom django.conf import settingsurlpatterns = [  url(r'^admin/', admin.site.urls),  url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),  url(r'^docs/', SwaggerSchemaView.as_view(), name='apiDocs'),  url(r'^api/getjson', ReturnJson.as_view()),  url(r'^api/uploadimage', ImageUpload.as_view()),  # url(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}),  url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),]

这次图片链接变为

http://localhost:8000/media/image/201710/20/d527b242d1.jpg

写一个查询所有图片并返回json的接口

from .models import Imageclass GETAllImages(APIView):  def get(self, request, *args, **kwargs):    imagesset=Image.objects.all()    return JsonResponse(data=imagesset)

修改urls.py文件添加此接口

from django.conf.urls import url, includefrom django.contrib import adminfrom rest_framework.schemas import get_schema_viewfrom mytest.views import ReturnJsonimport mytestfrom mytest.views import SwaggerSchemaViewfrom mytest.views import ImageUpload, GETAllImagesfrom django.views.static import servefrom django.conf import settingsurlpatterns = [  url(r'^admin/', admin.site.urls),  url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),  url(r'^docs/', SwaggerSchemaView.as_view(), name='apiDocs'),  url(r'^api/getjson', ReturnJson.as_view()),  url(r'^api/uploadimage', ImageUpload.as_view()),  url(r'^api/getallimage', GETAllImages.as_view()),  url(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}),  url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),]

全部搞定

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    Django-Model数据库操作(增删改查、连表结构)详解
    下一条:
    浅谈Django中view对数据库的调用方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客