django入门教程(上)

相信用过python的人都听过Django的大名,知道它是一个web框架,用来支持动态网站、网络应用程序以及网络服务的开发。那么为什么我们需要一个web框架,而不是直接用python来写web应用呢?其实简单来说,就是为了偷懒。

如果不用框架的话,你可能需要连接数据库、查询数据库、关闭数据库,在python代码文件里掺杂html标签、css样式等。并且每次开始一个web应用,你都要从头开始写起,重复许多枯燥无味的代码。

而web框架提供了通用web开发模式的高度抽象,使我们可以专注于编写清晰、易维护的代码。Django作为python下的web框架,从诞生到现在有着数以万计的用户和贡献者,有着丰富的文档,活跃的社区,是web开发很好的选择。

本文结合 Django 官方文档 First steps 中的6个小教程,帮你了解Django。一共分上、下两篇文章,上篇主要来分析Django处理Http Request的机制,下篇来介绍下Django提供的后台管理,以及单元测试等强大的功能。

Django 工作流程

在开始具体的代码之旅前,先来宏观地看下Django是如何处理Http Resquest的,如下图:

假设你已经在浏览器输入了 http://127.0.0.1:8000/polls/, 接下来浏览器会把请求交给Django处理。根据上图,我们知道Django需要根据url来决定交给谁来处理请求,那么Django是如何完成这项工作 呢?很简单,Django要求程序员提供urls.py文件,并且在该类文件中指定请求链接与处理函数之间的一一对应关系。

这里请求链接是以正则表达式的方式指定,并且不用指定域名,比如说要精确匹配上面的例子, 只需要指定正则表达式为 ^polls/$ 即可。要匹配 http://127.0.0.1:8000/polls/12/(这里polls后面只要是数字即可),那么只需要 ^polls/\d+/$ 即可。回到上面的例子,Django中只需要在urls.py添加以下语句即可。

urlpatterns = patterns(
    ‘‘,
    url(r‘^polls/$‘, views.index),
)

这样当请求链接为http://127.0.0.1:8000/polls/时,就会用views.py中的函数index()来处理请求。现在Django知道由index来处理请求了,那么index需要做哪些工作呢?

它需要加载返回内容的模板,这里比如说是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></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项目

前面为了使大家了解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框架,还提供了诸如后台管理,单元测试等强大的功能,我们会在下一篇文章来共同学习。

郑重声明:此文是从django中国社区转载,非笔者所写,有兴趣的朋友可以查看原文:

http://zhaofei.tk/2014/12/26/django_start/

时间: 2024-10-27 13:30:13

django入门教程(上)的相关文章

django入门教程(下)

在两篇文章帮你入门Django(上)一文中,我们已经做了一个简单的小网站,实现了保存用户数据到数据库,以及从后台数据库读取数据显示到网页上这两个功能. 看上去没有什么问题了,不过我们可以让它变得更加完美,比如说为它添加一个简单的后台,用来管理我们的Question数据库,或者是写点测试单元来看看我们的程序有没有什么Bug. 后台管理 首先需要添加后台管理员账号,只需要简单的 createsuperuser 命令,如下: $ python manage.py createsuperuser Use

Scrapy安装、爬虫入门教程、爬虫实例(豆瓣电影爬虫)

Scrapy在window上的安装教程见下面的链接:Scrapy安装教程 上述安装教程已实践,可行.本来打算在ubuntu上安装Scrapy的,但是Ubuntu 磁盘空间太少了,还没扩展磁盘空间,暂时不想再上面装太多软件. Scrapy的入门教程见下面链接:Scrapy入门教程 上面的入门教程是很基础的,先跟着作者走一遍,要动起来哟,不要只是阅读上面的那篇入门教程,下面我简单总结一下Scrapy爬虫过程: 1.在Item中定义自己要抓取的数据: movie_name就像是字典中的“键”,爬到的数

【教程】原创:历上最简单的游戏编程入门教程(基于cocos2d-js)

