(django)01 django实现前端上传图片到后端保存

1、安装django

安装新的虚拟conda环境,安装django

conda create -n djangoo python==3.7
activate djangoo
pip install django

验证安装

>>> import django
>>> django.get_version()
'3.2.13'

2、第一个django项目

在想要创建django项目的路径输入:

django-admin startproject HelloWorld

自动创建的目录结构如下

查看源图像

其中:

  • HelloWorld: 项目的容器
  • manage.py: 一个交互式命令行工具
  • HelloWorld/init.py: 一个空文件,告诉Python该目录是一个 Python包(package)
  • HelloWorld/asgi.py: 一个 ASGI 兼容的 Web 服务器的入口
  • HelloWorld/settings.py: 该 Django 项目的设置/配置
  • HelloWorld/urls.py: 该 Django 项目的 URL 声明、路由表
  • HelloWorld/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口

进入manage.py的同级目录,输入下面的命令开启服务

python manage.py runserver 0.0.0.0:8000

这时打开服务器访问http://localhost:8000就访问了第一个站点了

进一步添加views.py

在urls.py的同级目录创建views.py,输入:

from django.http import HttpResponse
 
def hello(request):
    return HttpResponse("Hello world ! ")

编辑urls.py:

from django.conf.urls import url
 
from . import views
 
urlpatterns = [
    url(r'^$', views.hello),
]
  • 这里的r’^$'是一个正则表达式,表示匹配任何路由
  • 对于url()这个方法来说,第一个参数是路由,第二个参数是想要处理路由的函数,这一点比flask中稍麻烦一些

再次打开服务器访问http://localhost:8000,显示”Hello world ! “

3、实现前端读入图片,通过django写入后端保存

1 定义index.html

<form method="post" enctype="multipart/form-data" action="{% url 'add' %}">

    <div class="form-group">
         <label for="icon_input">图像</label>
         <input name="img" type="file" id="icon_input">
     </div>
     
     {% csrf_token %}
     <button type="submit" class="btn btn-success btn-block">提交</button>
 
 </form>
  • 这里的"multipart/form-data"表示POST带的是图片数据

  • 这里的action="{% url ‘add’ %}"应该是Jinja2的语法,表示这个表单通过名为add这个路由来处理

  • <input name=“img” 这里给input标签指定了name属性,这个属性关系着后台识别,需要注意

  • 在HelloWorld的同级目录创建static和templates目录,index.html放入templates

在这里插入图片描述

2 修改views.py

from django.http import HttpResponse
from django.shortcuts import render

from django.conf import settings
from django.http import HttpResponse
import os
 
def hello(request):
    return HttpResponse("Hello world ! ")

def index(request):
    return render(request,"index.html")

def files(request):
    # 由前端指定的name获取到图片数据
    img = request.FILES.get('img')
    # 获取图片的全文件名
    img_name = img.name
    # 截取文件后缀和文件名
    mobile = os.path.splitext(img_name)[0]
    ext = os.path.splitext(img_name)[1]
    # 重定义文件名
    img_name = f'avatar-{mobile}{ext}'
    # 从配置文件中载入图片保存路径
    img_path = os.path.join(settings.IMG_UPLOAD, img_name)
    # 写入文件
    with open(img_path, 'ab') as fp:
        # 如果上传的图片非常大,就通过chunks()方法分割成多个片段来上传
        for chunk in img.chunks():
            fp.write(chunk) 
    return HttpResponse('uploads success')

  • 首先,也是要通过render来渲染一个html文件
  • 此外,定义了一个路由处理函数files,用于处理表单传来的图片数据
  • request.FILES.get(‘img’) 这里就要用到上面定义的那个name

3、修改urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
 
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index),
    path('add/',views.files,name='add'),
    url(r'^$', views.hello),
]

  • path() 可以接收四个参数,分别是两个必选参数:route、view 和两个可选参数:kwargs、name。route就是路由,view是处理路由的函数,name可以理解为路由的别名。这里给路由处理函数files定义了别名add
path(route, view, kwargs=None, name=None)

4、修改settings.py

首先修改TEMPLATES

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],

定义templates文件夹的路径,以便django项目可以找到

此外,添加上传文件保存路径

# 上传图片的路径
IMG_UPLOAD = os.path.join(BASE_DIR, 'static/uploads')

5、效果

访问http://localhost:8000/index/

在这里插入图片描述

选择图像之后,点击提交

在这里插入图片描述

已上传到后台目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ITTPchnv-1650514526831)(C:\Users\wyh777\AppData\Roaming\Typora\typora-user-images\image-20220421063321481.png)]

  • 13
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django 中,保存图片可以通过使用 ImageField 字段来实现。你需要在你的 models.py 文件中定义一个 ImageField 字段,并在视图中处理上传的图片并将其保存到该字段中。 以下是一个简单的例子: ```python from django.db import models class MyModel(models.Model): name = models.CharField(max_length=100) image = models.ImageField(upload_to='images/') def __str__(self): return self.name ``` 在这个例子中,我们定义了一个名为 MyModel 的模型,并在其中添加了一个名为 image 的 ImageField 字段。`upload_to` 参数指定图片上传后应该存储在哪个文件夹中。 接下来,在视图中处理上传的图片并将其保存到该字段中。以下是一个简单的视图函数: ```python from django.shortcuts import render from django.http import HttpResponseRedirect from .models import MyModel def my_view(request): if request.method == 'POST': name = request.POST['name'] image = request.FILES['image'] my_model = MyModel(name=name, image=image) my_model.save() return HttpResponseRedirect('/success/') return render(request, 'my_template.html') ``` 在这个视图函数中,我们处理了 POST 请求,将上传的图片保存到 MyModel 对象中,并将其保存到数据库中。 最后,我们需要在模板中创建一个表单,允许用户上传图片。以下是一个简单的模板: ```html <form method="post" enctype="multipart/form-data"> {% csrf_token %} <label for="name">Name:</label> <input type="text" name="name" id="name"> <label for="image">Image:</label> <input type="file" name="image" id="image"> <input type="submit" value="Submit"> </form> ``` 在这个模板中,我们创建了一个表单,允许用户上传图片。当用户提交表单时,它将发送一个 POST 请求,并将图片和名称一起发送到服务器。服务器将处理上传的图片并将其保存到数据库中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值