python django 实现文件上传

最近在学习 python django 框架,然后网上找了好多东西在做,下面是实现的第一个功能。

通过 python django 实现 web 页面上传文件至服务器。

操作环境:

Centos 7
Python 2.7.5
Django 1.10.2

创建项目与应用

创建project和app,分别为project和app

[root@centos7-201 ~]# django-admin.py startproject project
[root@centos7-201 ~]# cd project/
[root@centos7-201 project]# django-admin.py startapp app

编辑project/settings.py文件,将新定义的 app 加入到 INSTALLED_APPS 配置项里面 。如果不加的话,django 就不能自动找到app中的模板文件(app-name/templates/下的文件)和静态文件(app-name/static/中的文件)

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
]

设计Model(数据库)

编辑app/models.py文件,新建一个类,并且创建两个字段,分别用于存储用户名和上传的文件

CharField:用于存储字符串, max_length设置最大长度
FileField:用于存储文件字符串,upload_to设置文件上传路径

from __future__ import unicode_literals
from django.db import models

# Create your models here.
class User(models.Model):
    username = models.CharField(max_length = 30)
    filename = models.FileField(upload_to = './upload/')

    def __unicode__(self):
        return self.username

创建完成之后进行数据库同步

python manage.py makemigrations
python manage.py migrate

makemigrations:makemigrations命令用来创建新的model
migrate:migrate命令按照app顺序建立或者更新数据库, 将models.py与数据库同步

它会生成app_user表,就我是我们models.py 中所创建的类。Django 提供了他们之间的对应关系。

[root@centos7-201 project]# python manage.py makemigrations
Migrations for 'app':
  app/migrations/0001_initial.py:
    - Create model User
[root@centos7-201 project]# python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying app.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying sessions.0001_initial... OK
[root@centos7-201 project]# 

创建视图

1、编辑app/views.py文件

form.is_valid

# -*- coding:utf-8 -*-
from django.shortcuts import render
from django.shortcuts import render_to_response
from django import forms
from django.http import HttpResponse
from app.models import User

# Create your views here.
class UserForm(forms.Form):
    username = forms.CharField()
    filename = forms.FileField()

def register(request):
    if request.method == 'POST':
        form = UserForm(request.POST, request.FILES)
        if form.is_valid():
            # 获取表单数据
            username = form.cleaned_data['username']
            filename = form.cleaned_data['filename']
            # 获取数据库数据
            user = User()
            user.username = username
            user.filename = filename
            user.save()
            return HttpResponse('file upload ok !')
    else:
        form = UserForm()
    return render_to_response('register.html', {'form': form})

form.is_valid()返回true后,表单数据都被存储在form.cleaned_data对象中(字典类型,意为经过清洗的数据),而且数据会被自动转换为Python对象,如:在form中定义了DateTimeField,那么该字段将被转换为datetime类型,还有诸如:IntegerField、FloatField

user.save() 将信息保存于数据库中


2、创建web页面

创建目录 templates

[root@centos7-201 project]# mkdir app/templates

创建app/templates/register.html文件并进行编辑

method=post:方法为post
enctype=multipart/form-data:表单中enctype=multipart/form-data的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据

显示form找template中的方法多种多样,也可以自定义,下面三个分别表示用p标签,table标签和ul表示显示表单

  • form.as_p
  • form.as_table
  • form.as_ul

vim app/templates/register.html

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
</head>
<body>
    <h1>upload file</h1>
    <form method="post" enctype="multipart/form-data" >
        {{ form.as_p }}
        <input type="submit" value="Submit" />
    </form>
</body>
</html>

3、设置模板路径

编辑project/urls.py文件,添加url匹配规则

from django.conf.urls import url
from django.contrib import admin
from app import views as app_views

urlpatterns = [
    url(r'^app/$', app_views.register),
    url(r'^admin/', admin.site.urls),
]

4、注释掉全局控制参数

编辑project/settings.py文件,找到MIDDLEWARE,注释掉它,不然上传文件报错

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

5、上传文件

打开web浏览器进行上传,点击Submit提交后提示 file upload ok,说明文件已经上传成功

这里写图片描述

这里写图片描述


6、验证

上传的文件在 ./upload 目录下面
数据库所记录文件的顺序,username及filename,我们可以通过命令进行查看

[root@centos7-201 project]# ls
app  db.sqlite3  manage.py  project  upload
[root@centos7-201 project]# 
[root@centos7-201 project]# ls upload/
install.sh
[root@centos7-201 project]# sqlite3 db.sqlite3 
sqlite> select * from app_user;
1|wanglei|upload/install.sh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值