首页 > 开发 > Python > 正文

吸星换月昊天塔之Django:创建第一个应用

2016-07-19 08:50:56  来源:慕课网
  在编程世界,一个叫做华夏的国家,一个少年坐在电脑前,手指如飞,在他的身后一个老者慈祥的注视着他。
  这个少年就是我们的主角凌天,身后的老者就是他的师父,没有人知道他叫什么名字,只记得在很久以前人们都叫他龟叔。
  凌天好像感觉到有人出现在他的身后,停下了手上的动作,恭敬的看了龟叔一眼说:“师父。”
  “小天啊,你的HTTP法则领悟的如何了?”龟叔对自己的这个徒弟很满意,虽然天赋一般,但是非常的刻苦,经常到深夜还在打代码。这是一个强者为尊的世界,不会打代码就讨不到老婆,更不能像乔帮主和盖茨两位天尊一样,笑傲天下。
  “回师傅,HTTP全称为超文本传输协议(Hyper Text Transfer Protocol),是互联网上应用最为广泛的一种网络协议,所有的WWW文件都要遵循这个标准。它是一个客户端和服务端的请求和应答的标准,我们可以通过如Web浏览器或网络爬虫等工具来发送一个请求,指定访问服务器的一个端口,默认为80,而服务端收到客户端的请求以后,就会返回我们请求的结果,它可能是一个HTML页面,一些文字,也可能是一张图片,一个视频,还会携带一些信息,其中最主要的就是状态码,200表示成功,404表示访问的资源不存在,500表示服务器出错。而这些内容,需要通过浏览器才能够解析成漂亮的页面,正因为HTTP法则,才拥有了编程世界中Web工程师这个流派,他们实力强横,穿梭虚空,天下之大皆可去之。”凌天说道。
  “恩,不错,看来你对HTTP已经有了基础的了解,可以开始修行武技了,天儿你要记住,对于我们修行者来说,武技和法则都是必备的,一个只懂得法则不懂武技的人,他是没有任何战斗力的,只能在各个门派进行讲道,真正让他去战斗,他就原形毕露。而只懂得武技不懂法则的人,只会简单应用,也只能成为各大宗门的外门弟子,不可能进入像谷阁这样的超级宗门的。”龟叔害怕凌天成为砖家那种只会讲理论的人,所以忍不住多说了几句。
  “徒儿已经将WSGI按照师傅的标准演练了许多次了,师傅你来看。”凌天指了一下面前的电脑。
  龟叔走上前去查看:
index.py
# environ:包含所有HTTP请求信息的Python dict对象# start_response:用于发送HTTP响应的函数def index(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [b'<h1>Hello, World.</h1>']  server.py
# 导入需要的模块from wsgiref.simple_server import make_server# 从index.py中导入index函数from index import index# 创建一个服务器,IP为空,端口8000,处理函数是indexhttpServer = make_server('', 8000, index)print('Serving HTTP on port 8000...')# 开始监听HTTP请求:httpServer.serve_forever()  龟叔打开命令提示符,进入项目所在文件夹,输入python server.py回车以后,看到了如下信息:
Serving HTTP on port 8000...
龟叔点了点头,打开浏览器,输入:http://127.0.0.1:8000
回车以后看到了:
Hello, World.
  “恩,不错,看来武学的基础你已经掌握了,但是这仅仅是最简单的一招一式,天儿你可知道真正的战斗都是相当复杂的,仅仅依靠这简单的一招一式,是很难应对快节奏的战斗,并且太过复杂的招式依靠自己去创造太难太难,这仅仅是一个Hello,World.如果为师让你写一个像京猫那样的网站,你可知道这个过程有多么的困难,那就像你想以繁星之光照亮夜空一样,大道至简,如此繁琐复杂的招式,已经不适合我们使用了,但是任何武学都是由这最简单的一招一式构成的,无数先辈创造了许多惊天骇地的神功,并且还有一些神器,他们拥有滔天的力量。今日为师便传你真正能让你达到码农境界的昊天塔Django,一旦掌握了它,便能加入一些三流门派,如果能够领悟它的精髓,哪怕是谷阁这种宗派也会有你的一席之地。”,龟叔停顿了一下接着说,“Django是我们Python流派中一个重要的武器,为师刚才跟你说的需求,如果使用WSGI无异于星光照亮夜空,而Django则拥有吸星换月的力量,把漫天的繁星转为皓月之光!”
  “为师现在传你召唤Django的口诀,Django乃神器,而我们所在的是神州大陆,召唤图中难免受到路途的影响,可能会召唤失败,如果出现这种问题,你可以使用代理或者VPN来辅助进行召唤,如果没有这两样天材地宝可以多尝试几次,心诚则灵。”龟叔挥手一道灵光,进入了凌天的闹海。
  片刻后,凌天坐在电脑前,打开了命令提示符,输入了如下内容:
pip install django  回车后出现了看到了下面的内容:
Collecting djangoUsing cached Django-1.9.7-py2.py3-none-any.whlInstalling collected packages: djangoSuccessfully installed django-1.9.7  龟叔忍不住点头,心中暗叹,此子果然是百年难得一遇的编程奇才,日后必定能够成为一代宗师。
  凌天看到Successfully installed django-1.9.7就明白自己已经拥有了Django,并且还是1.9.7版本的。
  “天儿,这本Django文档给你,一定要好好的学习,争取早日掌控这个神器。”龟叔拿出一卷金黄色的卷轴交给了凌天,凌天打开卷轴看了起来。
  首先,验证你的django是否安装成功,打开命令提示符,输入:
