非理性繁荣!

在谷歌应用程序引擎上部署django-springsteen

3月5日,2009.申请下django谷歌应用引擎斯普林斯汀

(查看现场Django Springsteen示例在这里)。

(另外,我已经大大简化了在谷歌应用引擎上部署django springsteen的过程,这里会有详细解释,但您仍然希望阅读本文以了解如何自定义Springsteen。)

维克辛格首次跑步雅虎老板谷歌应用引擎好几个月前,但django-springsteen是一个有点不同的魔术师吗老板混搭框架,希望你们能原谅我的重复。

在本文中,我将通过使用Springsteen对Yahoo!老板,推特,和亚马逊。起床跑步不应该超过半个小时。

  1. 首先注册一个新的谷歌应用引擎应用。我使用djangosearch,因为很明显,我第一次做一个蹩脚的Yahoo!BOSS关于GAE教程。很高兴知道我没有陷入常规或任何事情。

  2. 从GitHub检出django-springsteen源代码。

    git克隆git://github.com/lethain/django-springsteen.git django-springsteen
  3. 现在我们要打捞一些相关的碎片django-springsteen库,使他们适应我们的新目标,把剩下的扔掉。

    mv django-springsteen example_project /。/ djangosearchmv django-springsteen /斯普林斯汀/ djangosearch /Rm-右前Django Springsteen
  4. 接下来,我们想从最近的Django tarball中获取一个tarballdjangoproject.com/download/

    焦油-xvf Django-1.0.2-final.tarmv Django-1.0.2-final / django /。/rm射频Django-1.0.2 - *rm-rf django/bin django/contrib/admin django/contrib/authrm -rf django/contrib/databrowse django/testrm -rf django/contrib/admindocs django/contrib/gis

    (我们需要删除这些文件以使谷歌App Engine的文件限制低于1000。你也可以做一些文件压缩魔术来绕过它,但这种方法要简单一些。)

    事实上,Django -springsteen除了使用安全在一些模板中过滤模板。如果你愿意把它去掉,然后您可以跳过安装最新版本的Django。

  5. 接下来我们需要从django_example对于谷歌App Engine。首先创建的djangosearch / main.py将这些内容归档。

    进口日志记录,操作系统,sys#谷歌应用程序引擎导入。google.appengine.ext.webapp进口跑龙套删除Django的标准版本。k在里面(kk在里面sys模块如果kstartswith(django的德尔sys模块(k]#强制sys.path首先拥有自己的目录,以防我们要进口#从它开始。sys路径插入(0,操作系统路径abspath(操作系统路径目录名(__file__))#必须在导入Django的任何部分之前设置这个env var *操作系统环境(“DJANGO_SETTINGS_MODULE”]=“设置”进口django.core.handlers.wsgidef主要():为WSGI创建Django应用程序。应用程序=django核心处理程序wsgiwsgihandler()#使用该应用程序运行wsgi cgi处理程序。跑龙套run_wsgi_app(应用程序)如果_姓名__==“__main__ ':主要()

    接下来,我们需要创建djangosearch / app.yaml文件。)一定要换新的djangosearch使用您注册的应用程序的名称。)

    应用程序:djangosearch版本:运行时:pythonapi_version:处理程序:-url:/静态静态目录:静态-url:/ . *脚本:main.py

    最后Djangosearch/索引.yaml

    索引:#自动生成#每当dev-appserver检测正在运行一种新类型的查询。如果你想管理#index.yaml文件手动,删除上面的标记行(行)#说“自动生成”)。如果您想管理一些索引#手动,把它们移到标记线以上。index.yaml文件是#下次部署时自动上传到管理控制台#您的应用程序使用appcfg.py。
  6. 下一个打开djangosearch / local_settings.py把这些加到下面。

    ROOT_URLCONF=“url”MIDDLEWARE_CLASSES=(“django.middleware.common.CommonMiddleware”,“django.middleware.doc.XViewMiddleware”,)INSTALLED_APPS=(“斯普林斯汀”,)DATABASE_ENGINE=没有数据库名称=没有CACHE_BACKEND=“假:/ / /”
  7. 创建Djangosearch/Boss_设置.py文件,只包含BOSS_APP_ID参数,和AMAZON_ACCESS_KEY如果你有的话。)你需要报名在这里在这里如果你想要亚马逊的搜索结果,这是一个缺乏灵感的人从Springsteen的服务中赚钱的选择。)

    BOSS_APP_ID=“abcdefghijlknop”
  8. 调整djangosearch / urls . py要删除所有引用的文件example_project,以及删除额外的url模式。

    django.conf.urls.defaults.进口*urlpattern=模式(,(r“^ $”,“views.search”),)
  9. 超时。让我们为我们的新搜索引擎选择一个主题。嗯…嗯....好吧,让我们做一个专门针对苹果产品的搜索引擎。会出什么问题呢?

  10. 接下来,让我们配置搜索结果。去吧,敞开心扉djangosearch / views.py,先把所有东西都拿掉。

    通过添加以下导入开始重建:

    springsteen.views进口搜索作为default_searchSpringsteen.服务进口网状物,TwitterLinkSearchService,AmazonProductServicedjango.conf进口设置

    接下来,让我们创建我们的Amazon产品服务(如果您有Amazon子公司AWS key)。

    ComputerAmazonSearch(AmazonProductService):_access_key=设置AMAZON_ACCESS_KEY_topic=“苹果”

    然后创建了一个苹果味的Twitter服务。

    Appletwitter服务(TwitterLinkSearchService):第二乐章=3._topic=“苹果”

    最后,我们只需要混合雅虎的网页结果!老板,然后暴露我们的新搜索引擎。

    def搜索(请求,超时=2500,max_count=10):服务=(ComputerAmazonSearch,Appletwitter服务,网状物)返回default_search(请求,超时,max_count,服务)

    一个短的警告

    请注意雅虎!当您在本地测试您的springsteen应用程序时,BOSS搜索结果将无法成功检索。然而,一旦您将应用程序投入生产,它们将被正确地检索。我会找些补丁来解决这个问题,但没有必要恐慌。

  11. 在这一点上,我们已经让一切正常工作,但结果只是堆积在一起。肯定的是,你可能喜欢把这些亚马逊会员链接聚集在顶部,但你的用户可能不会。现在是时候让我们的脚趾接触相关性了。

    你想要最相关的结果冒泡到顶部(请随意用冒泡排序双关语),但天真地将来自不同服务的结果叠加在一起并不允许这样做,除非来自源A的所有结果都比来自源B的结果更相关,所有来自B的结果都比来自C的结果更相关,以此类推。让我们尝试一个非常简单的关联算法来解决这些问题。

    你可以想到两种关联方法:

    1. 根据他们的个人优点评分。我们可以称之为内在的关联
    2. 互相评分的结果。我们可以称之为上下文相关性

    我们要在这里做一点。首先,我们将提升包含在标题中的查询项的结果,其次,我们要惩罚已经遇到的域的第2 - n个结果。

    将此代码放入views.py搜索函数。

    def排名(查询,结果):查询=查询较低的()def等级(结果):分数=0.0标题=结果('标题']较低的()如果标题在里面查询:分数+=1.0返回分数得分=[(等级(x),x)x在里面结果]scored2=[]={}分数,结果在里面得分:领域=结果(“url”]取代('http://',)分裂(' / '0]times_viewed=得到(领域,0)new_score=分数+times_viewed*-0.1scored2附加((new_score,结果))(领域]=times_viewed+scored2排序()返回(x(]x在里面scored2]

    然后更新搜索函数来使用此排序函数。

    def搜索(请求,超时=2500,max_count=10):服务=(AppleAmazonSearch,Appletwitter服务,网状物)返回default_search(请求,超时,max_count,服务,{},排名)

    现在,我们使用上面的排序函数对结果进行排序。这是一个非常基本的关联方法,希望能展示基本概念。

  12. 现在我们有了我们的搜索引擎,是定制站点模板的好时机。

    首先做一个模板目录内djangosearch,以及模板/斯普林斯汀目录和一些空文件。

    cd djangosearchmkdir /斯普林斯汀模板模板触摸模板/ base.html模板/斯普林斯汀/ base.html联系

    然后让我们编辑模板/base.html文件。

    " http://www.w3.org/TR/html4/strict.dtd " ><span><span class=“cp”>%<span><span class=“k”>block<span><span class=“nv”>title<span><span class=“cp”>%.<span>水果搜索<span class=“cp”>%<span><span class=“k”>endblock<span><span class=“cp”>%.<span><span class=“nt”>
                
                 rel =
                 “样式表”
                 类型=
                 “文本/ css”
                 href =
                 “静态/ css / reset.css”
                 >
                 
                  
                   rel =
                   “样式表”
                   类型=
                   “文本/ css”
                   href =
                   “静态/ css / search.css”
                   >
                   
                   
                   
                    
                     id =
                     “身体”
                     >
                     
                      
                       id =
                       “高清”
                       >

    href = “/” >FruitySearch

    {%身体%}{%endblock%} id = “金融时报” >

    一个 href = >你的名字 生产,2009.

