django mysql數(shù)據(jù)庫(kù)及圖片上傳接口詳解
前言
我們?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í)有所幫助,也希望大家多多支持腳本之家。
- Django 實(shí)現(xiàn)圖片上傳和下載功能
- Django實(shí)現(xiàn)圖片上傳功能步驟解析
- 在django中圖片上傳的格式校驗(yàn)及大小方法
- Django 實(shí)現(xiàn)圖片上傳和顯示過(guò)程詳解
- Django框架文件上傳與自定義圖片上傳路徑、上傳文件名操作分析
- django將圖片上傳數(shù)據(jù)庫(kù)后在前端顯式的方法
- Django后臺(tái)獲取前端post上傳的文件方法
- 利用django如何解析用戶上傳的excel文件
- Python+django實(shí)現(xiàn)文件上傳
- django實(shí)現(xiàn)圖片上傳數(shù)據(jù)庫(kù)并顯示
相關(guān)文章
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命令的示例代碼,文中通過(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使用探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
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í)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
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
基于python調(diào)用psutil模塊過(guò)程解析
這篇文章主要介紹了基于python調(diào)用psutils模塊過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

