最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django mysql數(shù)據(jù)庫(kù)及圖片上傳接口詳解

 更新時(shí)間:2019年07月18日 16:23:22   作者:行如風(fēng)  
這篇文章主要介紹了django mysql數(shù)據(jù)庫(kù)及圖片上傳接口詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

我們?cè)?nbsp;django-rest-framework解析請(qǐng)求參數(shù) 文章中完成了接口文檔到參數(shù)解析, 一個(gè)完整的流程中還缺少對(duì)數(shù)據(jù)庫(kù)的操作. 本篇內(nèi)容為django連接數(shù)據(jù)庫(kù), 并編寫(xiě)一個(gè)image表用來(lái)存儲(chǔ)圖片路徑, 編寫(xiě)圖片上傳接口和查看數(shù)據(jù)庫(kù)中所有圖片路徑的接口.

前期準(zhǔn)備

django操作圖片需要安裝一個(gè)三方庫(kù)叫做,Pillow

workon python35
pip install pillow
pip install pymysql

Pillow這個(gè)庫(kù)可以對(duì)圖片進(jìn)行操作, 例如生成縮略圖等等, 非常強(qiáng)大.

pymysql是python3中用來(lái)連接數(shù)據(jù)庫(kù)的一個(gè)庫(kù).

安裝mysql數(shù)據(jù)庫(kù). 安裝MySQLWorkBench(作用和navicat一樣,使用其他軟件也可以)

選好點(diǎn)擊apply 提交創(chuàng)建新庫(kù).

django如何存儲(chǔ)圖片

一般圖片不存數(shù)據(jù)庫(kù)單獨(dú)存儲(chǔ)于某個(gè)路徑, 開(kāi)發(fā)過(guò)程中就存在項(xiàng)目的某個(gè)路徑下.

iOS開(kāi)發(fā)中有個(gè)http 304問(wèn)題. 就是請(qǐng)求圖片時(shí), 如果有緩存直接取緩存的圖片. 實(shí)際上蘋(píng)果早已幫我們處理好了. 實(shí)際開(kāi)發(fā)中不需要針對(duì)http 304編寫(xiě)任何代碼.

關(guān)于http 304的問(wèn)題

這一篇文章寫(xiě)的非常詳細(xì)了.

現(xiàn)在我們進(jìn)行服務(wù)端編程, 服務(wù)端是如何生成etag, last-modify這些參數(shù)的呢?

這個(gè)問(wèn)題涉及到服務(wù)端框架對(duì)靜態(tài)資源的管理方法.

在實(shí)際將項(xiàng)目部署到服務(wù)器上時(shí), 我們對(duì)動(dòng)態(tài)資源和靜態(tài)資源是分開(kāi)管理的. 我使用nginx+uwsgi 部署, nginx 管理靜態(tài)資源,ETag 之類的, nginx 會(huì)自動(dòng)生成,管理, 不需要服務(wù)端程序員為此編寫(xiě)什么代碼.....

圖片上傳接口, 接收到圖片文件, 類型, 大小校驗(yàn), 將圖片保存到靜態(tài)文件目錄下, 生成此圖片的url存儲(chǔ)到mysql數(shù)據(jù)庫(kù).

編寫(xiě)存儲(chǔ)圖片路徑和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表示圖片上傳的具體路徑.

修改數(shù)據(jù)庫(kù)配置連接mysql

修改settings.py文件中的DATABASES 到下面的樣式. name是剛剛創(chuàng)建mysql新庫(kù)的名稱. user password 是mysql用戶的用戶名和密碼. mysql端口號(hào)默認(rèn)為3306

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

記得刪除 migrations目錄下除了__init__.py 之外的所有文件.

這些文件記錄了對(duì)數(shù)據(jù)庫(kù)定義個(gè)整個(gè)修改流程. 切換數(shù)據(jù)庫(kù)后這個(gè)流程和新庫(kù)根本對(duì)不上號(hào). 需要全部刪除.

修改與settings.py 同一目錄的__init__.py 文件

添加兩行代碼

import pymysql
pymysql.install_as_MySQLdb()

cd到項(xiàng)目manage.py文件的路徑下,運(yùn)行

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

使用mysqlworkbench 連接3306打開(kāi)之前創(chuàng)建的庫(kù)可以看到表都已經(jīng)被創(chuàng)建出來(lái)

編寫(xiě)圖片上傳接口

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"   (我簡(jiǎn)單寫(xiě)了個(gè)頁(yè)面做提交)\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("校驗(yàn)成功")
    else:
      return JsonError("參數(shù)校驗(yàn)失敗")

    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)

運(yùn)行項(xiàng)目

調(diào)用上傳圖片接口, 我用了postman測(cè)試接口

圖片存儲(chǔ)位置

