RWPy4learner 11.3.30 documentation

Version: 11.3.30
[首页] 发布途径 << Django 网页框架 (Source) >>周蟒介绍

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就成功地生成了一个可以访问的页面。

../_images/django_itworks.png

图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所示)。

../_images/django_template.png

图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,以使更多的朋友可以受益。