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

  1. easy_install mysql-python (mix os)
  2. pip install mysql-python (mix os)
  3. apt-get install python-mysqldb (Linux Ubuntu)
  4. cd/usr/ports/databases/py-MySQLdb && make install clean (FreeBSD)
  5. yum install MySQL-python (linux Fedora, CentOS)
  6. pip install mysqlclient (Windows)

如果import MySQLdb报错

则看上一节内容

否则继续

2、新建项目

3、打开mysql命令对话框

输入 create database csvt default charset=utf8;

4、先找到/myweb/myweb/setting.py

修改相关内容

INSTALLED_APPS = ('django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','blog',
)
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'csvt','USER':'root','PASSWORD':'123456','HOST':'','PORT':'',}
}      

5、打开myweb/blog/models.py,输入如下内容

from django.db import modelsclass Employee(models.Model):name=models.CharField(max_length=20)

6、同步数据库

7、查看mysql

7.之后本地做的事情就OK了,现在需要配置服务器nginx了:我的文件在这里

[html] view plaincopy
  1. vim /usr/local/nginx/conf/nginx.conf

配置如下:

[html] view plaincopy
  1. location  /static {
  2. autoindex on;
  3. alias  /root/wechat_huoyun/static;
  4. }

8.这里配置的location /static 是说请求为/static的静态文件都去/root、wechat_huoyun/static下去找,也就是我们项目根目录下的static去找,而不是我们每个APP下的static文件下去找,网上有很多教程,关于static的配置写法也有很多,要注意alias和root的区别,root /path相当于访问static的时候是访问/path/static,而alias /path相当于访问static时是访问/path/。所以你要是写了root /root/wechat_huoyun/static;nginx会去找 /root/wechat_huoyun/static/static里找, 那估计就找不到了。

9.设置成这样的之后,静态文件都交给nginx处理,动态请求交给django去处理。然后重启nginx重启uwsgi。

10.以为很成功了,但是还是找不到,不是404了而且403.做到这一步,你应该就会明白,其实nginx和django的settings是配置正确的了,因为起码不是404找不到了,而是被拒绝403,想了想肯定是权限问题,你项目根目录里的static文件下的js和css文件都需要读权限,包括他的所有父亲目录也都需要读权限。

11.这里需要说明的是我把项目放到了root下了,这是不应该的,因为我需要修改所有父目录的权限也就是要把root目录权限有改了,不安全,由于我是个人练习的,Git和自动化配置都设置后了懒得改了所以直接将root以及子孙目录一直到static的静态文件的权限都改了:

[html] view plaincopy
  1. chmod -R 755 root

12.这里需要注意的是root我其实没有改这么大权限,我root是555权限,root子孙目录是755,本来我以为有读权限就可以了,但是还是403,查了查,网上说还需要x权限,所以我改成了755,所以纠正上面的所有目录需要读权限,是所有目录都需要读和执行权限。至此,大功告成,静态文件加载成功!

  本系列以可操作性为主,介绍如何通过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

目录结构如下:

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

# Application definitionINSTALLED_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_userYou 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/noUsername (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',{})

defupload_file(request): username = request.POST.get('username') fafafa = request.FILES.get('fafafa')import os img_path = os.path.join('static/imgs/',fafafa.name)with open(img_path,'wb')as f:for itemin fafafa.chunks(): f.write(item) ret = {'code':True ,'data': img_path}import jsonreturn HttpResponse(json.dumps(ret))

views.py

def upload_file(request):username = request.POST.get('username')fafafa = request.FILES.get('fafafa')import osimg_path = os.path.join('static/imgs/',fafafa.name)with open(img_path,'wb') as f:for item in fafafa.chunks():f.write(item)ret = {'code': True , 'data': img_path}import jsonreturn HttpResponse(json.dumps(ret))

文件上传预览

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, urlfrom 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/

注册页面可以正常打开说明整个过程已经走通。这也是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/ 页面

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

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

打开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/ 页面,我们就可以正常将用户名和文件提交了!

将数据写入数据库                                                                                 

虽然已经实现了数据的提交,但用户名与文件并没有真正的写入到数据库。我们来进一步的完善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 = usernameuser.headImg = headImguser.save()return HttpResponse('upload ok!')else:uf = UserForm()return render_to_response('register.html',{'uf':uf})

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

在项目的目录下,我们居然发现了用户提交的文件。

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

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> 

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

OK ,你可以在此基础上继续扩展,例如用户提交成功后,将用户名上传的文件名显示出来,或为上传页面加一个漂亮的样式等。

