我们在,django-rest-framework解析请求参数,文章中完成了接口文档到参数解析,一个完整的流程中还缺少对数据库的操作。本篇内容为django连接数据库,并编写一个图像表用来存储图片路径,编写图片上传接口和查看数据库中所有图片路径的接口。
django操作图片需要安装一个三方库叫做,枕头
被python35 pip安装枕头 pip安装pymysql
枕头这个库可以对图片进行操作,例如生成缩略图等等,非常强大。
pymysql是python3中用来连接数据库的一个库。
安装mysql数据库。安装MySQLWorkBench(作用和navicat一样,使用其他软件也可以)
选好点击应用提交创建新库。
一般图片不存数据库单独存储于某个路径,开发过程中就存在项目的某个路径下。
iOS开发中有个http 304问题。就是请求图片时,如果有缓存直接取缓存的图片。实际上苹果早已帮我们处理好了。实际开发中不需要针对http 304编写任何代码。
关于http 304的问题
这一篇文章写的非常详细了。
现在我们进行服务端编程,服务端是如何生成etag,最后修改这些参数的呢& # 63;
这个问题涉及到服务端框架对静态资源的管理方法。
在实际将项目部署到服务器上时,我们对动态资源和静态资源是分开管理的。我使用nginx + uwsgi部署,nginx管理静态资源,ETag之类的,nginx会自动生成,管理,不需要服务端程序员为此编写什么代码.....
图片上传接口,接收到图片文件,类型,大小校验,将图片保存到静态文件目录下,生成此图片的网址存储到mysql数据库。
修改models.py文件。
django。数据库导入模型 进口日期时间 类图(models.Model): # url=models.TextField (null=True) 形象=models.ImageField (upload_to=str(“图像/{时间}”.format(时间=str (datetime.date.today () .strftime (% Y % m/% d))))) create_time=模型。DateTimeField (auto_now_add=True, null=True) update_time=模型。DateTimeField (auto_now=True, null=True) 类元: 通过
ImageField中的upload_to表示图片上传的具体路径。
修改设置。py文件中的数据库到下面的样式。名字是刚刚创建mysql新库的名称。用户密码是mysql用户的用户名和密码。mysql端口号默认为3306
数据库={ “默认”:{ “发动机”:“django.db.backends.mysql”, “名称”:“测试”, “用户”:“根”, “密码”:“111111”, “主机”:127.0.0.1, “端口”:“3306”, } }
记得删除迁移目录下除了__init__。py之外的所有文件。
这些文件记录了对数据库定义个整个修改流程。切换数据库后这个流程和新库根本对不上号。需要全部删除。
修改与设置。py同一目录的__init__。py文件
添加两行代码
进口pymysql pymysql.install_as_MySQLdb ()
cd到项目管理。py文件的路径下,运行
被python35 python管理。py makemigrations python管理。py迁移3306年
使用mysqlworkbench连接打开之前创建的库可以看到表都已经被创建出来
从rest_framework进口序列化器 类ImageUploadSerializer (serializers.Serializer): 令牌=serializers.CharField (max_length=100) 形象=serializers.ImageField () 从得进口* 从django.views.decorators.csrf进口csrf_exempt 导入的时间 进口hashlib 类ImageUpload (APIView): “‘ 图片上传接口\ n “http://127.0.0.1:8000/页面/uploadImage”(我简单写了个页面做提交)\ n “‘ # coreapi_fields=(DocParam (name=傲钆啤?描述=傲钆啤?, # DocParam (name=靶蜗蟆?描述=拔募?type='文件'),) @csrf_exempt def post(自我,请求,* args, * * kwargs): 形象=request.FILES('图像') data=https://www.yisu.com/zixun/get_parameter_dic(请求) #需要判断文件类型是否是图片。 串行=ImageUploadSerializer (data={“令牌”:数据(“令牌”), “图像”:图像}) 如果serial.is_valid (): 打印(“校验成功”) 其他: 返回JsonError(“参数校验失败”) 形象=serial.validated_data.get(“图像”) new_image=图像(图像=图像) imageName=str (new_image.image.name) 位置=str (imageName); (“。”) 扩展=imageName(地点:) name=imageName(位置): 名称=名称+ str (time.time ()) md5=hashlib.md5 (namestring.encode (utf - 8)) .hexdigest () new_image.image.name=md5[10] +扩展 new_image.save () 返回JsonResponse (data=https://www.yisu.com/zixun/new_image)django mysql数据库及图片上传接口详解