Django新手教程8,开发第一个页面

再一次,好好看一下那个恭喜的页面,多么美妙啊,可是好像目前为止,我们好像什么也还没干,想做云盘,可目前整个项目还没出现个云字。

别急,马上就来了!

我们先把服务器停了,按ctrl+C
我们先给我们要做的APP起个名字吧,不是说好了要做云盘么,就起名myCloud吧,当然,你也可以起别的名字,不过为了保险起见,你还是按着我的方式,一模一样地来,免得到最后搞混乱了。
在cmd中敲入(确认虚拟环境激活状态,确认我们处于父mysite目录下)
python manage.py startapp myCloud
如果你没有处于虚拟环境,会失败,因为这里要用到django,而只有虚拟环境才有django,如果你没有处于父mysite也会失败,因为这里用到了一个叫manage.py的文件,它处于父mysite目录下。

image.png

你就会发现在,父mysite目录下,子mysite目录的旁边,多了一个myCloud文件夹,我们打开进去看看


image.png

可以看到,django已经为我们的云盘app提供了不少文件,也就是说,我们的展馆已经建好,我们先去把这个app注册到我们的项目中来,django没有帮我们自动注册。我们打开子mysite中的settings.py文件,往里面添加
'myCloud.apps.MycloudConfig',
注意大小写!!!!

image.png

展馆是建起来了,可里面的展厅还是需要我们来设计的。如果,你之前学过php模式的网页制作,你会觉得这还不简单,我们在这个myCloud目录里面新建一个www文件夹,然后把我们的主页文件index.html放进去,然后,告诉服务器软件对应关系,比如往之前我们提到的urls.py文件里面输入这样的配置说明
url("172.20.10.4","D:/django_project/mysite/myCloud/www")
这样,只要游客在浏览器里面输入
172.20.10.4/index.html
他就能浏览我们的网页了,就是这么简单。

我们再回顾一下,上网是怎么实现的。访问者,在浏览器里面输入网址或者ip号码,这时浏览器就会发出一个请求(request)。因为请求里面包含了域名或IP,域名服务商根据域名,转换成IP地址,然后路由器会根据IP,把你的请求文件,request在兜兜转转之间,送到你的服务器上来。而这个request被转送到服务器时,先由服务器软件(nginx或appache,我们这里用的是django自带的)审查一下,根据对应的URL转到不同的目录或者文件上去。
比如,我在浏览器上输入了
172.20.10.4/index.html
那么,这个请求就会传到我的计算机的服务器软件(django自带的服务器软件)那里,然后软件根据请求的url,会把他们带到www的文件夹目录下的index.html进行访问。
(当然,一般来说,你可以在任何盘,任何地方,指定任何文件夹来充当展厅目录,只是按照业界默认规则,我们一般在项目目录下面,弄一个叫www的文件夹来存放我们的网页文件,按照默认规则总该是不错的,否则哪天你休假去了,新来接手的小伙都不知道需要维护的网页问价放在哪里)

我们的服务器软件自然是知道自己的ip地址的,所以上面提到的,绑定URL所用到的函数可以简化成这样
url(' ','D:django_project/mysite/myCloud/www')
空就表示的是我们的ip

没错,django也差不多是这样,只是有"一点点"的不一样,这点不一样,会让django显得更加高端一些。
我们的diango服务器软件在接到游客的游览请求之后,并不是亲自将游客带到相关地点,而是把游客交给相关的讲解员(调用一个我们称之为讲解员的函数),比如,游客输入的是
laowang.com/index.html
说明,他想参观我们的主页,那么,服务器软件就把他交给负责主页的讲解员(函数)来接待,每一个展柜(网页文件)都有对应的讲解员。
这样多加一道程序有什么好处呢,肯定得有好处啊,多养了一个讲解员就多发一份工资,成本上去了,肯定要有地方回本的。
好处就是,首先,我们能够做到跟php模式一样,也就是说,只要讲解员啥事不干,就是把游客指引到相关展厅就好了,也就是一个中间人过渡一下。所以,功能上django是涵盖之前所说的模式的。
其次,我们可以安排讲解员干一些活,像之前的模式,你只是游客引领到相应的展厅,就不管了,这样的话,这个展厅就一定要实体的文件,比如某游客想看我们的主页,他在浏览器上敲入
laowang.com/index.html
那么服务器软件就把他指引到
D:django_project/mysite/myCloud/www/index.html
也就是说,在你的www目录下是一定要有index.html这个文件的,否则就尴尬了,游客将会看到404
但是,多加了讲解员就不一样了,就算没有index.html这个文件,照样能够让游客满意,因为讲解员可以跟游客拉家常,至少,游客不会看到尴尬的404!
负责主页的讲解员函数如下