下一个编辑模板/斯普林斯汀/ base.html(如果这个很简短的话)。

{%延伸“base.html”%}{%块体%}{%结束块%}

当您继续定制结果的外观时,你可能想要覆盖模板/斯普林斯汀/ results.html,但就目前而言,这应该是一个合理的违约。

  • 创建一些CSS样式的网站。

    光盘djangosaerchmkdir静态静态/css

    当前base.html假设你有reset.css搜索.css文件。最近我倾向于使用YUI的reset.css,把一些定制的样式混在一起搜索.css

  • 测试所有东西。

    cd djangosearchdev_appserver.py。/

    假设有效,推送到谷歌App Engine,你就完成了。

  • 一些注意事项

    1. 您会注意到,默认情况下,您将无法分页超过3-4页。这是因为Springsteen的安全机制,当你处理大量的资源时,但如果只处理一个源文件,就会有点烦人。您可以覆盖此设置local_settings.py加上这一行:

      允许最多10页SPRINGSTEEN_MAX_MATCHES=10
    2. 同时,目前这个设置没有使用任何缓存,因此,它在更高的页面上无法有效地工作(显示结果100-110,例如)。

      有可能在GAE上使用memcache,我将在未来一两天内编写一个补丁,使Springsteen能够利用这个功能。

    如果您对在Google应用程序引擎上部署Springsteen有任何问题,请告诉我!我认为这是相当惊人的景观已经演变到能够推出这样的产品,在没有成本和基本上不费力气。

    我想这是我们的责任来利用它。


    我将在一两天内发布一个可重用的包,一旦我更新了缓存机制,使其足够智能,可以很好地使用谷歌应用程序引擎。(如果我现在发布它,人们会使用它,然后抱怨它的行为和广告宣传的一样……)