标签归档:Django

django1.8使用表单上传文件

在django中我们可以采用Form类来处理表单,通过实例化处理和在模板中渲染,就可以轻松完成表单的需求,采用django的表单处理方式,能帮我们省去很多的工作,比如验证不能为空,或者要符合某种模式的输入才有效,这些处理起来非常方便,不用自己再单独写代码去验证表单的数据正确性,所以在开发中比较常用,Form提供了很多表单字段,比如日期,文本类型等,如果你熟悉基本的html,学起来会非常容易上手,所以今天我们不打算对每个表单的字段进行逐一说明,今天只说下表单文件的上传,因为这个类型比较特殊,需要一点特殊的处理,我们来创建一个简单的一个实例:

首先我们用Form创建一个简单的表单:

这个表单就2个字段,要求用户输入用户名和上传一个文件或图片。

接下来我们放到模板中去渲染,这时候就可以看到一个基本表单了,视图函数如下:

这个函数判断用户的是否为POST请求,如果是并验证是有效的,然后就返回OK,在验证正确和返回OK的中间放我们的上传文件代码,因为只有文件上传成功能返回OK,我们一会说,如果是GET请求,就直接显示一个空表单,让用户输入。

处理上传文件就是往服务器上生成一个文件,并将上传的文件内容写到新的文件中,所以它的基本函数是这样的,接收上传文件对象为参数,然后本地打开一个文件,从上传的文件中读出文件,写入新的文件中,代码如下:

有了这个上传文件的处理函数,我们就可以进一步完善我们的视图函数里,最终的代码如下:

这样就完成了一个文件的上传,完毕。

 

 

使用Django Highcharts制作图表

在运维工作总很多数据最终的展现方式要用到图表,毕竟用图来展示要比一堆数字更直观些,比如利用率、站点的PV,UV等,大家千万不要觉得看到很多漂亮的图就感觉很难,其实真心不是,因为现在有很多前端的绘图库,你只需要按它要求的格式(json)提供给前端接口,什么曲线图、饼图,还有你从来都不知道的图都可以生成出来,现在用的比较多的是highcharts,echarts等,django-highcharts是django的一个集成库,使用它在django里更方便绘制出我们想要的图表,所以这篇文章就使用它来完成一个超小项目,实现一个站点的PV,UV曲线图, 另外我一直认为公众号其实不太合适贴太多的代码,要看代码最好还是用专业的编辑器,如果通篇都是代码,我估计很多人直接就收藏了,时间久了自己都忘了,起不到真正学习的目的, 所以今天我重点还是讲使用步骤,确保下次大家开发的时候会用,代码只是辅助,当然核心的我也会全部贴出来,但完整的代码限于篇幅就不在贴了,另外这篇是需要小伙伴们有django一点点基础的,如果没有任何基础,可能需要先了解下基本mvc的概念,否则你可能会看的云里雾里, 其它不多说了,现在开始,我先介绍下开发环境:

python 2.7 + django1.8.2 + mysql (版本随意)

第一步,安装django-higchats,这个根据大家使用的环境即可,pip或直接用pycharm工具安装都可以。

第二步,新建project 和app

第三步,以上做完,就可以敲代码了,先建models,就是数据库表的表结构,日常站点访问数据PV,UV数据可以插入到这个表里,一会我们要使用。

第四步,图表模块代码编写,这部分主要是一个类从数据库表中获取数据,然后将数据提供给图形展示类,代码如下:

 

第五步,模板层代码,模板采用ajax方式,从后台获取的json数据给highcharts然后绘制曲线图,代码如下:

有了上面的代码,就可以通过view函数将mindg.html 渲染出来了,最终图如下:

pvuv

关于highcharts的使用就介绍到这里,如有疑问请我直接留言。

nginx+uwsgi+django环境搭建(最新)

前天在一个python技术开发群里大家都在聊django开发相关内容时,突然有一个哥们蹦出来一句,谁能帮我搭建一个线上的django环境,对于这种问题,一般本能的感觉是不难,网上肯定一堆资料,照着敲就可以了,所以很多人直接回复的是,上网上查,结果这哥们来一句,自己都快被网上的资料整崩溃了,看了几十篇没一个能按着步骤搭建完成的,所以跑开发群里来求救来了,我看到后也上网大概搜了下,想看到合适的就发给这位兄台,但我看了几个文章后,非常失望,决定还是自己写一篇吧,网上的内容第一同质化内容太严重,基本你看一篇其它都不用看了,基本都一样,另外最最主要的是文章内容没有价值,因为10篇有9篇都是很久以前的文章,就现在这IT技术的发展,尤其是使用开源的东西,基本每天都在变化,要按这些文章做,能搭建成才怪,所以为了避免大家浪费时间去看那些无用的内容,我就把之前的搭建的环境,整理下,发给大家做个参考,方便大家快速部署线上环境:

具体安装nginx, uwsgi,django不多说了,都是老步骤,除nginx,另外两个都可以通过pip安装,也很方便。

安装完后假设你还没有项目,我们一步一步来,新建一个:

这样就在/home/mytest/my_jd下建立一个项目,目录结构如下:

接下来配置nginx.conf文件,因为文件太长,我只贴关键行了:

这样nginx就配置完毕了,然后启动uwsgi,启动命令如下:

注:具体的生成环境可以加自己需要的参数(这个网上真有),也可以写成一个xml或ini的配置文件, -d是后台运行,后跟的日志文件名

然后测试,在此我们需要一个简单的页面来测试,进入/home/mytest/my_dj/my_jd目录下,新建一个views.py文件,内容如下:

然后修改urls.py如下,标红的是新加的:

