当你在浏览器中访问链接时,你访问的是什么?

前天在看完水镜九奇发的django边学边做(6)|深入模板后有一种感觉,因为这个教程主要是讲述如何利用django搭建一个Blog应用,中间省略了一些基础的网络知识,特别是请求路径和文件路径之间的关系,对于很多初学Web开发的人来说,这是经常犯晕的一件事。所以自己在想,能不能写一篇文章,把这部分内容简单说明一下。


想要理解这个问题,要从你房间里的抽屉说起。通常,我们会将房间里的物品进行分类,放入不同的抽屉中,目的是为了方便以后查找(如果你是一个经常弄丢东西的人,可以想一想,自己是不是不喜欢将东西放在固定的地方)。这样一来,每个物品都有了一个存放的路径。


例如,你家里剪刀的存放路径可能是,家里/书房/书桌/左边第一个抽屉/。当你下次想用剪刀时,只要顺着路径去找就能拿到它。


来到电脑上,你的电脑上同样存放着各种文件。和房间里的物品一样,为了方便查找它们,开发人员设计了类似抽屉的东西,叫做目录或者文件夹。文件夹中不但可以装文件,还可以装别的文件夹,每个文件夹都有自己的名字,从外层到内层,将文件夹的名字拼接起来,就是存放文件的路径。


例如,如果你用的是Windows操作系统,平时所说的C盘、D盘就是最外层的文件夹。在D盘中你放了一个文件夹叫漫画,漫画的文件夹中你又放了一个文件夹叫做灌篮高手,你在里面存放了灌篮高手的电子书。当你想要看它时,就可以到 D:/漫画/灌篮高手/ 这个路径下去找它们。


你的朋友知道了你有灌篮高手的漫画,想要借来看看,但是你们住在不同的城市,你没有办法通过U盘拷贝给他。你灵机一动,想到了一个方法,让他通过网络直接访问你的文件。你告诉他一个访问链接,www.shenxinduo.com/漫画/灌篮高手/全国大赛.html,让他在浏览器中打开看。


链接主要包含3个部分,前面蓝色的部分叫做域名,它的作用是让你的朋友在网络中找到你的电脑。中间绿色部分是路径,用来表示全国大赛文件存放的路径,最后红色的部分是文件名,用来表示具体想看的文件是哪个。



需要注意的是,这个链接是由你提供给你朋友访问的,链接中的域名、路径和文件名都是由你来决定,它们并不需要和你电脑中实际存放的路径和文件名保持一致(为了方便处理,开发时通常都会保持一致),还可能链接对应的不是具体的文件,而是通过程序生成的一段文字。


你可以将浏览器中访问的链接想象成一个虚拟地址,通过这个虚拟地址可以找到一个中间人,这个中间人根据虚拟地址找到你电脑上真实的路径和文件,然后将这个文件发送给你的朋友。


这里的中间人被称为Web服务器,它的作用是接收浏览器发送过来的请求,解析请求链接,找到对应的文件返回给浏览器。例如,Django有自带的Web服务器,Java常用的Tomcat、Weblogic,还有目前使用最广泛的Apache和Nginx。


你电脑上灌篮高手全国大赛的电子书叫做 湘北高中篮球部.html ,放在 D:/电子书/漫画/灌篮高手/ 这个路径下面。接着,你在Web服务器中写了一个程序,用来解析上面那个访问链接,www.shenxinduo.com/漫画/灌篮高手/全国大赛.html 。当你的朋友通过浏览器访问这个链接时,浏览器会给Web服务器发送一个请求,Web服务器接收到这个请求后,就会开始执行你写的程序。


你在程序中写到,当接收到 www.shenxinduo.com/漫画/灌篮高手/全国大赛.html 这个请求时,返回 D:/电子书/漫画/灌篮高手/ 湘北高中篮球部.html 文件给对方。这样你的朋友就可以在不同的城市,通过网络看到你电脑上的灌篮高手漫画。



