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

前言

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

前期准备

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

workon python35
pip install pillow
pip 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 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打开之前创建的库可以看到表都已经被创建出来

编写图片上传接口

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)

运行项目

调用上传图片接口, 我用了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, 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}),
]

全部搞定

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

(0)

相关推荐

  • Django如何自定义model创建数据库索引的顺序

    首先这是一个先有鸡还是先有蛋的问题,大部分时候数据都来自excel的整理,当数据越来越多,需要分析的点也越来越多的时候,通过excel来管理显然有些吃力了. 这时候就需要将excel导入到数据库中,然而model创建的索引并非是我们编写时候的顺序,特别是当存在 models.ForeignKey 时,我们必须要先创建 ForeignKey的class,最后再创建总表. 为了保证数据库的索引跟excel的索引一致,我们需要对model中的索引字段做一系列的处理(可能这是一个野路子). 首先当然是先

  • Django如何开发简单的查询接口详解

    前言 Django处理json也是一把好手,有时候在工作中各个部门都会提供自己的相关接口,但是信息也只是单方的信息,这时候需要运维将各个部门的信息进行集成,统一出一个查询接口或页面,方便其他部门同事使用,接下来就介绍一下Django如果操作json. 首先介绍一下通过url获取json的方法: import urllib2 我们的需求是做一个集成的信息查询系统,包括简单的IP信息查询(省份运营商等),以及设备信息(如果是登记在资产管理库中的),还有IP归属(是否是客户源站IP),以及是否为其他部

  • Django-Model数据库操作(增删改查、连表结构)详解

    一.数据库操作 1.创建model表 基本结构 from django.db import models class userinfo(models.Model): #如果没有models.AutoField,默认会创建一个id的自增列 name = models.CharField(max_length=30) email = models.EmailField() memo = models.TextField() 更多字段: 1.models.AutoField 自增列= int(11)

  • django-rest-framework解析请求参数过程详解

    前言 我们在django-rest-framework 自定义swagger 文章中编写了接口, 调通了接口文档. 接口文档可以直接填写参数进行请求, 接下来的问题是如何接受参数, 由于请求方式与参数序列化形式的不同, 接收参数的方式也有不同. 前提条件 服务端我们使用django-rest-framework编写接口. class ReturnJson(APIView): coreapi_fields=( DocParam("token"), ) def get(self, requ

  • Python Django切换MySQL数据库实例详解

    准备 软件 版本 Django 2.1.3 Python 3.7.1 默认使用的是sqlite3 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } 切换为MySql: # settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mys

  • Django 接收Post请求数据,并保存到数据库的实现方法

    要说基本操作,大家基本都会,但是有时候,有些操作使用小技巧会节省很多时间. 本篇描述的就是使用dict小技巧,保存到数据库,用来节省大家编码的工作量. 主要内容:通过for循环拿到post表单中的值并保存到一个dict中,然后通过**dict保存到数据库中. 1.用户提交了一个表单,表单内容包含csrf. 2.服务端除了表单中的csrf要过滤掉,其它的都要保存到数据库中. 3.具体看下方代码: 下面的代码分别为修改和保存,其中修改是根据ID修改的. 要注意, 1.保存前的resourcesOld

  • python采用django框架实现支付宝即时到帐接口

    因工作需要研究了支付宝即时到帐接口,并成功应用到网站上,把过程拿出来分享. 即时到帐只是支付宝众多商家服务中的一个,表示客户付款,客户用支付宝付款,支付宝收到款项后,马上通知你,并且此笔款项与交易脱离关系,商家可以马上使用. 即时到帐只对企业客户服务,注册成功企业账号以后,申请签约即时到帐产品,大约3-5个工作日后,签约成功,可以马上进入集成产品阶段. 这个是支付宝提供的接口,有asp,c#,java,php四种语言的,每种语言提供GBK和UTF-8两种方案.另带一份支付宝的文档,这份文档我感觉

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

    前言 我们在 django-rest-framework解析请求参数 文章中完成了接口文档到参数解析, 一个完整的流程中还缺少对数据库的操作. 本篇内容为django连接数据库, 并编写一个image表用来存储图片路径, 编写图片上传接口和查看数据库中所有图片路径的接口. 前期准备 django操作图片需要安装一个三方库叫做,Pillow workon python35 pip install pillow pip install pymysql Pillow这个库可以对图片进行操作, 例如生成

  • php版阿里云OSS图片上传类详解

    本文实例讲述了php版阿里云OSS图片上传类.分享给大家供大家参考,具体如下: 1.阿里云基本函数 /** * 把本地变量的内容到文件 * 简单上传,上传指定变量的内存值作为object的内容 */ public function putObject($imgPath,$object) { $content = file_get_contents($imgPath); // 把当前文件的内容获取到传入文件中 $options = array(); try { $this->ossClient->

  • Symfony2使用第三方库Upload制作图片上传实例详解

    本文实例分析了Symfony2使用第三方库Upload制作图片上传的方法.分享给大家供大家参考,具体如下: 我们在应用程序或者网站的个人资料里一般都有设置头像的功能,这一章我们在Symfony2里用第三方的一个比较有名Upload库来制作上传图片的功能. 一.安装第三方库 1.在composer.json文件中的"require"中加入 "codeguy/upload": "*" 2.运行指令安装 composer update 二.编码 1.编

  • php多个文件及图片上传实例详解

    本文实例讲述了php多个文件及图片上传的方法.分享给大家供大家参考.具体实现方法如下: 多个文件上传是在单文件上传的基础上利用遍历数组的方式进行遍历表单数组然后把文件一个个上传到服务器上了,下面就来看一个简单多个文件上传实例 多个文件上传和单独文件上传的处理方式是一样的,只需要在客户端多提供几个类型为"file"的输入表单,并指定不同的"name"属性值.例如,在下面的代码中,可以让用户同时选择三个本地文件一起上传给服务器,客户端的表单如下所示: 复制代码 代码如下

  • 微信小程序 图片上传实例详解

    一.了解wx.chooseImage(OBJECT) 二.代码编程 在pages文件里面创建uploadimg文件夹 1.编写页面结构:uploadimg.wxml <view class="container" style="padding:1rem;"> <button type="primary"bindtap="chooseimage">获取图片</button> <image

  • layui 富文本图片上传接口与普通按钮 文件上传接口的例子

    富文本-图片上传 html: <div class="layui-form-item layui-form-text"> <div class="layui-input-block"> <!--<textarea id="L_content" name="contents" required lay-verify="required" placeholder="

  • python 实现图片上传接口开发 并生成可以访问的图片url

    版本:python3.7 功能,开发一个用户访问的页面,支持图片上传,并将其保存在服务器. 项目结构: app.py文件内容如下: from flask import Flask, Response, request, render_template from werkzeug.utils import secure_filename import os app = Flask(__name__) # 设置图片保存文件夹 UPLOAD_FOLDER = 'photo' app.config['U

  • 使用python flask框架开发图片上传接口的案例详解

    python版本:3.6+ 需要模块:flask,pillow 需求:开发一个支持多格式图片上传的接口,并且将图片压缩,支持在线预览图片. 目录结构: app.py编辑内容: from flask import Flask, request, Response, render_template from werkzeug.utils import secure_filename import os import uuid from PIL import Image, ExifTags app =

  • python中Django文件上传方法详解

    Django上传文件最简单最官方的方法 1.配置media路径 在settings.py中添加如下代码: MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 2.定义数据表 import os from django.db import models from django.utils.timezone import now as timezone_now def upload_to(instance, filename):     now = timezo

  • Docker创建自己的镜像与上传流程详解

    目录 引入 了解Docker的资源隔离和主机模式 创建 centos7 容器 部署mysql5.7 创建Docker Hub仓库 生成镜像 提交镜像 引入 在部署毕节服务器时遇到了个问题:   因为在三台服务器做好ovirt-engine超融合后,在主节点服务器上部署可视化平台需要安装mysql5.7,但是安装mysql时需要卸载一些依赖,但是由于怕影响原有的postgresql数据库和ovirt-engine的服务组件,选择了用docker容器部署mysql数据库.   在顺利创建好容器,配置

随机推荐