python+django快速实现文件上传


Posted in Python onOctober 24, 2016

对于web开来说,用户登陆、注册、文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说就没办法一步一步的操作练习;对于web应用来说,包括数据库的创建,前端页面的开发,以及中间逻辑层的处理三部分。

本系列以可操作性为主,介绍如何通过django web框架来实现一些简单的功能。每一章都具有完整性和独立性。使用新手在动手做的过程中体会web开发的过程,过程中细节请参考相关文档。

本操作的环境:
===================
deepin linux 2013(基于ubuntu)
python 2.7
Django 1.6.2
===================

创建项目与应用                                                                                                             

#创建项目
fnngj@fnngj-H24X:~/djpy$ django-admin.py startproject mysite2
fnngj@fnngj-H24X:~/djpy$ cd mysite2
#在项目下创建一个disk应用
fnngj@fnngj-H24X:~/djpy/mysite2$ python manage.py startapp disk

目录结构如下:

python+django快速实现文件上传

打开mysite2/mysite2/settings.py文件,将disk应用添加进去:

# Application definition

INSTALLED_APPS = (
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'disk',
)

设计Model(数据库)                                                                         

打开mysite2/disk/models.py文件,添加如下内容

from django.db import models

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

 def __unicode__(self):
  return self.username

创建两个字段,username 用户存放用户名,headImg 用户存放上传文件的路径。

下面进行数据库的同步

fnngj@fnngj-H24X:~/djpy/mysite2$ python manage.py syncdb
Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table disk_user

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes 输入yes/no

Username (leave blank to use 'fnngj'):  用户名(默认当前系统用户名)
Email address: fnngj@126.com  邮箱地址
Password: 密码
Password (again): 确认密码
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

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

创建视图                                                                                               
1、打开mysite2/disk/views.py 文件

from django.shortcuts import render,render_to_response

# Create your views here.
def register(request):
 return render_to_response('register.html',{})

 2、创建注册页面

先在mysite2/disk/目录下创建templates目录,接着在mysite2/disk/templates/目录下创建register.html 文件:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 <title></title>
</head>
<body>
<h1>register</h1>
</body>
</html>

3、设置模板路径

打开mysite2/mysite2/settings.py文件,在底部添加:

#template
TEMPLATE_DIRS=(
 '/home/fnngj/djpy/mysite2/disk/templates'
)

4、设置URL

from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
 # Examples:
 # url(r'^$', 'mysite2.views.home', name='home'),
 # url(r'^blog/', include('blog.urls')),

 url(r'^admin/', include(admin.site.urls)),
 url(r'^disk/', 'disk.views.register'),
)

5、启动服务

fnngj@fnngj-H24X:~/djpy/mysite2$ python manage.py runserver
Validating models...

0 errors found
May 20, 2014 - 13:49:21
Django version 1.6.2, using settings 'mysite2.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

6、访问http://127.0.0.1:8000/disk/

python+django快速实现文件上传

注册页面可以正常打开说明整个过程已经走通。这也是Django开发的基本套路。读者一定要熟练理解这个基本套路。

完善表单提交                                                                                            
通过上面的过程,我们只是把过程串了起来,细心你一定发现,我们的register.html 文件,并没有创建用户提交的表单,views.py文件中也并没有对用户提交的信息做处理。下面我们就针对这两个文件进一步的补充。

打开mysite2/disk/templates/register.html 文件:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 <title></title>
</head>
<body>
<h1>register</h1>
<form method="post" enctype="multipart/form-data" >
{{uf.as_p}}
<input type="submit" value="ok"/>
</form>
</body>
</html>

打开mysite2/disk/views.py 文件:

from django.shortcuts import render,render_to_response
from django import forms
from django.http import HttpResponse
# Create your views here.

class UserForm(forms.Form):
 username = forms.CharField()
 headImg = forms.FileField()

def register(request):
 if request.method == "POST":
  uf = UserForm(request.POST,request.FILES)
  if uf.is_valid():
   return HttpResponse('upload ok!')
 else:
  uf = UserForm()
 return render_to_response('register.html',{'uf':uf})

再次刷新http://127.0.0.1:8000/disk/ 页面

python+django快速实现文件上传

填写用户名,选择本地上传文件,点击“ok”

python+django快速实现文件上传

抛出一个错误,这个错误比较友好,所以不是我们操作过程中的小错误。

 打开mysite2/mysite2/settings.py文件,将下面一行代码注释:

MIDDLEWARE_CLASSES = (
 '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',
)

再次刷新http://127.0.0.1:8000/disk/ 页面,我们就可以正常将用户名和文件提交了!

python+django快速实现文件上传

将数据写入数据库         

虽然已经实现了数据的提交,但用户名与文件并没有真正的写入到数据库。我们来进一步的完善mysite2/disk/views.py 文件:

#coding=utf-8
from django.shortcuts import render,render_to_response
from django import forms
from django.http import HttpResponse
from disk.models import User

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

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

再次刷新http://127.0.0.1:8000/disk/ 页面,完成文件的上传。

python+django快速实现文件上传

那数据库中保存的是什么呢?

fnngj@fnngj-H24X:~/djpy/mysite2$ sqlite3 db.sqlite3 
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from disk_user;
1 | Alen | upload/desk.jpg
sqlite>

通过查看数据库发现,我们数据库中存放的并非用户上传的文件本身,而是文件的存放路径。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python基础之函数用法实例详解
Sep 10 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
Dec 25 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
Feb 07 Python
python使用matplotlib画饼状图
Sep 25 Python
pandas 数据归一化以及行删除例程的方法
Nov 10 Python
python paramiko利用sftp上传目录到远程的实例
Jan 03 Python
使用Python和Prometheus跟踪天气的使用方法
May 06 Python
Python代码太长换行的实现
Jul 05 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
Jan 04 Python
服务器端jupyter notebook映射到本地浏览器的操作
Apr 14 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 Python
python实现简单爬虫功能的示例
Oct 24 #Python
简单谈谈Python中的反转字符串问题
Oct 24 #Python
Python 内置函数complex详解
Oct 23 #Python
Python检测生僻字的实现方法
Oct 23 #Python
python 写入csv乱码问题解决方法
Oct 23 #Python
解决Python中字符串和数字拼接报错的方法
Oct 23 #Python
python 读写txt文件 json文件的实现方法
Oct 22 #Python
You might like
通过对服务器端特性的配置加强php的安全
2006/10/09 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
2014/06/22 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
2019/08/28 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
python微信跳一跳系列之棋子定位颜色识别
2018/02/26 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
Python学习笔记之视频人脸检测识别实例教程
2019/03/06 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
浅谈Python3中print函数的换行
2020/08/05 Python
详解python变量与数据类型
2020/08/25 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
CSS3实现类似翻书效果的过渡动画的示例代码
2019/09/06 HTML / CSS
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
德国家具在线:Fashion For Home
2017/03/11 全球购物
H&M旗下高端女装品牌:& Other Stories
2018/05/07 全球购物
社区工作者先进事迹
2014/01/18 职场文书
中药专业毕业自荐书范文
2014/02/08 职场文书
2014年女职工工作总结
2014/11/27 职场文书
2014年统战工作总结
2014/12/09 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
银行大堂经理培训心得体会
2016/01/09 职场文书