Django 网页框架¶
小白在经历过写通讯录软件、网页服务和手机APP后,对Python的应用已经非常熟悉了。 小白琢磨着,自己已经快毕业了,何不用Python来帮助自己创业呢?用Python做些什么好呢?小白曾经给EPTCO Inc. 做过搜索引擎优化和用户体验研究。将Python与自己的兴趣和工作经历结合再一起,才能更大可能地创业成功。小白下定决心,“我要做Python程序员中的搜索引擎优化和用户体验专家;要做用户体验研究员中的编程大牛!”
小白在做搜索引擎优化时,经常会用到一些网页服务,比如在线查询Page Rank,目录收录情况,Alexa排名查询等。小白想,“何不用Python来实现这些服务呢?让更多的朋友可以受益。”
“说做,咱就做呀!”小白开始在Bing.com和Baidu.com等搜索引擎查找”Python web framework”和“python web 框架”。经过搜索,小白发现,Python有名目繁多的web框架,如django,Pylons, TurboGears , Zope, web2py, Bottle等。其中,Django是被提及次数最多,受许多人欢迎的框架。Django被称为”时间有限的完美主义者的web框架”(The Web framework for perfectionists with deadlines)。根据这些评价,小白认为,使用Django应该开发很快,也会有很多同道中人。小白决定,先去安装一个Django来试试身手。
安装Django¶
小白打算在自己的windows操作系统下安装和开发Django网站。根据以往的经验,小白已经很熟悉Python库的安装了。打开cmd命令行,输入easy_install django,很简单的就完成了django的安装。 下面是小白安装Django的过程。
C:\Users\He Jibo>easy_install django
Searching for django
Best match: Django 1.2.5
Adding Django 1.2.5 to easy-install.pth file
Using c:\python25\lib\site-packages
Processing dependencies for django
Finished processing dependencies for django
如果您的电脑里没有安装easy_install这个库,强烈建议您搜索easy_install,并安装它。有了easy_install,可以让您安装Python的库更轻松。 如果您不喜欢easy_install,您也可以搜索django,下载到本机,解压缩后,在cmd命令行下输入python setup.py install进行安装。
安装完后,检查一下是否正确安装吧。先在cmd命令行中输入python,然后import django以导入django这个库。 如下所试。嗯!Python没有报告错误,说明Django已经成功安装了。
C:\Users\He Jibo>python
ActivePython 2.5.5.7 (ActiveState Software Inc.) based on
Python 2.5.5 (r255:77872, Jan 31 2010, 15:49:35) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>>
至此,小白已经成功地在windows操作系统中配置好Django开发环境了。 读者,“那么,怎么在linux,比如ubuntu下面安装Django呢?”。 小白说,“我也不太清楚linux用户怎么安装的。不过听说每个linux用户都是天使,没有他们做不到的事情。比如,ubuntu下,在terminal(终端)中输入sudo aptitude install python-django就可以了安装好Django了。”
创建Django工程¶
Django提供了很强大的工具,以快速地开发网站。 小白先在C:盘下新建了一个django-pr的文件夹,用户存放Django工程的所有文件。以后所有的操作 都是在C:django-pr这个路径中完成的。
Django提供了django-admin这个工具来创建项目目录。在cmd命令行中输入下面的命令: django-admin startproject ueseo 其中,ueseo为工程名字。您也可以取其它的名字。小白把它的工程命名为ueseo,因为ueseo是用户体验(user experience)和搜索引擎优化(search engine optimization)的英文的缩写。在网站的域名中包含搜索关键词,对搜索排名有非常大的帮助。
小白发现,ueseo目录下有4个文件:
__init__.py
表示这是一个Python的包
manage.py
可执行文件。用于项目管理的简便工具,可以自动处理DJANGO_SETTINGS_MODULES和PYTHONPATH。
settings.py
Django的配置文件
urls.py
处理URL映射
小白不由惊叹,“哇!Django真强大。我只运行了一个命令,就已经完成这么多代码了。”小白听说,它的这个工程已经可以运行了。 不信?启动Django自带的web服务器看看吧!
启动Web服务器(Web Server)¶
ueseo文件夹下的manage.py文件是用来管理项目的,包括启动web服务器。小白在命名行中输入
python manage.py runserver
得到了下面的反馈信息。
C:\ueseo>python manage.py runserver
Validating models...
0 errors found
Django version 1.2.5, using settings 'ueseo.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
小白根据提示,用浏览器访问http://127.0.0.1:8000/这个网址。小白很开心地看到了“It worked!”。 仅仅一行命令,Django就成功地生成了一个可以访问的页面。
图1. Django成功建立工程后的显示内容。(It worked!)
第一个网页,Hello,Django!¶
接着,小白打算写自己的第一个Django网页。 小白在ueseo目录下新建立pagerank.py文件(因为小白的最终期望是写一个查询Page rank的网页服务,所以文件命名为pagerank.py 您也可以取其它您喜欢的名字)。 小白在pagerank.py中输入了下面的代码。这段代码的功能是生成一个显示“Hello, Django!”的页面。
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello, Django!')
小白还需要配置网址。小白打开urls.py文件,里面已经有的代码提示如何配置网址。小白细读了urls.py, 明白了网址配置的方法后,将urls.py的内容替换为如下的代码:
from django.conf.urls.defaults import *
urlpatterns = pattern('',
(r'^$', 'ueseo.pagerank.index'),
)
上面的代码中,r’^$’是一个匹配空字符串的正则表达式,当访问http://127.0.0.1:8000/时就会调用pagerank.py模块中的index方法。
小白重新启动web服务器。访问http://127.0.0.1:8000/,成功地看到了Hello, Django!。第一个网页已经做成功了。
Django的模板系统(Templates)¶
上面的Hello, Django示例虽然简单,可是生成的页面也过于简单,也不太美观。怎么才能让页面更漂亮呢? 小白发现,Django提供了很好的模板系统(Templates)来解决这个问题。在页面模板中,可以通过js和css代码使页面 更美观。此外,模板系统让html代码和Python代码分离,使代码更易读和维护。
首先,小白在ueseo目录下新建了一个叫templates的文件夹,用来存放模板文件。
然后,小白打开settings.py,找到TEMPLATE_DIRS,进行如下修改,用户指定模板存放的位置。
TEMPLATE_DIRS = (
'./templates',
)
接着,小白在ueseo/templates/目录下创建pagerank.html,内容如下:
.. literalinclude:: ../../src/6_others/django/ueseo/templates/pagerank.html
在Django的模板中,{% %}表示代码调用,{{ }}表示变量引用。比如,上面代码中的{{ pagerank }},当传入pagerank的值时, {{ pagerank }}就会被替换成传入的值。
随后,小白在pagerank.py里面增加了下面的代码。这段代码向pagerank.html传入一个url和对应的pagerank值。
def PRtemplate(request):
url='http://www.ueseo.org'
pr=3
return render_to_response('pagerank.html',
{'url': url,
'pagerank':pr,
})
最后,小白还需要为新的函数PRtemplate配置网址。小白在urls.py里增加了(r’^template/$’, ‘ueseo.pagerank.PRtemplate’),这行代码。 当用户访问http://realdomainname.com/template这个网址时,就会调用PRtemplate函数。
小白重新启动web服务器。访问http://127.0.0.1:8000/template/就可以看到他基于模板做的页面了(如图2所示)。
图2. Django模板系统示例
查找Page Rank的网页¶
上面的代码已经很接近小白想做的page rank查询功能了。不过,小白还需要动态地获取url,并查找一个url对应的page rank。
怎么查找page rank呢?小白打算先找一个可以独立运行的查找page rank的代码。小白使用必应搜索了“python page rank”,发现了 很多个使用python查询page rank的代码。小白把代码复制下来,保存在pageranksearch.py中。源代码如下:
#!/usr/bin/env python
"""
Pagerank Algorithm
Jibo He @ UESEO.org
hejibo@ueseo.org
http://www.ueseo.org
"""
import sys
import urllib
def IntStr(String, Integer, Factor):
for i in range(len(String)) :
Integer *= Factor
Integer &= 0xFFFFFFFF
Integer += ord(String[i])
return Integer
def HashURL(Str):
C1 = IntStr(Str, 0x1505, 0x21)
C2 = IntStr(Str, 0, 0x1003F)
C1 >>= 2
C1 = ((C1 >> 4) & 0x3FFFFC0) | (C1 & 0x3F)
C1 = ((C1 >> 4) & 0x3FFC00) | (C1 & 0x3FF)
C1 = ((C1 >> 4) & 0x3C000) | (C1 & 0x3FFF)
T1 = (C1 & 0x3C0) << 4
T1 |= C1 & 0x3C
T1 = (T1 << 2) | (C2 & 0xF0F)
T2 = (C1 & 0xFFFFC000) << 4
T2 |= C1 & 0x3C00
T2 = (T2 << 0xA) | (C2 & 0xF0F0000)
return (T1 | T2)
def CheckHash(HashInt):
HashStr = "%u" % (HashInt)
Flag = 0
CheckByte = 0
i = len(HashStr) - 1
while i >= 0:
Byte = int(HashStr[i])
if 1 == (Flag % 2):
Byte *= 2;
Byte = Byte / 10 + Byte % 10
CheckByte += Byte
Flag += 1
i -= 1
CheckByte %= 10
if 0 != CheckByte:
CheckByte = 10 - CheckByte
if 1 == Flag % 2:
if 1 == CheckByte % 2:
CheckByte += 9
CheckByte >>= 1
return '7' + str(CheckByte) + HashStr
def RetPr(URL):
import urllib
hsh = CheckHash(HashURL(URL))
gurl = 'http://www.google.com/search?client=navclient-auto&features=Rank:&q=info:%s&ch=%s' % (urllib.quote(URL), hsh)
f = urllib.urlopen(gurl)
st = f.read()
st = st.lstrip().rstrip()
st = st[9:]
try:
st = int(st)
except:
st = 0
return st
def RetTic(URL):
import urllib
yurl = 'http://bar-navig.yandex.ru/u?ver=2&show=32&url=%s' % URL
f = urllib.urlopen(yurl)
st = f.read()
import re
m = re.search(r'value="([0-9]{1,5})"', st)
try:
tic = m.group(1)
except:
tic = 0;
return tic
def RetYaca(URL):
import urllib
yurl = 'http://bar-navig.yandex.ru/u?ver=2&show=32&url=%s' % URL
f = urllib.urlopen(yurl)
st = f.read()
import re
m = re.search(r'<textinfo>(?P<author>[\W\w]+)</textinfo>', st)
try:
yaca = m.group(1)
except:
yaca = '';
if len(yaca) > 2:
return 'y'
else:
return 'n'
if __name__ == '__main__':
import sys
import urllib
url ='http://www.ueseo.org'
pr = RetPr(url)
print pr
运行pageranksearch.py,就会输出http://www.ueseo.org的page rank。如果要查询其它网页的page rank, 只需要导入pageranksearch中的函数,使用RetPr(url)查询page rank。
经过上面一小节,小白对使用Django制作网页有了更多的认识。他要做的page rank查询网页并不比上面的Hello, Django 复杂多少。将’Hello, Django!’替换成对应的Page Rank值就可以了。 小白在pagerank.py文件中增加了下面的代码:
def pagerank(request):
if 'url' in request.GET:
pr = RetPr(url)
return HttpResponse('page rank of %s is : %s'%(url,pr))
else:
return HttpResponse('please specify the url')
此外,小白还在pagerank.py的首行,加上了from pageranksearch import *,以导入pageranksearch.py中的RetPr函数,用于 计算page rank。
最后,小白在urls.py中增加了(r’^pagerank/$’, ‘ueseo.pagerank.pagerank’),这一行代码。当用户访问 http://realdomainname.com/pagerank这个网址时,就会调用pagerank函数。
最终的pagerank.py文件内容如下: .. literalinclude:: ../../src/6_others/django/ueseo/pagerank.py
最终的urls.py文件内容如下: .. literalinclude:: ../../src/6_others/django/ueseo/urls.py
小白重新启动web服务器。然后访问http://127.0.0.1:8000/pagerank。页面与图2相似。不过已经完成了查询功能了。 小白在搜索框中输入一个网址,比如www.ueseo.org,就可以查到这个网址对应的page rank。
至此,小白进一步美化pagerank.html这个模板,使得页面更好看。终于完成了page rank查询服务了。小白把 把他的代码布置到网络上,网址为http://www.ueseo.org/pagerank,以使更多的朋友可以受益。