创建第一个Django项目
Django是一个开源的Web应用框架,由Python写成,并于2005年7月在BSD许可证下发布。Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django采用MVC设计模式注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don’t Repeat Yourself)。在Django中Python被普遍使用,甚至包括配置文件和数据模型。本文介绍Django在Linux+Mysql环境下安装、配置的过程,包括安装、运行、添加应用的所有流程,最终建立一个可以从Mysql读取文章并显示的Django应用。文章面向刚接触Python/Django的初学者,所以安装过程都以默认环境为主,用pip可以大大简化安装过程。
Install
首先下载Django
wget www.djangoproject.com/m/releases/1.5/Django-1.5.1.tar.gz
得到Django-1.5.1.tar.gz,将其解压后安装
tar xzvf Django-1.4.tar.gz
cd Django-1.5.1
sudo python setup.py install
如果提示缺少setuptools还要下载安装setuptools(建议提前安上,因为在安装MySQL for Python的时候也会用到)。
完成安装后,Django会拷贝一个django-admin.py到/usr/local/bin下,这个py文件引入了Django的管理模块。
进阶方式:virtualenv, pip
Setup
要创建一个Django项目非常简单,使用startproject命令,输入项目名称:
django-admin.py startproject mysite
Django会在当前目录下自动生成一个名为mysite的文件夹,里面有以下文件:
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
以上是Django 1.4以后的目录结构(如果是1.4之前的版本,manage.py和settings.py等文件是在同一层)。站点的配置被放在与项目同名的一个app里(本例中是mysite),所以下文的项目文件夹指的是mysite,注意不要和mysite/mysite文件夹混淆。
__init__.py:python特性,可以是空文件,只是表明这个文件夹是一个可以导入的包。
settings.py:配置文件,主要是数据库信息、加载模块的信息。
url.py:URL配置文件,指定函数与URL的映射关系。
wsgi.py:暂时不用了解,开发都是用Django自带的测试服务器,用nginx/apahce+wsgi启动Django时才用得上。
创建项目后,在项目文件夹启动Django自带的web服务器:
python manage.py runserver
Django会自动检查配置文件中的错误,如果全部正常则顺利启动:
Validating modelsxn--
0 errors found
Apr 10, 2013–05:26:07
Django version 1.5.1, using settings ‘mysite.settings’
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
访问http://127.0.0.1:8000,如果顺利显示,说明Django已经可以正常使用了。但现在只有本机可以访问,要让外网能够访问,或是要更换默认的8000端口,可以执行命令:
python manage.py runserver 0.0.0.0:8080
这样就将端口修改为8080,且外网也可以通过IP访问本机上的Django。
现在要让Django支持Mysql数据库。进入mysite/mysite目录,编辑配置文件(settings.py)。在第12行找到
| DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #设置为mysql数据库 'NAME': 'dmyz', #mysql数据库名 'USER': 'root', #mysql用户名,留空则默认为当前linux用户名 'PASSWORD': '', #mysql密码 'HOST': '', #留空默认为localhost 'PORT': '', #留空默认为3306端口 } } |
因为Django要通过Python操作Mysql,所以要先安装Mysql for Python。在Ubuntu下安装还会提示EnvironmentError:
mysql_config not
found。因为通过apt-get安装的mysql没有安装开发工具包,所以找不到mysql_config文件,使用以下命令安装:
sudo apt-get install libmysqld-dev
URL
Django会通过URL配置文件来查找相应的对象,URL地址使用正则表达式设置。在mysite/mysite目录下可以找到urls.py文件,它是URL配置的默认起点(也可以通过编辑settings.py中的 ROOT_URLCONF值来修改)。直接编辑urls.py
| urlpatterns = patterns('', (r'^$', 'mysite.hello.index'), ) |
r’^$’:正则,表示根目录;
mysite.hello.index:指向mysite这个项目下的hello模块中的index函数。
剩下的就很简单了,在mysite文件夹下建立一个hello.py文件,在其中写入一个index函数:
| #hello.py from django.http import HttpResponse def index(request): return HttpResponse('hello, world') |
刷新网站首页,看到已经输出了”hello, world”。
Application
上一节”hello world”的例子只是说明了URL的用法,可以说完全没有用到Django。Django作为一个Web框架,目的是实现MVC的分离,它可以自行处理一些通用的操作,让开发人员可以专注于核心应用的开发。所以,现在将编写一个名为articles的应用,从mysql数据库里读取出文章作者、标题、内容。
首先建立应用,在manager.py所在目录中执行:
python manage.py startapp articles
运行后在项目文件夹中会增加一个article文件夹,里面有如下文件
models.py
views.py
tests.py
__init__.py
models.py:模型文件,用 Python 类来描述数据表。
views.py:视图文件,用来联系模型与模版,主要的业务逻辑一般都写在这里。
tests.py:单元测试文件,Python的test功能很强大,有兴趣可以自行google,本文不讨论。
编写模型文件(article/models.py),定义用到的字段:
| from django.db import models # Create your models here. class Article(models.Model): title = models.CharField(max_length=50) author = models.CharField(max_length=50) content = models.CharField(max_length=200) |
修改配置文件(settings.py)文件,告诉Django这个App是属于当前项目的。打开配置文件,在尾部找到INSTALLED_APPS元组,将articles添加进去:
| INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django_openid_auth', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', #…… 'articles', #加入app ) |
可以先运行manage.py sql articles命令进行测试,如果可以看到生成的sql语句,说明模型已经正常设置,可以初始化并安装:
python manage.py syncdb
Django会自动在mysql数据库里创建名为article_article的表。而且,因为在INSTALLED_APPS中使用了django.contrib.auth,所以syncdb命令会要求提供一个管理员帐号和密码,用来登录Django的管理工具。
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
简单的模型就设置完成了,现在编辑视图(articles/views.py)文件:
| # articles/views.py from django.shortcuts import render_to_response from articles.models import Article def latest_article(request): article_list = Article.objects.order_by('-id') return render_to_response('articles/article.html',{'article_list':article_list}) |
2行:导入Django的render_to_response()函数,它用来调用模板、填充内容和返回包含内容的页面。
3行:导入之前编写模型文件中的Article类。
4~6行:定义一个latest_article函数,利用Article类从数据库获得数据,并按照id倒序输出。然后调用模版文件,将变量传递过去。
直接运行会报错TemplateDoesNotExist at 路径,因为还没有告诉Django,到那里去找articles/article.html文件。
编辑配置文件(settings.py),修改TEMPLATE_DIRS,设置一个模版路径,这里将模版目录直接指定在项目文件夹(mysite)中:
TEMPLATE_DIRS = (
"/var/www/mysite"
)
设置后,程序运行时会去找 /var/www/mysite/articles/article.html。
如果使用过其它框架或者模板引擎,下面article.html的内容就很容易看懂了,Django在模版文件中利用相应的TAG控制传递过来的变量显示的位置:
{% for article in article_list %}
Author:{{ article.author }}
Title:{{ article.title }}
Content:{{ article.title }}
{% endfor %}
最后,修改URL配置文件,让http://127.0.0.1:8000/articles/指向视图(views.py)中定义的latest_article函数:
(r’^articles/’, ‘articles.views.latest_article’),
这样所有的配置就完成了,当访问 http://127.0.0.1:8000/articles,Django会自动读取数据库中的内容,并显示在网页上了\。
Epilogue
本文的一些设置并不适用于实际生产环境,比如URL配置,为了方便重用,通常都会使用include的方式,而在这里是直接指定。
浙公网安备 33010602011771号