index_jiangjieyuan():
  return "欢迎来访问,但是我们的展馆现在啥都没有"

这样一来,每次有游客输入
laowang.com/index.html
服务器软件就把这个请求转给index_jiangjieyuan()。然后这名讲解员就会让游客看到那句话。因此游客就会知道你的网页还没建好,而不是认为网站被黑客搞崩了。
当然,讲解员直接这样回复字符串,浏览器是听不懂的,就没法呈现给游客了,于是,讲解员必须讲解浏览器能懂的语言,比如

index_jiangjieyuan():
  return "<html><head></head><body>欢迎来访问,但是我们的展馆现在啥都没有</body></html>"

这样是不是很麻烦,别担心django就是专治麻烦的,人家给讲解员配了专门的翻译官(一个翻译函数),所以就是这样

from django.http import HttpResponse
def index_jiangjieyuan():
return HttpResponse("欢迎来访问,但是我们的展馆现在啥都没有.")

这个HttpResponse就是专门把字符串翻译成浏览器的语言用的,具体如何实现咱们就别管了,深入了解这个,还不如去看看杨幂演的翻译官,听听尬法语。
这个还不完呢。
每个游客在给浏览器输入URL的那一刻,浏览器就发出一个请求文件,然后在各路路由中兜兜转转抵达目的地,这个请求里面可不止URL那么简单,也就是说,游客输入
laowang.com/index.html
浏览器发出去的请求里面除了这个最关键的URL字符,还有很多东西,想看有哪些东西,你打开chrome浏览,在地址栏输入 baidu.com
然后点击键盘上的F12按键可以调出,chrome的控制台,你就可以看到你刚刚向百度的服务器发出游览请求的时候都发出什么内容了。在控制台里面选择红色圈着的那几个地方,首先选Network,再点击左上方的www.baidu.com 然后是选择header。你就会看到大红色圈着的本次请求的总体情况(包含了发出请求和收到回复的情况),里面有个状态码,叫 200 OK 意思很明显了,就是我们这次请求百度的资源很成功,百度也成功地回复了我们的请求,也就是说,刚刚我们已经成功游览了百度的主页。如果找不到相应的页面就会有其他的错误码,除了如雷贯耳的404。其实还有什么302, 503 ,504 ,500都是比较常见的错误。

image.png

然后我们再仔细看请求文件(request)和回复文件(response)的详情,分别在两个大圈里面,大黑圈是回复,大紫圈是请求。你可以看到request里面有传说中的cookie。一堆服务器端能看懂的乱码,里面包含着我的个人信息,比如我的百度账户的id。
为什么需要这些信息,这是因为,服务器要有针对地为访问者服务,从request中可以知道访问者的身份,所以你只要一登上这些网战,这些网站就好像认识你似的,跟你打招呼,比如“”欢迎,XX“ 之类的。
所以,每次服务器软件接到游览请求的时候,他也会把会把请求的内容向讲解员传达的,于是,讲解员函数,就必须得接受一个request参数,这个参数里面包含了游客的信息。因此,函数应该是这样的。

def index_jiangjieyuan(request):
  return HttpResponse("欢迎来访问,但是我们的展馆现在啥都没有")

这其实就不是伪代码了,而是我们项目中能够用上的,能够运行的代码,从中我们可以看到,这个讲解员比较没人情味,因为,她已经从服务器软件那里接收到了request,这里面包含了我的名字,所以,这个讲解员是知道我的名字的,他居然不向我打招呼。这样不好,得改!

def index_jiangjieyuan(request):
  visitor_name = request.user.username
  return HttpResponse("Hello %s, 欢迎来访问,但是我们的展馆现在啥都没有" % visitor_name )

这样看起来,讲解员就训练有素,礼貌彬彬了,只是,我突然想起来,老王家是不搞会员制的,所以他们家的cookie里面不包含游客名字的,所以,我们还得把讲解员改回来。别急,我们的云盘肯定是要搞会员制的,到时候需要了再加回来,但是目前来看,cookie里面并没有什么身份信息。所以就先改回来:

def index_jiangjieyuan(request):
  return HttpResponse("欢迎来访问,但是我们的展馆现在啥都没有")

到这里我们可以看到,django模式的优越性,他不需要专门制作一个index.html这样的一个展柜,可以直接由讲解员口述就好了。