选择了最近一直在看的Django作为我的Android Demo的server端,今天想要实现一个Android下上传文件到服务器的功能,于是想了想,暂时可以先放到静态文件目录下,然后就把自己配置静态文件目录的过程记录一下。

首先打开你的项目下的settings.py文件,在其中加入或修改如下代码:

[python] view plaincopy
  1. # 设置一个路径变量
  2. APP_PATH=os.path.dirname(os.path.dirname(__file__))
  3. # Absolute path to the directory static files should be collected to.
  4. # Don't put anything in this directory yourself; store your static files
  5. # in apps' "static/" subdirectories and in STATICFILES_DIRS.
  6. # 注意要修改STATIC_ROOT变量
  7. STATIC_ROOT = os.path.join(APP_PATH,'static').replace('\\','/')
  8. # URL prefix for static files.
  9. # Example: "http://example.com/static/", "http://static.example.com/"
  10. STATIC_URL = '/static/'
  11. # 当然还有STATICFILES_DIRS变量
  12. STATICFILES_DIRS = (
  13. # Put strings here, like "/home/html/static" or "C:/www/django/static".
  14. # Always use forward slashes, even on Windows.
  15. # Don't forget to use absolute paths, not relative paths.
  16. os.path.join(APP_PATH,'mobile_oa_server/static').replace('\\','/'),
  17. )

然后在你的项目下的urls.py文件中加入如下代码:

[python] view plaincopy
  1. # 导入static和settings
  2. from django.conf.urls.static import static
  3. from django.conf import settings
  4. urlpatterns = patterns('',
  5. # 这里是你原先的urlpatterns的值,记住一定要在urlpatterns的下方,追加static
  6. )
  7. urlpatterns+=static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)

OK,完成了上述步骤之后,我们可以在我们的app目录下创建一个static文件夹,然后扔一张照片啥的进去,为了检测是否成功:效果如下(随便找了张图作测试)

夜已深,收拾完这个小东西就准备睡觉去了,明天又是要奋斗的一天,大家加油!

三、生产环境

前面也说了,在生成环境中,集中存放静态资源有利于使用Lighttpd/Nginx托管静态资源。而生产环境一般是把静态文件放在项目根目录下的static目录下。

默认配置

STATIC_ROOT = ''STATIC_URL = '/static/'STATICFILES_DIRS = ()

我们要做的是

1、配置服务器,我用的是apache。

安装配置详情可参考:

Ubuntu apache2服务器配置

centos7 apache httpd安装和配置django项目

2、在项目根目录下创建collectedstatic目录。

3、配置settings.py

import osSITE_ROOT = os.path.dirname(os.path.abspath(__file__))
SITE_ROOT = os.path.abspath(os.path.join(SITE_ROOT, '../'))
STATIC_ROOT = os.path.join(SITE_ROOT, 'collectedstatic')
STATIC_URL = '/static/'
STATICFILES_DIRS = (# Put strings here, like "/home/html/static" or "C:/www/django/static".# Always use forward slashes, even on Windows.# Don't forget to use absolute paths, not relative paths.
)
INSTALLED_APPS = ('django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.sites','django.contrib.messages','django.contrib.staticfiles',# Uncomment the next line to enable the admin:# 'django.contrib.admin',# Uncomment the next line to enable admin documentation:# 'django.contrib.admindocs','hello',
)

4、运行python manage.py collectstatic收集所有已安装的APP的静态文件到根目录的collectedstatic【即STATIC_ROOT】中

[root@yl-web lxyproject]# python manage.py collectstatic

You have requested to collect static files at the destination
location as specified in your settings.This will overwrite existing files!
Are you sure you want to do this?Type 'yes' to continue, or 'no' to cancel: yes
Copying '/srv/lxyproject/hello/static/images/sheep.png'1 static file copied.

5、配置服务器,将/static/路径指向STATIC_ROOT目录。

即在虚拟主机中配置

Alias /static/ /srv/lxyproject/collectedstatic/

6、配置至此完成,通过浏览器访问

真正发布一个django项目时,对静态文件的管理可能需要额外做一些工作:

  • Less / CoffeeScript 等自动编译成css/js
  • "压缩" css/js文件,提高浏览器加载速度
  • 合并零碎的css/js文件,减少浏览器请求次数
  • 静态资源文件的版本话:浏览器会缓存静态文件,后台代码和静态资源文件都发生更新后,浏览器很可能从缓存提取过期的静态资源,导致页面显示异常。