测试,在浏览器里输入:http://www.mindg.cn

将显示”hello world”,表示搭建成功。

django模型使用

之前写过一篇django的模型关系,今天腾出时间把上篇的兄弟篇补上,来学习下django orm, 利用django的模型可以很方便的对数据库进行操作,之前开发人员是必须要具备一定sql基础的,但如果有些开发人员就是不想了解sql呢,在之前,不懂那是万万不行的,但自从有了orm,开发人员就可以在不懂sql的情况下也能完成对数据库的增删改查操作,今天我们就来看看如何实现这些基本的需求,开始前我们先定义一个模型,在models.py文件里写入:

有了这个模型,我们就来看最基本的对数据操作实现方法,

1、查:

首先如果要获取所有信息,可以用all,代码如下:

all_per=Info.objects.all()     #相当于select * from Info

如果要获取单个对象可用:

Info.objects.get(name=’john’)

如何要过滤返回的信息,例如要查询名字是john的,可以用filter:

Info.objects.filter(name=’john’)     #相当于select * from Info where name=’jhon’

条件组合查询也是支持的,例如项目等于john,邮件是john@gmail.com的

Info.objects.filter(name=’john’, mail=’john@gamil.com’)

模糊查询,虽然这个不到万不得已不用,有时候还是有可能用到的,例如查询名字里包含john的,

INfo.objects.filter(name__contains=’john’)   #相当于select * from Info where name LIKE ‘%john%’

当然如果你查询的某些数据不想要,可以用exclude,例如查询所有名字是john的,但email不是test@gmail.com的:

Info.objects.filter(name=’john’).exclude(email=’test@gmail.com’)

最后查完的数据如果想排个序,比如按年龄,可以这样:

Info.objects.all().order_by(‘age’),如果反向查下可以在age前面加一个-(减号)即可。

如果只想看前10个人呢,可以用切片,非常灵活,如下:

Info.objects.all().order_by(‘age’)[:10]

以上就是比较常用的查询对数据的操作了,基本满足我们对数据查询的需求,接下来我们说增加。

2、增

如果要添加一个用户,只需要获取用户的信息,一般是来自前台表单,实例化模型,然后调用save保存即可,例如:

person = Info(name=’john’,age=20, email=’john@gmail.com’)

person.save()

这二步就完成了数据的保存。

3、改

如果数据库中某个人邮箱写错了,可以先查出来,然后做更新:

p = Info.objects.get(name=’john’)

p.email=’test@gmail.com’

p.save()

这样就修改了这条记录,如果想对多条进行修改可以自己加条件过滤后修改,例如把所有条目的email全部修改成abc@gmail.com,当然这个例子有点扯,只是为说明用法:

Info.object.all().update(email=’abc@gmail.com’)

4、删除

最后我们说删除,用模型来操作非常简单,基本步骤是先查出你要删的对象,然后执行delete()即可,例如要删除名字是john的记录,可以这样:

p = Info.objects.filter(name=’john’)

p.delete()

这样就删除了,当然这是对1条记录的操作,删除整个表的方法我就不写了,有兴趣自己去查查吧

这篇就到这里,我个人感受是用orm来操作数据库还是非常方便的,整个代码中也不必写任何的sql语句,当然这种orm也并不能覆盖所有的操作,有的地方还是不得不写sql来完成,所以django也支持原生的sql语句,感兴趣的可以去看下官方文档。

django1.8数据迁移

django 从1.7版本开始起增加了一个新的数据迁移功能,在之前如果你数据models文件做了修改,需要手动修改数据库来做数据同步,如果是线上的库,操作风险就比较高了,当然在1.6版本前也有第三方的数据迁移工具,例如south,在1.7版本前大家用这个做数据迁移的比较多,但现在从1.7版本开始就自带数据迁移功能了,因为django1.8是官方永久性支持版本,所以本篇我们是在1.8环境下的操作,如果还用老版本的兄弟,建议尽快切换新版本,因为老版本都官方都不在支持了,所以数据迁移功能对老版本用户来说,这个功能算是比较新的功能,所以有想用django1.8开发的朋友,就要了解数据迁移功能如何使用了,我们今天就来看看如何使用该功能,首先建立我们的models文件,假设我们的models.py文件内容如下:

这是一个典型的博客文章model,有了这个model,我们如何让数据库也建立相应的表呢,之前的用syncdb,但现在我们就要用migrate, 另外需要注意的是sysdb这个命令在1.9版本就没有了。

首先我们生成迁移脚本,运行:

python manage.py mkaemigrations

注:因为我之前已经同步一次数据库,所以为了看明白,我是注释了最后的pulished_date(在这行前加#号)

如果你是第一次运行,看到的内容可能给我不一样。

运行完后会生成内容如下:

Migrations for ‘blog':
0003_remove_post_published_date.py:
– Remove field published_date from post

运维完后并数据库并没有发生变化,只是生成了要操作数据库的一些脚本文件,感兴趣的可以去migrations目录里查看。

接下来运行:

python manage.py migrate

输出:

Synchronizing apps without migrations:
Creating tables…
Running deferred SQL…
Installing custom SQL…
Running migrations:
Rendering model states… DONE
Applying blog.0003_remove_post_published_date… OK

看到已经将published_date这个字段移除了,这个例子是展示的修改,如果你是第一次运行,原理也是一样,就更简单了,有了migrate,以后model的的任何改变,例如增加,删除,修改,都先makemigrations, 然后migrate二步就完成了与数据库的同步,就是这么简单。

郑重说明:以上都是在测试环境运行的结果,请千万不要在自己线上环境进行操作。