前言: 大家好.我是一个游戏开发者.曾就职于cocos2d-x这个手机游戏引擎的开发的公司. 在这边我准备了一个最简单的教程,想告诉大家制作一个游戏有多简单. 回忆起当年刚刚步入游戏这个行业,我也抱着非常多的疑问. 所以如果大家对游戏有兴趣的朋友,可以在下面留言. 这个教程我会讲的非常通俗易懂.争取几句话之内就让你看到一个效果. 另外教程里面有丰富的图文讲解.我保证你学完之后掌握了做游戏的真髓. 你完全可以马上开始做自己的游戏.并且能够让你的游戏在网页上,ios,android 还有pc平台上跑

深入学习:Windows下Git入门教程(上)

一,安装Git: 1.1Linux上安装命令: sudo apt-get install git 1.2在Windows上安装Git: 使用Windows版的msysgit,官方下载地址:http://msysgit.github.io/,点击进入官网,如果官网无法正常下载我这里有当前的最新版,已经上传到CSDN上,下载地址为:http://download.csdn.net/detail/huangyabin001/7564005,点击进入下载 1.3安装完成进行配置: $ git confi

史上最浅显易懂的RxJava入门教程

RxJava是一个神奇的框架,用法很简单,但内部实现有点复杂,代码逻辑有点绕.我读源码时,确实有点似懂非懂的感觉.网上关于RxJava源码分析的文章,源码贴了一大堆,代码逻辑绕来绕去的,让人看得云里雾里的.既然用拆轮子的方式来分析源码比较难啃,不如换种方式,以造轮子的方式,将源码中与性能.兼容性.扩展性有关的代码剔除,留下核心代码带大家揭秘 RxJava 的实现原理. 什么是RxJava ? Rx是Reactive Extensions的简写,翻译为响应的扩展.也就是通过由一方发出信息,另一方响

迷你MVVM框架 avalonjs 入门教程(司徒正美)

迷你MVVM框架 avalonjs 入门教程 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定属性与动态模板 作用域绑定(ms-controller, ms-important) 模板绑定(ms-include) 数据填充(ms-text, ms-html) 类名切换(ms-class, ms-hover, ms-active) 事件绑定(ms-on,……) 显示绑定(ms-visible) 插入绑定(ms-if) 双工绑定(ms-duplex) 样式绑定(ms-css) 数据绑

django入门--django-blog-zinnia搭建个人博客

1.安装python 选择合适python2.7及以上版本安装https://www.python.org/downloads/ 2.建立虚拟环境 这不是必须的,但是建议使用,为每个项目单独引入依赖,避免出现环境问题.对于python3.3以下版本可参考https://virtualenv.pypa.io/en/stable/installation/,python3.3及以上版本参考https://docs.python.org/3/library/venv.html. 3.安装必要的依赖 P

Django入门与实践 17-26章总结

Django入门与实践-第17章:保护视图 Django 有一个内置的视图装饰器 来避免它被未登录的用户访问: 现在如果用户没有登录,将被重定向到登录页面: 现在尝试登录,登录成功后,应用程序会跳转到原来所在的位置. Django入门与实践-第18章:访问已登录用户 现在我么可以改进 new_topic 视图,将发布主题的用户设置当前登录的用户,取代之前直接从数据库查询出来的第一个用户, 之前这份代码是临时的,因为那时候还没有方法去获取登录用户,但是现在可以了: 有两个关键字参数,pk用于唯一标

Python10分钟入门教程,Python入门神图一张

这篇文章主要介绍了Python 10分钟入门教程,分享一张Python入门神图一张,具有一定的参考价值,感兴趣的小伙伴们可以参考一下| 初试牛刀 假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程.那么本教程将花费十分钟的时间带你走入Python的大门.本文的内容介于教程(Toturial)和速查手册(CheatSheet)之间,因此只会包含一些基本概念.很显然,如果你希望真正学好一门语言,你还是需要亲自动手实践的.在此,我会假定你已经有了一定的编程基础,因此我会跳过大部分