参考:

django 快速实现文件上传相关推荐

  1. django 快速实现文件上传(django2.0)

    django2.0 快速实现文件上传 本操作环境: 虚拟环境:django2.0 python3.5(应该python3.6都可以使用) window10 1.创建项目与应用(项目和应用都是自己制定的 ...

  2. 第三百一十九节,Django框架,文件上传

    第三百一十九节,Django框架,文件上传 1.自定义上传[推荐] 请求对象.FILES.get()获取上传文件的对象 上传对象.name获取上传文件名称 上传对象.chunks()获取上传数据包,字 ...

  3. Django实战之文件上传下载

    项目介绍 最近学习django,通过文件上传下载这个小项目,总结下常用的知识点. 做这个案例我有以下需求: 1.要支持一次上传多个文件 2.支持上传后记录上传的数据以及列表展示 3.支持下载和删除文件 ...

  4. Django实现任意文件上传(最简单的方法)

    利用Django实现文件上传并且保存到指定路径下,其实并不困难,完全不需要用到django的forms,也不需要django的models,就可以实现,下面开始实现. 第一步:在模板文件中,创建一个f ...

  5. django简单实现文件上传

    在settings设置上传路径 在一个app下设置url 没有 {% csrf_token %} 就会404,设置name= file在view.py 通过getlist('file')来获取所有文件 ...

  6. django文件上传

    Django在处理文件上传时,文件数据被打包封装在request.FILES中. 一.简单上传 首先,写一个form模型,它必须包含一个FileField: # forms.py from djang ...

  7. django 1.8 官方文档翻译: 3-3-1 文件上传

    文件上传 当Django在处理文件上传的时候,文件数据被保存在request. FILES (更多关于 request 对象的信息 请查看 请求和响应对象).这篇文档阐述了文件如何上传到内存和硬盘,以 ...

  8. 文件上传及oss简单上传及下载

    文件上传就是通过io流复制到浏览器的过程 快速实现文件上传功能 1.后台实现文件上传功能  定义controllere @RequestMapping("/upload/file" ...

  9. django 上传文件夹_django文件上传

    1.model中定义属性类型为models.ImageField类型 pic=models.ImageField(upload_to='images/upload/') 2.如果属性类型为ImageF ...

最新文章

  1. CentOS 7.7 安装cmake3
  2. GoJS超详细入门(插件使用无非:引包、初始化、配参数(json)、引数据(json)四步)...
  3. 【运筹学】运输规划 ( 运输规划基变量个数分析 )
  4. 编程随想 关系图_IT什么岗位比较好找工作?一张金字塔图就能明白
  5. python转换函数使用_Python Socket模块中的IP转换函数
  6. CentOS 7.7(1908)发布
  7. 面试过 3000 位候选人,我发现混得好的年轻人都有这 3 个特质
  8. shell编程(精华总结版)
  9. 使用hashcat破解Windows账户密码
  10. 关于显存位宽、显存带宽和显存容量的理解
  11. 基于C# SQLServer开发学员管理系统
  12. 服务器怎么分盘?Windows系统服务器分盘操作方法
  13. java ssm框架论文,基于SSM框架的个人博客系统(源码+论文)
  14. 原始套接字编程——Teardrop
  15. apache服务器安装以及使用passenger插件部署rails应用,基于ubuntu 12.04 LTS
  16. 信息系统项目管理-项目成本管理-(七)
  17. 精馏塔温度控制仿真设计
  18. js导出的xlsx无法打开_使用FileSaver、js-xlsx实现excel导出
  19. VMWare ESXi 开启显卡直通 (PCI 设备直通) 出现 DevicePowerOn 错误
  20. 小度太弱了,干脆自己开发个对话机器人【爬虫,数据库,面向对象,人工智能】

热门文章

  1. python打印浮点数_python – 打印整数或带有n位小数的浮点数
  2. jquery实现app开发闹钟功能_APP商城开发的优势与功能
  3. 如何取消linux响铃_linux初学者入门:VIM编辑简易指南(常用操作)
  4. 汇博工业机器人码垛机怎么写_一文带您理解码垛机器人,原来它这么简单!
  5. 果粉们注意了 外媒爆料以下机型不再支持iOS 13
  6. 信息互通联动防御 亚信安全翻开融合终端安全新篇章
  7. 对称加密与非对称加密
  8. 为什么“15。。。”会导致微信ANR?
  9. 如何像青少年一样玩转 Snapchat
  10. linux运维/自动化开发__目录