根据用途不同,Web服务器大致可以分为两种类型,静态Web服务器动态Web服务器


静态Web服务器的主要作用类似于上面这样,将你电脑上存在的静态文件,也就是已经确定好内容的文件,例如HTML、JS、CSS、图片等,直接返回给浏览器。


动态Web服务器的作用,可以动态生成需要返回的内容,例如去访问获取用户名的链接,张三访问时,服务器返回张三,李四访问时,服务器返回李四。django边学边做(5)|初识模板所教的,就是利用模板来动态生成返回的内容。


当你朋友在浏览器中看完《湘北高中篮球部》这一章后,发现在网页的末尾还有两个链接,一个链接是 十日后.html,另外一个链接是 /漫画/海贼王/冒险的黎明.html


第一个链接的路径叫做相对路径,它表示十日后.html这个文件和全国大赛.html 的路径相同,它完整的路径是/漫画/灌篮高手/十日后.html。相对路径不止能写文件名,还可以在前面加上路径。例如,番外篇/十日后.html,它的完整路径就是 /漫画/灌篮高手/番外篇/十日后.html。


第二个链接和第一个链接相比,最大的区别就是,它是以“/”开头的路径。“/”表示Web服务的根目录,也就是这个Web项目最外层的目录。从它开始,依次去查找下一层的目录和文件。


现在回到django边学边做(6)|深入模板文章中。文章最开始遇到的问题是,页面中的图片和css文件都访问不了。从页面中写的链接地址可以发现,这里用的是相对路径,也就是与当前这个页面的链接路径相同,都是 域名/article/



它们的完整请求链接就是,域名/article/assets/imgs/favicon.png域名/article/assets/css/xxxx.css


你的程序中没有对这些请求链接的处理,Django找不到对应的文件,就会返回404状态给浏览器。这里的404状态就涉及到另外一个Web开发必学的知识,HTTP协议,留到以后再详细讲解。


既然现在是因为请求的链接不对,导致Django找不到这些文件,那只要将链接改成正常的就可以了。


Django中对静态文件有一套特殊的处理方式,你可以在setting.py配置文件中设置几个变量,STATIC_URLSTATICFILES_DIRSSTATIC_ROOT。


STATIC_URL表示静态文件请求链接的根路径。例如,STATIC_URL = '/staticfile/'时,所有以staticfile为路径开头的请求(域名/staticfile/xxx/xxx/xx.xx),无论staticfile后面的路径和文件名是什么,Django都会将它当作静态文件,不再经过你写的程序,直接去固定的目录中搜索它们,如果文件存在就返回给浏览器。


固定的目录有哪些呢?就是你用STATICFILES_DIRSSTATIC_ROOT变量设置的静态文件根目录。


STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) 中,BASE_DIR表示当前项目的根目录,也就是教程中创建的blog目录。static表示用来存放静态文件的目录。当有人访问静态文件时,Django就会到 blog/static/ 目录下面去搜索。


类似的,STATIC_ROOT = "/var/www/example.com/static/" 中设置的也是一个静态文件目录,只是这里写了一个完整的路径。当有人访问静态文件时,Django也会到 /var/www/example.com/static/ 目录下面去搜索。


例如,当你访问链接 域名/staticfile/a/b/c.html 时,Django会去 blog/static/ 和 /var/www/example.com/static/ 目录下面搜索有没有路径为 a/b/,文件名为 c.html 的静态文件,找到了就返回给浏览器。


通常情况,静态Web服务器的性能要比动态Web服务器的性能高很多。例如,一个动态Web服务器同时只能处理几百个访问请求,一个静态服务器却可以同时处理几千,几万,甚至10万个访问请求。


因此,在实际使用时,通常只有在开发环境中,才会利用Django去处理静态文件,生产环境中,会利用静态Web服务器(例如Nginx)直接处理静态文件,不需要经过Django。


术业有专攻,专业的程序做专业的事,这也是开发过程中需要学习的重要技能。

0条留言

留言