Tango with django 1.9 中文——3.Django基础
让我们开始运用Django。本章主要是给你一个关于创建新项目和新应用过程的概览。在本章的末尾,你将建立起一个简单的由Django驱动的网站。
3.1 配置测试
让我们测试以下你的Python和Django安装是否满足本教程的要求。首先,打开新的命令行窗口并输入以下命令,查看安装的Python版本。
$ python --version
显示的python版本应该是2.7.5+ 或者 3.4+。
如果使用虚拟环境,记得先激活它。
接下来检查Django安装,在命令行窗口中输入以下命令,运行Python:
$ python
Python 2.7.10 (default, Jul 14 2015, 19:46:27)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
接着在提示符处输入以下命令:
>>> import django
>>> django.get_version()
'1.9.10'
>>> exit()
一切顺利的话,你会看到正确的Django版本,然后用exit()
指令退出Python解释器。如果导入django失败,检查一下虚拟环境,在命令行窗口中用pip list
指令查看该环境下安装了哪些包。
如果在安装Django的过程中遇到了苦难,或者安装了不同版本,可以参考系统设置章节或者官方文档中的安装指南 。
提示
在本书中,你需要留意代码片段中包含的两个东西。
以美元符号($)开头的代码,表示这是命令行指令。
以>>>开头的代码,是需要输入到Python解释器的。
$ python
或$ py
可以启动解释器。退出解释器的命令是exit()
或者quit()
。
3.2 创建Django项目
进入你的工作区目录,发布以下指令:
$ django-admin.py startproject tango_with_django_project
如果还没有工作区目录,可以建立一个,这样你可以把你的Django项目和其他代码项目存放在这个目录中。我们将用<workspace>
引用你的工作区目录,你需要将它转换成自己实际的目录,比如 /Users/leifos/Code/ 或者 /Users/maxwelld90/Workspace/。
找不到 django-admin.py?
试试输入django-admin 看看。根据你的设置,有些系统可能不认识 django-admin.py。
对于Windows,你可能必须输入django-admin.py的完整路径,比如:
python c:\python27\scripts\django-admin.py startproject tango_with_django_project
这个命令将调用django-admin.py文件,为你创建一个叫做 tango_with_django_project 的项目。通常,我们在Django项目目录后面加上后缀_project,使之意义明确。当然,具体怎么命名你自己说了算。
你会在工作区中看到一个新建的 tango_with_django_project 目录。在这个新目录中,有两样东西:
- 另一个跟项目同名的目录 tango_with_django_project;
- 一个叫做 manage.py 的Python文件。
我们将这个嵌入的tango_with_django_project目录称为项目配置目录。在这个目录中,你可以看到四个Python文件。稍后我们会具体讨论这些文件,现在先了解一下:
- _init_.py,一个空白的Python文件,用来告诉解释器该目录是一个Python包;
- settings.py,储存所有Django项目设置的地方;
- urls.py,储存项目URL模式的Python文件;
- wsgi.py,用于运行开发服务器和将你的项目部署到生成环境。
在项目目录中,还有另外一个文件manage.py。我们在开发项目的过程中将总要调用它。它提供了一系列让你可以维护你的Django项目的指令。比如,manage.py 允许你运行Django内建的开发服务器,测试你的应用程序,运行各种数据库指令等。事实上,我们想运行的大多数Django命令,基本都会用到这个文件。
Django Admin 和 Manage
如果想要深入了解Django admin文件,可以参考官方文档的Admin and Manage scripts。
运行
python manage.py help
命令,可以查看可用的命令列表。
现在你可以通过下面的指令来试试manage.py文件:
$ python manage.py runserver
运行该指令将启动Python,并通知Django初始化它的轻量级开发服务器。在命令行窗口中应该可以看到类似下面的输出:
$ python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
You have unapplied migrations; your app may
not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
October 2, 2016 - 21:45:32
Django version 1.9.10, using settings 'tango_with_django_project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
在输出信息中,我们可以看到很多东西。首先,没有问题阻碍程序运行。第二,有一个警告信息,unapplied migrations
未实施的数据迁移。我们将在设置数据库章节深入讨论它,现在暂时忽略。第三,最重要的一点,Django开发服务器的地址被指定为URL http://127.0.0.1:8000/ 。
现在,打开你的网页浏览器然后输入地址http://127.0.0.1:8000/ ,看到的应该是类似下面的情况:
![ch3-django-powered-page](E:\Python3 Learning\books\tango_with_django_19-master\tango_with_django_19-master\manuscript\images\ch3-django-powered-page.png)
你可以随时通过在命令行窗口中输入 CTRL+C 命令来停止开发服务器。如果你希望在不同的端口上运行开发服务器,或者允许用户从其他机器上访问,你可以通过设置一些可选参数来达成。例如下面的命令:
$ python manage.py runserver <your_machines_ip_address>:5555
执行这条命令将使开发服务器回应TCP端口5555上的请求。你需要把<your_machines_ip_address>替换成你自己电脑的IP地址或者127.0.0.1。
不知道自己的IP地址?
如果使用0.0.0.0,Django会显示出你的IP地址。不妨试试:
python manage.py runserver 0.0.0.0:5555
当设置端口时,不要使用80或者8080端口,因为它们习惯上用于HTTP通信。还有,所有1024以下端口都被认为是操作系统保留的,不要使用。
在你的网络中的其他机器上,也可以演示你的应用。配置开发服务器的地址为你电脑的IP,然后在其他机器上进入http://<your_machine_ip_address>:<port>/就可以浏览你的网站。当然,这还涉及到你所在网络的具体设置。可能有代理服务器或者防火墙需要配置。如果你不能远程浏览你的网站,请与你的网络管理员联系确认。
3.3 建立Django App
每个Django项目是组成特定网络应用或网站的一些配置文件和app的集合。通过开发一些app,然后可以将其复用到不同的项目中,只造成很小的影响。这种方法很好的促进了软件工程化。
每个Django app有自己特定的任务。你需要建立一些为你的网站提供特定功能的app。比如,我们可以假设一个项目可能包括以下app:一个投票app,一个注册app,以及一个指定内容相关app。在另一个项目中,我们可能想复用投票和注册app,这样我们就可以把这两个app包括在第二个项目中。稍后我们详细讨论。眼下我们先建立一个Rango app。
首先,用命令行窗口在你的工作区目录中运行以下命令:
$ python manage.py startapp rango
startapp
命令在你的项目根目录中创建一个叫做rango的新目录,它包含以下Python文件:
- 又一个_init_.py,与前文讨论的功能一样;
- admin.py,在这里你可以注册你的模型,然后享受Django便利的管理界面;
- apps.py,所有app的具体配置;
- models.py,储存app数据模型;
- tests.py,储存app代码的测试函数;
- views.py,处理请求并响应;
- migrations 目录,模型的数据库具体信息;
views.py 和 models.py 在任何app中都要用到,并组成Django的主要建造设计模式,即 Model-View_template 模式。你可以参考官方文档,了解模型、视图和模板具体是怎么关联到一起的。
在开始建立你自己的模型和视图之前,你得先让你的Django项目知道新app的存在。这需要在项目配置目录中,修改settings.py文件。打开该文件,找到 INSTALLED_APPS元组。将rango app添加到元组的末尾,像下面这样:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rango',
]
重启开发服务器,如果没有出现错误,那么rango app已经纳入项目,你可以进入下一个步骤。
startapp魔法
当用
python manage.py startapp
命令创建新app时,Django可能会自动将app名称添加到setting.py文件中的 INSTALLED_APPS 列表中。尽管如此,在继续深入之前,检查一下看所有东西是否都设置正确是一个良好的做法。
3.4 建立视图
现在Rango app已经建立了,现在我们建立一个简单的视图。作为我们的第一个视图,我们不妨先只返回一些文本内容到客户端——暂时先不考虑使用模型和模板。
在你的IDE中,打开新建的rango app目录中的views.py文件。删除注释`# Create your views here.,这样你就有了一个空白文件。
现在你可以添加以下代码:
from django.http import HttpResponse
def index(request):
returen HttpResponse("Rango says hey there partner!")
分解这三行代码:
- 我们首先从django.http模块导入HttpResponse对象;
- views.py文件中的每个视图都是相互独立的函数。在这个实例中,我们只建立了一个视图,叫做index。
- 每个视图至少具有一个参数——一个HttpRequest对象。按照常规,这是一个已命名的请求,但是你可以按照自己的意愿重命名。
- 每个视图必须返回一个HttpResponse对象。一个简单的HttpResponse对象具有一个字符串参数,用于描述客户端请求的视图页面上下文。
当视图建立好以后,距离用户可以访问它还有其他步骤。为了让用户看到你的视图,你必须将一个Uniform Resurece Locator(URL)映射到该视图:
打开项目目录中的urls.py文件,键入以下urlpatterns代码,来建立一个入门级映射:
from rango import views
urlpatterns=[
url(r'^$',view.index,name='index'),
url(r'^admin/',admin.site.urls),
]
这将rango app的index视图映射到基础URL上。运行开发服务器,访问http://127.0.0.1:8000, 或你设置的其他开发服务器地址。你将看到index视图渲染过的输出页面。
3.5 映射URLs
除了将URLs直接从项目映射到app,我们可以通过改变视图的接入URL,将我们的app更加模块化(然后可以复用)。首先,我们需要修改项目的urls.py文件,将它指向Rango app来处理所有涉及Rango app的请求。然后我们需要指定Rango怎么处理这些请求。
首先,打开项目配置目录中的项目urls.py文件。该路径相对于你的工作区目录,应该为 <workspace>/tango_with_django_project/tango_with_django_project/urls.py。将urlpatterns更新为下面这样:
from django.conf.urls import url
from django.contrib import admin
from django.conf.urls import include
from rango import views
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^rango/', include('rango.urls')),
#以上映射将所有开头为 rango/ 的URL指向rango应用。
url(r'^admin/', admin.site.urls),
]
Django框架将urlpatterns设计成一个Python列表。添加的映射查找能匹配^rango/模式的URL字符串。当匹配成功后,该URL字符串的其他部分将通过include()函数(来自django.conf.urls)传递到rango.urls处理。
将这想象成一个访问URL字符串的URL链——如上面的URL链图。在这个链中,域名被去掉,URL字符串的其他部分(rango/)被传递到tango_with_django项目,然后找到匹配模式并去掉rango/,剩余一个空字符串传递到rango应用,供其操作。
接下来,我们需要在rango应用的目录下建立一个新文件叫做urls.py,用来处理剩下的URL字符串(将控制富川映射到index视图):
from django.conf.urls import url
from rango import views
urlpatterns=[
url(r'^$',views.index,name='index'),
]
这段代码引入了URL映射相关的Django组件以及rango的views模块。这使我们可以调用url函数,并将urlpatterns中的映射指向index视图。
当我们谈论URL字符串时,我们认为给出的URL主机部分已经被去掉了。URL主机部分表示映射到网络服务器的主机地址或者域名,比如http://127.0.0.1:8000 或者 http://www.tangwithdjango.com。去掉主机部分意为着Django组件只需要处理剩余的URL字符串。举个例子,给出的URL为http://127.0.0.1:8000/rango/about/,Django得到的URL字符串为 /rango/about/。
我们创建的URL映射调用Django的url()函数,其中第一个参数是正则表达式 ^$
,它匹配的是空字符串。因为^
表示字符串开头,$
表示字符串结尾,首尾之间没有任何东西,所以只能匹配空字符串。用户提供的任何可以匹配该表达式的URL字符串将调用视图函数 views.index()。你可能会想,匹配一个空的URL没有任何用处——使用它干嘛?记住,这不是整个空的URL,只是URL字符串中的一部分。这是因为Django首先在项目urls.py中的正则表达式(比如 rango/)中匹配原始字符串,成功后去掉 rango/部分。然后Django将剩下的空字符串传递到rango应用,再通过rango/urls.py中的正则表达式匹配。
下一个传递给url()函数的参数是index视图,它将处理传入的请求。再后的是一个可选参数name,它被设置为字符串'index'。通过命名URL映射,后面我们可以使用反向URL匹配。这样我们可以通过名称而不是URL引用URL映射。下文建立模板时我们将解释怎么使用它。更多信息可以参考官方文档的相关章节。
现在,重启Django开发服务器,访问http://127.0.0.1:8000/rango/。如果一切顺利,你应该看到文本<Rango says hey there partner!>。如下面的截屏:
在每个app中,你将会创建很多URL映射。这个入门的映射相当简单,但是随着本书的深入,我们将建立一些更复杂、更参数化的URL映射。
领会Django时怎么处理URLs也是很重要的。现在它可能看起来很令人困惑,但是随着教程深入,我们会建立越来越多的URL映射,所以你很快就会成为专家。更多具体信息和实例请参考URLs官方文档。
正则表达式
Django URL模式使用正则表达式进行匹配。花时间熟悉怎么在python中使用正则表达式是很值得的。Python官方文档包含了一个良好的正则表达式指南。另外regexcheatsheet.com 提供了一个整洁的通用表达式概览。
如果你正在使用版本控制,现在是一个推送工作区更改的好时机。
3.6 基本工作流程
本章中所学习的内容可以简单概括为一个步骤列表。这里,我们提供你所完成的两个主要任务的列表。以后当你需要复习某些步骤时,可以回头看本小节。
创建新的Django项目
- 通过命令
$ python django-admin.py startproject <name>
创建项目,<name>
是你的项目名称。
创建新的Django应用
- 通过命令
$ python manage.py startapp <appname>
创建app,<appname>是你的应用名称。 - 将新建的app添加到项目settings.py文件中的INSTALLED_APPS元组中,让Django认识你的app。
- 在项目urls.py文件中,添加指向app的映射。
- 在app目录中新建urls.py文件,处理传入的URL字符串,指定视图。
- 在app目录的views.py中,创建请求的视图,确保它们返回一个HttpResponse对象。
练习
现在你可以运行Django和你的新app,完成下面的练习,巩固你所学的知识。到达这个阶段是学习Django的一个重大里程碑。创建视图和指向视图的URL映射,是开发更复杂和可以复用的网络应用的第一步。
- 复习本章,确保你了解了URL是怎么映射到视图的。
- 创建一个叫做about的新视图,返回HttpResponse对象:<'Rango says here is the about page.'>
- 将这个视图映射到 /rango/about。对于这一步,你只需要编辑Rango app的urls.py文件。注意/rango/部分由项目urls.py处理。
- 修改index视图的HttpResponse对象,使之包含一个指向about页面的链接。
- 修改about视图的HttpResponse对象,使之包含一个指向index页面的链接。
- 现在你真正开始学习本书了,作者的Twitter @tangowithdjano 。
提示
如果你感觉很难完成以上练习,以下这些提示应该可以提供灵感去解决它们。
- 在views.py中,建立一个函数,
def about(request):
,使它返回一个HttpResponse对象,将你的HTML插入这个对象。- 在rango/urls.py中添加新的映射到about()视图,用来匹配的正则表达式为 `r'^about/' 。
- 更新你的index()视图,加入指向about视图的链接。可以像这样:
Rango says hey there partner! <br/><a href='/rango/about/'>About</a>
。- 在about()视图中也加上可以返回主页面的链接
<a href="/rango/">Index</a>
。- 如果你还没度过Django官方教程的第一部分,现在是时候停下来去读了。(译者注:中文版的教程可以参考博客园大江东流大神的博客)
Tango with django 1.9 中文——3.Django基础的更多相关文章
- Tango with Django 1.9 中文——1.概述
译者注:英文书地址https://leanpub.com/tangowithdjango19/,作者为Leif Azzopardi 和 David Maxwell.本文仅为尝试.学习和交流,著作权利归 ...
- Django REST FrameWork中文教程2:请求和响应
从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...
- Django REST framework 中文教程1:序列化
建立环境 在我们做任何事情之前,我们将使用virtualenv创建一个新的虚拟环境.这将确保我们的包配置与我们正在开展的任何其他项目保持良好的隔离. virtualenv envsource env/ ...
- django JsonResponse返回中文时显示unicode编码(\u67e5\u8be2)
django JsonResponse返回中文时显示unicode编码(\u67e5\u8be2) 关注公众号"轻松学编程"了解更多. 原因 这个unicode编码,是python ...
- Django之Model(一)--基础篇
0.数据库配置 django默认支持sqlite,mysql, oracle,postgresql数据库.Django连接数据库默认编码使用UTF8,使用中文不需要特别设置. sqlite djang ...
- Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)
12.4 Cookie和Session 12.41 cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务 ...
- [Django 2]第一个django应用
1)增加应用 python3 manage.py startapp app-name 2. settings.py中,“INSTALLED_APPS”添加应用名称. 3. 在templates中新增网 ...
- 在django项目外,使用django.db链接数据库(postgres)
要用python链接到数据库,又不想写太多代码.想到了django,就偷懒了下.用django.db直连. django版本:1.6.5 (1.5以后可以用以下代码) #coding=utf-8 __ ...
- Django 源码小剖: Django 对象关系映射(ORM)
引 从前面已经知道, 一个 request 的到来和一个对应 response 的返回的流程, 数据处理和数据库离不开. 我们也经常在 views.py 的函数定义中与数据库打交道. django O ...
随机推荐
- Codeforces Round #683 (Div. 2, by Meet IT)【ABCD】
比赛链接:https://codeforces.com/contest/1447 A. Add Candies 题意 \(1\) 到 \(n\) 个袋子里依次有 \(1\) 到 \(n\) 个糖果,可 ...
- HDU6504 Problem E. Split The Tree【dsu on tree】
Problem E. Split The Tree Problem Description You are given a tree with n vertices, numbered from 1 ...
- hdu4501——小明系列故事——买年货(多维背包)
题解: 思路:将v1,v2,k都当作一种体积,开三维dp数组,每种物品只能取一次 代码中的for循环是倒着进行的,知道01背包和完全背包的肯定明白,倒着进行的就代表每种物品只选择一次 代码: 1 #i ...
- 牛客编程巅峰赛S1第6场 - 黄金&钻石&王者 A.牛牛爱奇数 (模拟)
题意:有一组数,每次将所有相等的偶数/2,求最少操作多少次使得所有数变成奇数. 题解:用桶标记,将所有不同的偶数取出来,然后写个while模拟统计一下次数就行. 代码: class Solution ...
- Chrome Switchs & Chrome Pref
Chrome Switchs: https://chromium.googlesource.com/chromium/src/+/master/chrome/common/chrome_switche ...
- docker+prom+grafana+altermanager
docker基础 docker run -it --name centos -v $HOME:/tmp -p 8080:8080 centos docker inspect container #查看 ...
- Docker网络模式详解
一.Docker四种工作模式 安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络). none .hosthost:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用 ...
- LINUX - pthread_mutex_lock
原文链接:https://www.cnblogs.com/fengbohello/p/7571722.html 互斥的概念 在多线程编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性. 每个对 ...
- Gym 101170I Iron and Coal(BFS + 思维)题解
题意:有一个有向图,有些点是煤,有些点是铁,但不会同时有铁和煤.现在我要从1出发,占领可以到达的点.问最少占领几个点能同时拥有一个煤和一个铁(1不用占领). 思路:思路很秀啊.我们从1往外bfs,得到 ...
- TypeScript Generics All In one
TypeScript Generics All In one TypeScript 泛型 代码逻辑复用 扩展性 设计模式 方法覆写, 直接覆盖 方法重载,参数个数或参数类型不同 test " ...