圖片的完整訪問(wèn)路徑為

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

此時(shí)請(qǐng)求會(huì)失敗因?yàn)檫@個(gè)路徑不允許訪問(wèn), 需要進(jìn)行簡(jiǎn)單配置
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}),
]

這次圖片鏈接變?yōu)?br />

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

寫(xiě)一個(gè)查詢所有圖片并返回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}),
]

全部搞定

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Numpy中np.random.rand()和np.random.randn() 用法和區(qū)別詳解

    Numpy中np.random.rand()和np.random.randn() 用法和區(qū)別詳解

    這篇文章主要介紹了Numpy中np.random.rand()和np.random.randn() 用法和區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Python實(shí)現(xiàn)PING命令的示例代碼

    Python實(shí)現(xiàn)PING命令的示例代碼

    本文主要介紹了Python實(shí)現(xiàn)PING命令的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 自動(dòng)轉(zhuǎn)換Python代碼為HTML界面的GUI庫(kù)remi使用探究

    自動(dòng)轉(zhuǎn)換Python代碼為HTML界面的GUI庫(kù)remi使用探究

    這篇文章主要為大家介紹了自動(dòng)轉(zhuǎn)換Python代碼為HTML界面的GUI庫(kù)remi使用探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Python3 MySQL 數(shù)據(jù)庫(kù)連接的使用示例

    Python3 MySQL 數(shù)據(jù)庫(kù)連接的使用示例

    本文我們?yōu)榇蠹医榻B Python3 使用 PyMySQL 連接數(shù)據(jù)庫(kù),并實(shí)現(xiàn)簡(jiǎn)單的增刪改查,需要的朋友可以參考下
    2021-06-06
  • 獲取python運(yùn)行輸出的數(shù)據(jù)并解析存為dataFrame實(shí)例

    獲取python運(yùn)行輸出的數(shù)據(jù)并解析存為dataFrame實(shí)例

    這篇文章主要介紹了獲取python運(yùn)行輸出的數(shù)據(jù)并解析存為dataFrame實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Python使用Altair創(chuàng)建交互式數(shù)據(jù)可視化的操作指南

    Python使用Altair創(chuàng)建交互式數(shù)據(jù)可視化的操作指南

    Altair 是一個(gè)基于 Vega-Lite 的 Python 數(shù)據(jù)可視化庫(kù),它旨在簡(jiǎn)化數(shù)據(jù)可視化的創(chuàng)建過(guò)程,尤其適用于統(tǒng)計(jì)圖表的生成,Altair 強(qiáng)調(diào)聲明式編碼方式,通過(guò)簡(jiǎn)單的語(yǔ)法,用戶能夠快速創(chuàng)建復(fù)雜的交互式圖表,本文將介紹 Altair 的基礎(chǔ)用法、常見(jiàn)圖表類型,需要的朋友可以參考下
    2024-12-12
  • PyTorch的安裝與使用示例詳解

    PyTorch的安裝與使用示例詳解

    本文介紹了熱門(mén)AI框架PyTorch的conda安裝方案,與簡(jiǎn)單的自動(dòng)微分示例,并順帶講解了一下PyTorch開(kāi)源Github倉(cāng)庫(kù)中的兩個(gè)Issue內(nèi)容,需要的朋友可以參考下
    2024-05-05
  • 基于python調(diào)用psutil模塊過(guò)程解析

    基于python調(diào)用psutil模塊過(guò)程解析

    這篇文章主要介紹了基于python調(diào)用psutils模塊過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python輕松管理與操作文件的技巧分享

    Python輕松管理與操作文件的技巧分享

    在日常開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到需要對(duì)文件進(jìn)行操作的場(chǎng)景,如讀寫(xiě)文件、文件夾操作等。本文將為大家介紹一些 Python 中處理文件的實(shí)用技巧,讓你的工作更高效
    2023-05-05
  • 快速解決jupyter啟動(dòng)卡死的問(wèn)題

    快速解決jupyter啟動(dòng)卡死的問(wèn)題

    這篇文章主要介紹了快速解決jupyter啟動(dòng)卡死的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04

最新評(píng)論

登封市| 六安市| 宜春市| 微博| 松溪县| 台北市| 西安市| 盘山县| 应用必备| 安西县| 望谟县| 顺昌县| 秦皇岛市| 和政县| 桂林市| 台州市| 沁水县| 浦北县| 齐河县| 宁城县| 洪雅县| 和顺县| 湘阴县| 都昌县| 静海县| 文登市| 尚志市| 辰溪县| 宜兴市| 遂昌县| 安义县| 南宫市| 壤塘县| 乌鲁木齐市| 垣曲县| 霞浦县| 武冈市| 涞源县| 辉南县| 汉沽区| 邯郸市|