Django-图片服务器-流程梳理
Django
正所谓技术是实践经验的积累,在学习了python爬虫、mysql的相关知识后,手痒难耐,心中豪气迸发,想做一个自己的网站,虽然咱目标就是当个互联网杂鱼,但是咋滴也得干一点点事情。说干就干,python的Django框架作为老牌的后端框架,呲呲呲,那咱还不是拿来主义,嘿嘿嘿。耗时一周这基于django框架的后端总算实现了咱初步的设想,下面来梳理一下流程。
按照步骤一步步复制操作即可建立一个简单的图片存储的后台。
这里安装的坑就不介绍,直接上代码了
第一步(创建项目及配置):
打开cmd窗口,转至创建项目的文件夹
文件夹目录下,创建工程:django-admin startproject project
创建应用:python manage.py startapp myapp
进入mysql:mysql -u root -p
mysql数据库下创建database:creat database pictures;
第二步(项目配置)
配置SQL数据库、激活应用、汉化,project下的setting.py下设置
数据库
DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘pictures’,
‘USER’:‘root’,
‘PASSWORD’:‘root’,
‘HOST’:‘localhost’,
‘PORT’:‘3306’
}
}
激活项目
installed_APPS选项中加上一句:‘myapp’
汉化、设置时区
settings.py文件找到language_code 和time_zone
language_code = ‘zh-Hans’
time_zone= ‘Asia/Shanghai’
第三步 模型版块
编辑文件models.py:(可以套用):
class UploadImage(models.Model):imgName = models.CharField(max_length=256, default="", verbose_name="文件名") # verbose_name 详细名称imgMd5 = models.CharField(max_length=128, verbose_name="MD5值")imgType = models.CharField(max_length=32, verbose_name="类型")imgSize = models.IntegerField(verbose_name="大小")imgPath = models.CharField(max_length=128, verbose_name="图片路径")imgCreated = models.CharField(max_length=64, default=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))imgUpdated = models.CharField(max_length=64, default=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))def __str__(self):return "%s-%d-%s" % (self.imgName, self.imgSize, self.imgPath)
UploadImage模型,数据主要包含 文件名、MD5值、文件类型、文件大小、文件绝对路径、创建时间和更新时间
cmd进入项目文件输入命令:
生成迁移文件:python manage.py makemigrations
迁移:python manage.py migrate
(这个就是把你模型定义的表格进行mysql的执行)
第四步启动服务器
cmd项目文件目录下
创建服务器管理员:python manage.py createsuperuser
启动服务器:python manage.py runserver { ip}: {port}
本地管理站点:127.0.0.1:8000/admin
(浏览器输入127.0.0.1:8000/admin 就能见到你的Django管理员页面)
自定义myapp的admin界面(包含子属性页面设置),
编辑myapp/admin.py文件:
from django.contrib import admin
from .models import UploadImage
@admin.register(UploadImage) #注册显示界面的数据库,并修饰
class UploadAdmin(admin.ModelAdmin):#列表页属性def size(self):a=self.imgSizeif a<1024:b=str(a)+'字节'return belif a>1024 and a<1024*1024:b = str(a//(1024)) + 'KB'return belif a > 1024*1024 and a < 1024 * 1024*1024:b = str(a//(1024*1024)) + 'MB'return bsize.short_description = "大小"list_display=['imgName','imgType',size,'imgPath', 'imgUpdated']list_filter =['imgType']list_per_page=5fields =['imgName','imgMd5','imgType','imgSize','imgPath','imgCreated', 'imgUpdated']# fieldsets =[('num',{'fields':['imgName','imgMd5','imgType','imgSize']}),# ('base',{'fields':['imgPath']}),# ('ues', {'fields': [ 'imgCreated', 'imgUpdated']})# ]actions_on_top = Falseactions_on_bottom = True
第五步 编辑视图
views版块
(后端的主要逻辑集中的地方包含:站点页面显示、模型数据获取、传递模板数据、连接模板、数据的处理、保存等操作):
这里代码分解开来,先讲解函数功能。
作为开发的枢纽,实现以下功能
1.响应主页面的请求
def function (request)return HttpResponse("你真好")
2.响应次级页面的请求
def detail(rquest,num):return HttpResponse("detail-%s"%num)
3.通过模型请求数据库数据,传递给模板(后面创建html会用到)
from .models import UploadImage
def picture(request):pictureList= UploadImage.objects.all()return render(request,'01.html',{'pictures':pictureList})
4.定义处理请求的函数,返回图片在服务器的url,
#哈希计算图片的md5值,返回
def get_file_md5(file):md5_obj = hashlib.md5()for chunk in file.chunks():md5_obj.update(chunk)return md5_obj.hexdigest()# 重命名并写入
def rename(file):times = '2020'#time.strftime('%Y%m%d%H%M%S') #获取当地时间ran = os.path.splitext(file.name)[0]#random.randint(0, 1000) #生成0-1000的随机数ext = os.path.splitext(file.name)[1] #分离文件的名字和扩展名;取拓展名new_file = "{}{}{}".format(times, ran, ext) #时间+随机数+拓展名生成新文件名path = os.path.join('./pictures', new_file).replace('\\', '/')#存储图片的路径为 static/images/新图片名read = open(path, 'wb+') #读写方式打开新文件for chunk in file.chunks():read.write(chunk) #写入图片的分块处理的信息,就是写入图片,默认值为2.5Mread.close()return path#
def upload(request):if request.method == 'POST': #以post请求,request包含的是一个类,base_url = "http://" + request.META["HTTP_HOST"] + "/" #重新拼接request的服务器地址files = request.FILES #请求中附带的图片信息if files:ret = {'code': SUCCESS_CODE, 'message': SUCCESS_MESSAGE, 'urls': []} #上传提示信息:200+上传成功+urlsfor fileName in files:file = request.FILES.get(fileName)if file.size > 5 * 1024 * 1024: #设置图片大小不超过5Mreturn JsonResponse({'code': FAILURE_CODE, 'message': SIZE_ERROR}) #返回失败信息md5 = get_file_md5(file) #得到图片的md5值img_obj = models.UploadImage.objects.filter(imgMd5=md5) #将模型中的imgMd5赋值为图片的md5值#若成功获得md5值if img_obj:url = base_url + img_obj.first().imgPath #生成urlinfo = {'name': file.name, 'url': url} #info 存储文件名+urlelse:path = rename(file) #否则重新生成路径path2=base_url+'static'+path[1:] #可直接访问的url,若设置为本机以外的服务器,需要更改# url = path2 #url=服务器地址+重新生成的路径create = models.UploadImage.objects.create(imgName=os.path.basename(path),imgMd5=md5,imgType=os.path.splitext(file.name)[1],imgSize=file.size,imgPath=path2)info = {'name': file.name, 'url': path2} #info 存储文件名+urlret['urls'].append(info) #提示 信息的url 附加服务器上的图片地址return JsonResponse(ret) #返回提示成功信息else:return JsonResponse({'code': FAILURE_CODE, 'message': FAILURE_MESSAGE}) #返回提示失败信息 #返回提示失败信息
以上定义的函数,需将其与站点的url连接起来才能进行站点的访问
第六步 分配站点
设置分为两个部分
myapp下urls.py 设置对应url 调用方法
project下urls.py 访问myapp的uls
配置url:
修改project下的urls.py文件
from django.contrib import admin
from django.urls import path, re_path
from django.conf.urls import include,url
#该页面决定服务器可以访问的网址,且这些网址都是展示怎样的页面需要连接myapp下的urls
urlpatterns = [path('admin/', admin.site.urls), #管理台re_path(r'^',include('myapp.urls')), #主页,myapp的连接
]
在这里插入代码片
在myapp下创建urls.py文件
from django.urls import re_path
from myapp import views
from django.conf.urls import url
urlpatterns = [re_path(r'^$', views.upload), #访问主页网址,该项目views.upload用于post请求处理数据,不能进行访问url(r'^(\d+)/$',views.detail), #访问主页网址后面加数字,仅用于展示该用法url(r'^picture/$',views.upload) #访问主页网址后面加/picture,该项目为显示01.html文件内容
]
在这里插入代码片
第七步 模板的使用(html文件的创建):
myapp下创建templates目录
配置模板路径:修改settings.py下的templates,加上
'DIRS':[os.path.join(BASE_DIR,'templates')]
#根目录下的templates文件夹
由于是图片服务器,为了方便请求服务器获得图片数据在settings.py最后需要设置django自带的static方法
#当连接中含有static时,django会在各个app的static文件夹寻找 static/后面的字段的文件STATIC_URL = '/static/'#当djanggo在app下找不到对应的文件,django在staticfiles_dirs指定的文件目录下寻找STATICFILES_DIRS = [os.path.join(BASE_DIR, 'pictures'), #BASE_DIR 是文件根目录,指定文件根目录下的pictures文件夹os.path.join(BASE_DIR),#BASE_DIR是项目跟目录]
设置完毕后 请求http://127.0.0.1:8000/static/pictures即可获得相应的图片,
请求1: http://127.0.0.1:8000/pictures/ ,直接在post中附带如下信息,仅作为图片服务器,写个小小的请求文件
img=open(path,'rb') #path为02.png图片的路径
files={"02.png": img}
r=requests.post(url='http://127.0.0.1:8000/pictures/',files=files)
img.close()
棒棒哒!
当然我们的后端不止如此,后续的完善也会陆续更新在博客,如果您感觉好用,请给卑微的代码搬运工点下一个赞吧。
人生苦短…
Django-图片服务器-流程梳理相关推荐
- Django搭建基本网站流程梳理
流程梳理 1.mysql创建数据库 2.创建项目 3.创建应用 4.激活应用 5.配置数据库 6.创建模型类 7. 生成迁移文件 8. 执行迁移 9. 配置Admin站点 10. 创建模板目录/项目模 ...
- (二)无状态的web应用(单py的Django占位图片服务器)
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 阅读本文建议了解Django框架的基本工作流程,了解WSGI应用,如果对以上不是很清楚,建议结 ...
- 【django云服务器部署】django+uwsgi+nginx 部署的完整流程
本篇博客完整地记录了我从购买服务器到完成部署的全过程,需要的朋友可以参考一下我的流程,看这一篇文章就能成功部署项目啦. 写这个的本意是为备忘( 保姆级步骤),同时由于我在最开始部署项目时,没有找到一个 ...
- Python框架篇之Django(基本流程、命令行、配置文件)
文章目录 一.总述 二.Django的实现流程 三.django的命令行 四.配置文件(settings) 1.MEDIA_ROOT和MEDIA_URL 2.STATIC_ROOT和STATIC_UR ...
- java 图片服务器 上传_Java实现把图片上传到图片服务器(nginx+vsftp)
前言: 在我另一篇笔记中已经记载了如何用nginx + vsftp搭建图片服务器(请参考nginx + vsftp搭建图片服务器),并且用vsftp的客户端工具filezilla测试过已经可用.但是在 ...
- 架设国外服务器怎么维护,架设海外服务器流程分享
如果要使员工到海外服务器,那么肯定还是要对架设海外服务器流程有所了解,只有流程方面精准,才能够保证好使用服务器不受到任何的影响.其实使用国内.海外服务器架设流程都是比较类似的,下面就来简单介绍一下具体 ...
- 阿里云购买云服务器流程及注意事项(新手用户必看图文教程)
现在不论是个人还是企业,只要在网上开展业务都需要有自己的网站或者APP客户端.而现在随着虚拟主机被淘汰,独立服务器成本高企,选择云服务器部署自己的网站已经成为大家的共识.而在所有云服务器商家中,阿里云 ...
- 阿里云购买云服务器流程及注意事项(新用户必看图文教程)
现在不论是个人还是企业,只要在网上开展业务都需要有自己的网站或者APP客户端.而现在随着虚拟主机被淘汰,独立服务器成本高企,选择云服务器部署自己的网站已经成为大家的共识.而在所有云服务器商家中,阿里云 ...
- 图片服务器FastDFS的安装及使用
FastDFS介绍 FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用FastDFS ...
最新文章
- 【Storage】Ubuntu LVM 安装配置
- Acwing104. 货仓选址:贪心(绝对值不等式)
- 京东双十一助推下沉市场消费升级,“消费平级”时代提前到来
- js 控制按钮点击后不可用(用于短信或者邮箱验证)
- OpenGL通过Assimp加载模型
- Tomcat:基础安装和使用教程
- 初识ABP vNext(2):ABP启动模板
- java学习(34):巩固练习
- SecureWatch和人工智能为疫情期间更安全有效地监控房地产开发提供助力
- 根据多个字段分组_Excel 分组后计算
- Excel插入多列相同数据
- 使用 Netsh.exe 配置 WinHTTP 的代理设置
- 移动办公系统全自动加密和数字签名解决方案
- android anr 分析方法,Android ANR分析
- pytorch Cosine Annealing LR
- html5 自动分享到朋友圈,html5手机端分享微信朋友圈代码
- Nand Flash控制器
- uoj198【CTSC2016】时空旅行
- 健身网站php,基于WEB的健身网站的设计与实现
- html正则表达式怎么写用户名非空,js通过正则匹配没有内容的空标签