原文地址 javascript
相信用过python的人都听过Django的大名,知道它是一个web框架,用来支持动态网站、网络应用程序以及网络服务的开发。那么为何咱们须要一个web框架,而不是直接用python来写web应用呢?其实简单来讲,就是为了偷懒。css
若是不用框架的话,你可能须要链接数据库、查询数据库、关闭数据库,在python代码文件里掺杂html标签、css样式等。而且每次开始一个web应用,你都要从头开始写起,重复许多枯燥无味的代码。html
而web框架提供了通用web开发模式的高度抽象,使咱们能够专一于编写清晰、易维护的代码。Django做为python下的web框架,从诞生到如今有着数以万计的用户和贡献者,有着丰富的文档,活跃的社区,是web开发很好的选择。java
本文结合 Django 官方文档 First steps
中的6个小教程,帮你了解Django。一共分上、下两篇文章,上篇主要来分析Django处理Http Request的机制,下篇来介绍下Django提供的后台管理,以及单元测试等强大的功能。python
<!--more-->mysql
在开始具体的代码之旅前,先来宏观地看下Django是如何处理Http Resquest的,以下图:git
假设你已经在浏览器输入了 http://127.0.0.1:8000/polls/,接下来浏览器会把请求交给Django处理。根据上图,咱们知道Django须要根据url来决定交给谁来处理请求,那么Django是如何完成这项工做呢?很简单,Django要求程序员提供urls.py文件,而且在该类文件中指定请求连接与处理函数之间的一一对应关系。程序员
这里请求连接是以正则表达式的方式指定,而且不用指定域名,好比说要精确匹配上面的例子, 只须要指定正则表达式为 ^polls/$
便可。要匹配 http://| 5e46bd7270c4c5723394282dcc9f64f66 |(这里polls后面只要是数字便可),那么只须要 ^polls/\d+/$
便可。回到上面的例子,Django中只须要在urls.py添加如下语句便可。github
urlpatterns = patterns( '', url(r'^polls/$', views.index), )
这样当请求连接为http://127.0.0.1:8000/polls/时,就会用views.py
中的函数index()
来处理请求。如今Django知道由index来处理请求了,那么index须要作哪些工做呢?web
它须要加载返回内容的模板,这里好比说是index.html
。
def index(request): template = loader.get_template('polls/index.html')
模板文件就是返回页面的一个骨架,咱们能够在模板中指定须要的静态文件,也能够在模板中使用一些参数和简单的逻辑语句,这样就能够将其变为用户最终看到的丰满的页面了。
要使用静态文件,好比说css、javascript等,只须要用{% load staticfiles %}
来声明一下,而后直接引用便可,好比说:
<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />
参数和逻辑语句也很简单,好比说如下语句:
{% for question in latest_question_list %} <li>{{ question.question_text }}</a></li> {% endfor %}
用for循环遍历latest_question_list,逐个输出内容question_text。这里咱们用到了参数latest_question_list,它的值实际上是在views.py中计算出来给模板文件的,咱们这里假设是从数据库中取出最新的5个question,以下:
latest_question_list = Question.objects.order_by('-pub_date')[:5]
这里用到了数据库,其实Django给咱们封装了数据库的读写操做,咱们不须要用SQL语句去查询、更新数据库等,咱们要作的是用python的方式定义数据库结构(在model.py里面定义数据库),而后用python的方式去读写内容。至于链接数据库、关闭数据库这些工做交给Django去替你完成吧。上面例子中,Question数据库结构的定义以下:
class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') def __str__(self): return self.question_text
好了,如今有了模板文件这个骨架,又有参数、逻辑语句、静态文件等血肉,一个丰满的页面就诞生了,来看一下完整的index函数吧:
def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] template = loader.get_template('polls/index.html') context = RequestContext(request, { 'latest_question_list': latest_question_list, }) return HttpResponse(template.render(context))
前面为了使你们了解Django处理HTTP Request的过程,咱们简化了一些内容,下面咱们将尽可能还原Django真实的面貌。在开始具体的技术细节前,咱们先来搞清楚Django中projects和apps的区别。App是专一于作某件事的web应用,好比说一个用户认证系统,或者是公开投票系统;而project则是一个web站点,可能包括许多app和一些配置。一个project能够包含许多app,一个app能够用于许多project中。
使用Django时通常会先建立一个project,好比说是mysite,以下:
$ django-admin.py startproject mysite $ tree -L 2 mysite mysite ├── manage.py └── mysite ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py 1 directory, 5 files
而后咱们能够在 mysite/settings.py
中进行项目的一些配置,好比配置时区,数据库链接的相关信息,或者是应用的添加、删除等。这里须要特别注意的是数据库设置,Django支持sqlite、mysql、oracle等数据库,使用前必须安装、启动相应的数据库,并创建相应的帐户。这里为了简单,咱们使用python内置的sqlite,settings里面的数据库配置不须要更改便可。
项目建立成功以后,能够运行
$ python manage.py migrate
生成相应的数据库表(migrate是Django 1.7引入的命令,较早的版本能够用其余的命令代替)。为何新建的空项目里就会有数据库表呢?这是由于默认状况下,项目配置文件settings.py
里面已经配置有Django自带的应用,以下:
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', )
这些应用须要和数据库交互。(一般状况下默认的应用颇有用,不过你能够根据需求删减)
到这里为止,咱们的Django项目已经能够运行了,用下面简单的命令开启Django自带的开发环境web服务
:
$ python manage.py runserver
接下来,试试在浏览器打开 http://127.0.0.1:8000/,看看Django的 It worked!
页面吧。
如今咱们的项目初具雏形,而且运行良好,这是个好的开端,不过咱们可让它变的更加实用,就让她完成如下任务吧:
在一个问答系统中添加问题;
显示全部已经添加的问题。
听起来很简单,不是吗?不过这个任务已经涉及到向后台写数据,从后台读取数据,做为一个例子而言,足够用了。就让咱们新建一个名为questions的app来完成这项任务吧:
$ python manage.py startapp questions
首先咱们得设计好数据库字段,用来存储问题。上面的任务设计起来很简单,只须要创建一个名为Question的表格,而后里面有context字段。Django提供了models来方便咱们设计数据库,所以咱们的questions/models.py
看起来多是这样的:
from django.db import models class Question(models.Model): context = models.CharField(max_length=200)
如今将questions应用添加进项目的配置文件mysite/settings
中:
INSTALLED_APPS = ( 'django.contrib.admin', ..., 'questions', )
而后经过如下命令来生成Question数据库表格:
$ python manage.py makemigrations questions $ python manage.py migrate
接下来设计三个URL地址add/, add_done/, index/
(这里的地址并不包含域名) 分别用来展现填写问题页面,添加成功后页面,显示全部问题页面。而后在mysite/urls.py
中指定相应的处理函数,以下:
from django.conf.urls import patterns, include, url from questions import views urlpatterns = patterns( '', url(r'^add/$', views.add), url(r'^index/$', views.index), url(r'^add_done/$', views.add_done), )
固然了,咱们须要在questions/views.py
中实现 index, add 和 add_done:
index: 获取当前全部问题,传给模板文件,返回Response;
add: 直接返回添加问题表单页面便可;
add_done: 获取POST获得的问题,将其添加到数据库,返回Response;
代码以下:
def index(request): question_list = Question.objects.all() return render( request, "questions/index.html", {'question_list': question_list}, ) def add_done(request): add_question = Question() content = request.POST['content'] add_question.context = content add_question.save() return render( request, "questions/add_done.html", {'question': content}, ) def add(request): return render(request, "questions/add.html")
这里render函数加载模板,而且以字典的形式传递参数,返回Response页面。模板文件内容不在这里给出,运行结果截图以下:
若是你读到这里,那么应该会知道Django处理Http Request的过程,而且能动手写一个简单的Django小项目了。不过Django做为一个优秀的Web框架,还提供了诸如后台管理,单元测试等强大的功能,咱们会在下一篇文章来共同窗习。