python -m django --version  回车以后可以看到django的版本,说明安装成功,需要注意的是-m前面是一个杠,--version前面是两个杠。
目前最新版是1.9.7,pip安装的就是最新版。
  确认安装成功以后,如果是windows使用cd命令进入到想创建项目的位置,输入如下命令:
django-admin startproject mysite  这条命令是django内置的命令django-admin,startproject告诉它帮我们创建一个名为mysite的文件夹,这个文件夹就代表了我们项目的真实文件夹,名字可以任意取,不要使用中文和特殊符号。
提示:输入django-admin回车,可以看到所有的命令参数
现在我们应该拥有了下面这样的目录结构:
# 这个文件夹相当于项目的根目录,可以重命名为任何你喜欢的名字mysite/ manage.py mysite/ __init__.py settings.py urls.py wsgi.py  manage.py:是一个命令行小工具,作用很大,可以让我们与当前django项目进行交互。
详见文档:https://docs.djangoproject.com/en/1.9/ref/django-admin/
  mysite/:内部的mysite,是我们项目中的一个包,也是django为我们创建的一个默认的APP,这个名字决定了我们如何在其他python文件中访问里面的内容,如mysite.urls。
  init.py:空文件,它告诉python这个文件夹是一个python的包,有时可以在里面写一些全局配置的代码。
详见文档:https://docs.python.org/3/tutorial/modules.html#tut-packages
  settings.py:设置我们的项目,这个文件会告诉django如何工作。
  urls.py:设置url的请求拦截地址列表,通过正则表达式来匹配,新增加了其他模块,需要在这个文件中指定。
  wsgi.py:WSGI标准的服务器,方便我们开发的时候测试项目,该服务器只适合开发使用,不适合当做线上真实的服务器来使用,因为django是做框架的,不是做服务器的,线上环境应当使用Apache这样的专业服务器。
  可以在命令提示符下输入下面的命令来启动项目:
python manage.py runserver  需要注意的是,命令提示符路径需要在manage.py所在的那个目录,才能启动。
  小提示:输入python manage.py可以看到manage.py可以接收的所有参数
  看到如下信息说明启动成功:
Performing system checks...System check identified no issues (0 silenced).You have unapplied migrations; your app may not work properly until they are app lied.Run 'python manage.py migrate' to apply them.July 13, 2016 - 12:13:14Django version 1.9.7, using settings 'mysite.settings'Starting development server at http://127.0.0.1:8000/Quit the server with CTRL-BREAK.  可以通过:http://127.0.0.1:8000/ 来访问我们的项目。
看到下面内容说明我们的django项目已经创建部署成功了:
It worked!Congratulations on your first Django-powered page.Of course, you haven't actually done any work yet. Next, start your first app by running python manage.py startapp [app_label].You're seeing this message because you have DEBUG = True in your Django settings file and you haven't configured any URLs. Get to work!  当然也可以使用下面的两条命令来运行服务器:
# 指定端口python manage.py runserver 8080# 指定IP和端口python manage.py runserver 0.0.0.0:8000  接下来,我们以一个在线投票网站来学习掌握django所有的内容。
  首先创建我们的应用,在manage.py所在的目录,使用命令行输入如下命令:
python manage.py startapp polls  这里会创建一个新的polls应用,polls的名字可以随意起,此处建议一致。
  此时和我们前面的目录结构中会发生变化:
mysite/ manage.py mysite/ __init__.py settings.py urls.py wsgi.py polls/ migrations/ __init__.py __init__.py admin.py apps.py models.py tests.py views.py  修改polls/views.py文件内容如下:
from django.http import HttpResponsedef index(request): return HttpResponse("Hello, world. You're at the polls index.")  这样,我们就拥有了一个简单的视图,我们还需要在polls/urls.py里面配置访问它的路径,django严格遵循MVC设计模式。
  在polls/下新建一个urls.py文件:
polls/ __init__.py admin.py apps.py migrations/ __init__.py models.py tests.py urls.py views.py  编辑polls/urls.py内容如下:
from django.conf.urls import url# 相对引用,代表引用和当前文件同级的views.py文件from . import viewsurlpatterns = [ # 接收一个正则表达式代表访问路径^$表示当前APP的根路径 # 访问views.py文件中的index方法 # name 属性可以让我们在网页模板中通过它来获取一些数据,即使我们改动了请求地址或视图,都不会影响到模板中通过命名空间引用的数据 url(r'^$', views.index, name='index'),]  编辑mysite/urls.py 告诉django,我们增加了一个新的APP,并且告诉它我们对应的url列表:
from django.conf.urls import include, urlfrom django.contrib import adminurlpatterns = [ # url(r'^polls/', include('polls.urls')), url(r'^admin/', admin.site.urls),]  再次在命令行输入:
python manage.py runserver  启动我们的服务器,然后访问:http://localhost:8000/polls/ 就能够访问到刚才写的views.py里面的index方法了,应该可以看到如下内容:
  Hello, world. You're at the polls index.
  他的访问顺序如下:
请求发出以后先匹配mysite/urls.py中的拦截路径,于是以polls开头的被拦截,说明是polls模块的请求,剩余部分被发送给polls.urlspolls/urls.py中有一个拦截以什么都没有开头并且以什么都没有结束的路径,于是匹配到了我们之前的内容,因为我们并没有在polls/后面输入任何的内容,所以空内容被匹配成功。调用views.index给我们生成一个视图,并且返回给我们的浏览器,就看到我们的结果了。  大道万千,由简入繁,再由繁入简,这么简单的应用看起来还不如WSGI来的方便,但是如今骨架已成,随着开发的加深,将会领略到django无与伦比的强大能力。
  下章预告:吸星换月昊天塔之Django:操作SQLite和MySQL