在django中设计者将这样类似讲解员,或者说导游,或者讲解员这样的东西称为view,为什么是view,通过深入的学习,你会慢慢理解的。因为这样的设计,所以你如果看一些django相关项目的代码,他们的讲解员函数名字是
index_view
而不是本教程,所用的
index_jiangjieyuan
我们用的这种名字,看起来有些不伦不类,但是,为了加深大家对该类函数的印象,加深大家对这类函数导游,讲解功能等方面的理解,也为了大家能够更加直白地看到这些函数该怎么用,该用在什么地方,本教程坚持这样的命名方式!

我们在sublime结构树里面点击myCloud目录,点击里面的views.py,看这个文件名就知道这里是专门放view函数的,也就是专门放一个个的讲解员的,为了符合我们的命名标准,我们把它改了,改名为
jiangjieyuan_mingdan.py
讲解员名单,意思是里面有很多讲解员。我们把第一位讲解员放进去,在该文件里面补充如下代码

from django.http import HttpResponse
def index_jiangjieyuan(request):
    return HttpResponse("Welcome")
image.png

目前我们公司算是招聘了这位讲解员,那么就得告诉服务器软件,以后对应的主页浏览请求的游客就交给他,怎么告诉服务器软件呢,我们必须要到urls.py里面去配置。
在sublime结构树上点击子mysite管理目录下的urls.py
我们需要在里面填入类似
urls(r'172.20.10.4/yunpan','myCloud.url')
(里面的小r是一种规定,django的url使用raw string而不是一般的string告诉python编译器不要随便转义,一般正则表达式的前面会用到这个,这是python的知识,我们不多讲,我们照做就是)
为什么是这样的函数呢,我们知道,我们的mysite是一个大项目,django默认我们是要建立很多小项目的,比如有云盘,有论坛等等..
所以,在django的项目管理的url文件里,先把外部URL指定给某个小应用,然后再由小应用的URL文件指定具体的内部URL。这种思想是非常值得借鉴的,一切都显得很有条理,以后想扩张业务很方便。比如以后建论坛,建云笔记等网络服务,只要这样加上去就好了
urls(r'172.20.10.4/yunpan','myCloud.urls')
urls(r'172.20.10.4/luntan','myForum.urls')
urls(r'172.20.10.4/biji','myNote.urls')
而不是一股脑把所有的东西全部放到项目管理的URL,这样会显得很拥挤。
当然,本教程中我们只做云盘,我们希望游客只要输入ip地址(或域名)就能直接抵达我们的云盘展馆,而不用特意输入yunpan
于是我们的配置指令应该是
url(r'172.20.10.4',myCloud.urls)
然后,django自己是知道本身的ip地址的,所以ip地址在里面可以省去,变成
urls(r'',myCloud.url)
上面的句子只是一条伪代码,要按照django的规则,把myCloud.url放进去,必须得使用include函数,那就按照他的要求来吧,我们打开子mysite里面的urls.py文件,在里面填入
url(r'',include('myCloud.urls')),
这才是一条实现目的的真正代码。注意在使用include之前要先引用。最终项目的urls.py文件会是这样的

from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'',include('myCloud.urls')),
]
image.png

这就相当于分配URL的权力下放到我们的云盘的urls去了,项目的urls文件不直接管了。
然后,我们就要开始管理我们云盘的url了。我们在myCloud的文件夹里面新建一个py文件,命名为urls.py。


image.png

在里面输入如下的代码:

from django.conf.urls import url
from . import jiangjieyuan_mingdan
urlpatterns = [
    url(r'index.html',jiangjieyuan_mingdan.index_jiangjieyuan),
]
image.png

这样一来,你再到cmd里面里面运行服务器,然后就可以在浏览器里面输入
172.20.10.4/index.html
来浏览我们的第一个页面了。
当然,你看,别人的服务器软件那么只能,只要输入
172.20.10.4
就能自动指引到
172.20.10.4/index.html
上去,因为,我们作为网页的管理员,希望游客看我们的页面而不是看我们的目录,而这些,都可以在 urls.py文件里面设定,比如把myCloud文件夹里面的urls.py修改为

from django.conf.urls import url
from . import jiangjieyuan_mingdan
urlpatterns = [
    url(r'',jiangjieyuan_mingdan.index_jiangjieyuan),
]
image.png

那么这时只要输入ip就能直接访问我们的主页了,所以我们看到,在url函数的左边写入外部URL,左边写入负责相应页面的讲解员的名字就可以了。如果你学过正则表达式,那么你还可以设置更加复杂的表达式来对应url,这样一来你的服务器软件会显得更加智能,比如游客手残输入
172.20.10/ondex.httttttml
你也能指引到主页上去,这些都是正则表达式能干的,咱们这里就不多说了。

推荐阅读更多精彩内容