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


Posted in Python onJuly 18, 2019

前言

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

前期准备

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

workon python35
pip install pillow
pip install pymysql

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

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

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

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

选好点击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 models
import datetime
class 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 pymysql
pymysql.install_as_MySQLdb()

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

workon python35
python manage.py makemigrations
python manage.py migrate

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

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

编写图片上传接口

from rest_framework import serializers
class ImageUploadSerializer(serializers.Serializer):
  token = serializers.CharField(max_length=100)
  image = serializers.ImageField()

from .models import *
from django.views.decorators.csrf import csrf_exempt
import time
import hashlib
class 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)

运行项目

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

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

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

图片存储位置

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

图片的完整访问路径为

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, include
from django.contrib import admin
from rest_framework.schemas import get_schema_view
from mytest.views import ReturnJson
import mytest
from mytest.views import SwaggerSchemaView
from mytest.views import ImageUpload
from django.views.static import serve
from django.conf import settings

urlpatterns = [
  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 Image
class GETAllImages(APIView):

  def get(self, request, *args, **kwargs):
    imagesset=Image.objects.all()
    return JsonResponse(data=imagesset)

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

from django.conf.urls import url, include
from django.contrib import admin
from rest_framework.schemas import get_schema_view
from mytest.views import ReturnJson
import mytest
from mytest.views import SwaggerSchemaView
from mytest.views import ImageUpload, GETAllImages
from django.views.static import serve
from django.conf import settings

urlpatterns = [
  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 mysql数据库及图片上传接口详解

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

Python 相关文章推荐
python中pass语句用法实例分析
Apr 30 Python
微信 用脚本查看是否被微信好友删除
Oct 28 Python
用Eclipse写python程序
Feb 10 Python
怎么使用pipenv管理你的python项目
Mar 12 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
Apr 17 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
Python嵌套函数,作用域与偏函数用法实例分析
Dec 26 Python
python实现快递价格查询系统
Mar 03 Python
Python IDE环境之 新版Pycharm安装详细教程
Mar 05 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
Jun 02 Python
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
Apr 13 Python
asyncio异步编程之Task对象详解
Mar 13 Python
解决django中ModelForm多表单组合的问题
Jul 18 #Python
浅谈Django中view对数据库的调用方法
Jul 18 #Python
django-rest-framework解析请求参数过程详解
Jul 18 #Python
python Django中models进行模糊查询的示例
Jul 18 #Python
django-rest-framework 自定义swagger过程详解
Jul 18 #Python
django框架使用方法详解
Jul 18 #Python
Ubuntu+python将nii图像保存成png格式
Jul 18 #Python
You might like
虚拟主机中对PHP的特殊设置
2006/10/09 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
PHP中Array相关函数简介
2016/07/03 PHP
form表单中去掉默认的enter键提交并绑定js方法实现代码
2013/04/01 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
原生JS生成指定位数的验证码
2020/10/28 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队Mineski晋级之路
2018/04/07 DOTA
python 解析XML python模块xml.dom解析xml实例代码
2014/02/07 Python
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
Python中的urllib模块使用详解
2015/07/07 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
金牌葡萄酒俱乐部:Gold Medal Wine Club
2017/11/02 全球购物
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
德国网上超市:myTime.de
2019/08/26 全球购物
请介绍一下WSDL的文档结构
2013/03/17 面试题
给校长的建议书100字
2014/05/16 职场文书
党的群众路线教育实践活动总结
2014/10/30 职场文书
2019广播稿怎么写
2019/04/17 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
golang 生成对应的数据表struct定义操作
2021/04/28 Golang
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android