最近在学习 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