使用Django创建文件上传服务器

作者: Passon_Fang | 来源:发表于2016-12-17 11:49 被阅读4596次

title: 使用 Django 创建一个文件上传的服务器
date: 2016-12-17 13:18:12
tags: [Django, FileUpload]
category: Python


django 版本:1.10.1
python 版本:3.5.0

创建工程:upload_demo

django-admin startproject upload_demo

运行工程:

python3 manager.py runserver

打开网站查看工程是否创建成功:

http://127.0.0.1:8000/
django-welcomedjango-welcome

创建一个 app:upload_app

python3 manager.py startapp upload_app

在 'upload_demo/setting.py' 中注册 app:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'upload_app.apps.UploadAppConfig' # +++
]

建立文件上传的 url

创建 View

upload_app/views.py:

def upload_file(request):
    """
    文件接收 view
    :param request: 请求
    :return:
    """
    if request.method == 'POST':
        pass
    else:
        pass
    return HttpResponse("Hello, world. Upload File.")

创建 app 自己的 urls.py

创建文件:upload_app/urls.py

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^$', views.upload_file)
]

注册 app 的 urls.py

将 app 的 url 加入到 upload_demo/urls.py 中:

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^upload/', include('upload_app.urls')) # +++
]

访问网址:http://127.0.0.1:8000/upload/

看到下面的图片,说明 url 建立成功。

django_file_urldjango_file_url

使用表单提交文件

建立一个表单类

upload_app/forms.py:

from django.forms import forms


class FileUploadForm(forms.Form):
    my_file = forms.FileField()

引入模版

建立文件夹 templates/

创建一个 html:templates/upload_temp.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="/upload/" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="提交"/>
</form>


</body>
</html>

upload_demo/settings.py 中声明这个模版:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

修改 view

upload_app/views.py:

from django.http import HttpResponse
from django.shortcuts import render
from upload_app.forms import FileUploadForm

def upload_file(request):
    """
    文件接收 view
    :param request: 请求
    :return:
    """
    if request.method == 'POST':
        my_form = FileUploadForm(request.POST, request.FILES)
        if my_form.is_valid():
            f = my_form.cleaned_data['my_file']
            handle_uploaded_file(f)
        return HttpResponse('Upload Success')
    else:
        my_form = FileUploadForm()
    return render(request, 'upload_temp.html', {'form': my_form})


def handle_uploaded_file(f):
    with open(f.name, 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

打开网站:http://127.0.0.1:8000/upload/ 就可以上传文件了,上传的文件会在工程的根目录下。

利用 Model 管理上传的文件

创建 Model

upload_app/models.py:

from django.db import models

class FileSimpleModel(models.Model):
    """
    文件接收 Model
    upload_to:表示文件保存位置
    """
    file_field = models.FileField(upload_to="upload/%Y/%m/%d")

更新数据库

创建或者修改了 model 都需要更新以下数据库:

python3 manage.py makemigrations
python3 manage.py migrate

这里推荐使用 Navicat 查看数据库:

django_file_dbdjango_file_db

修改 views

在 views 中使用 Model upload_app/views.py:

from django.http import HttpResponse
from django.shortcuts import render
from upload_app.forms import FileUploadForm
from upload_app.models import FileSimpleModel

def upload_file(request):
    """
    文件接收 view
    :param request: 请求
    :return:
    """
    if request.method == 'POST':
        my_form = FileUploadForm(request.POST, request.FILES)
        if my_form.is_valid():
            # f = my_form.cleaned_data['my_file']
            # handle_uploaded_file(f)
            file_model = FileSimpleModel()
            file_model.file_field = my_form.cleaned_data['my_file']
            file_model.save()
        return HttpResponse('Upload Success')
    else:
        my_form = FileUploadForm()
    return render(request, 'upload_temp.html', {'form': my_form})

下面就可以使用了

上传一个文件后数据库变化: file_field 中保存的是文件的相对路径

django_file_upload_dbdjango_file_upload_db

相关文章

网友评论

  • 哈喽jv:上传的文件路径和名字会不会重复? 怎么处理啊?
    哈喽jv:@Doming 嗯 感谢...
    Passon_Fang:@哈喽jv 公司是用 uid作为文件名的,也就是用户上传的文件 由服务器命名
  • 0ab3b8aff884:请问有下载功能么?向学习一下
    0ab3b8aff884:@Doming 因为刚接触Django不太熟,想问一下现在已经把路径存储在数据库中了,你是通过什么方式把这些数据显示在前台并提供下载功能的?
    Passon_Fang:@矛盾共存体的自己 ios,android?使用第三方库进行下载就行了
    Passon_Fang:@矛盾共存体的自己 移动端的下载功能?
  • Joker_Captain:您好,向您请教一个问题,如果想将文件存到一个指定目录如何做,没有使用Model
    Passon_Fang: @kobolds 没记错的话,在 def handle_uploaded_file(f): 方法里面写保存文件的代码
  • feba107b11d5:python2.7下可以运行吗
    Passon_Fang:@feba107b11d5 python语法可能会有小出入,按照语法报错改改应该没问题

本文标题:使用Django创建文件上传服务器

本文链接:https://www.haomeiwen.com/subject/namomttx.html