• GeoIP是关于IP地址和地理位置的应用。例如:通过访问用户的IP,展现不同语言的页面。
    目前,有很多付费的解决方案,数据库,或者web service。值得高兴的是Maxmind.com提供了免费的版本。下面我们在Django网站里使用一下GeoIP。

    第一步,安装GeoIP C Api和库 http://www.maxmind.com/download/geoip/api/c/

    第二步,下载数据文件。http://www.maxmind.com/download/geoip/database/

    第三步,编译lighttpd mod_geoip模块 http://trac.lighttpd.net/trac/wiki/Docs:ModGeoip ,然后进行配置。

    第四步,如果你是用php,实际上就可以用了。我们是用Django,所以你还必须安装GeoIP的python API http://www.maxmind.com/app/python

    最后,在view function函数里加入

        import GeoIP
        country = 'unknown'

        try:
            ip = request.META['REMOTE_ADDR']
            return HttpResponse(ip)

            geo = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)
            country = geo.country_code_by_addr(ip)
        except:
            raise


    BTW,127.0.0.1是识别不了的。
  • ajax应用的越来越广泛。以前我一直使用jquery的.post,和.get来做
    ajax操作,很方便。但是.post和.get是不支持跨域操作的,例如:
    在a.com通过他们调用b.com,会返回uri denied。今天要实现一个feature
    要ajax跨域操作,就研究了一下。

    jquery从1.2开始,.getJSON就支持跨域操作了。这个是官方给出的例子。
    http://docs.jquery.com/Ajax/jQuery.getJSON#urldatacallback

    $.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
            function(data){
              $.each(data.items, function(i,item){
                $("<img/>").attr("src", item.media.m).appendTo("#images");
                if ( i == 3 ) return false;
              });
    });

    这里的jsoncallback是一个jsonp的callback。不指定就是用?,jquery会自动
    把?替代。这个大家可能还不太理解,一会就明白了。

    我用django做web开发的framework。那么提供json数据的view func应该如何写呢?

    def api(request, id):
        try:
            info = Info.objects.get(id=id)

            data = {
                'name':info.name,
                'gendar':info.gendar,
            }
        except:
            status = {}

        callback = request.GET['callback']

        return HttpResponse('%s(%s)' % (callback, simplejson.dumps(status)))

    这里的callback就是一个jsonp的func名字,通常是jsonp1214803701549这样的串。
    HttpResponse的返回值一定是jsonp1214803701549({'name':xxx, 'gendar':xxxx})。
    因为这样才能回调到你的客户端的function。这个浪费了我不少时间。

    HTML端代码就更简单。

    $.getJSON("http://xxx.com?callback=?",
            function(data){
                alert(data.name);
            }
    });

    到此,ajax的跨域操作就完成了。网上关于这方面的资料不多,而且都不详细。
    上面是我用firebug跟踪HttpResponse,HttpRequest的参数的总结的。
    可能有理解不当,或者有更好的方法,欢迎大家一起交流。

  • 我最早接触Django是在2005年底。当时,我对web开发产生了强烈的兴趣,一心想快速实现几个脑海里关于web的idea。由于一直做软件开发,对web开发毫无概念,所以第一个面临的问题就是选择framework。

    基于java的web framework复杂度太高,不适合做快速开发。asp不跨平台,php听说项目大了管理不方便(现在看来,应该也是不错的)。不是很习惯ruby的语法,放弃了ror。由于久闻python语法的简洁和库的成熟,我就定格在python based framework - django,官方的介绍是: Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.。

    即使是面对从未用过python的我来说,django上手也非常容易。django提供了大量的shortcut scripts,包括:用django-admin.py来生成项目,manage.py来管理项目。自动生成的settings.py一目了然。 urls.py也是简单易懂。实际上,django-admin.py startproject xxx, Hello World的server就可以run起来了,这对新手来说感觉非常好。

    django采用MVT模型,就是Model, Template, View。Model是OR Mapping的实现,对应的数据库的表结构。虽然,很多人指责django的ORM效率不高,但是用过的人都明白它实在是太方便了。django同样提供了执行raw sql的方法解决你性能问题。Template就是html模板支持继承,if, for,等等简单的语法。模板让应用逻辑和展现分离。很多时候你发现只要修改html的模板就可以,根本不需要修改python代码,不需要reload server。View是对应呈现给浏览器的response,通过views.py上的函数render模板实现。用MTV这种pattern来开发 web,真的让我感觉非常舒服。

    除此以外,django还有不少亮点。基于regular expression的url配置(urls.py)。大量好用的middleware(authentication, session, transaction, cache, gzip)。模板可以自定义tag和filter。大量的utils和addons,例如:textile, rss generator。

    当然,django也不是十全十美的。还是有一些鸡肋的设计,比如authentication的User, Group等结构,过于复杂,产生大量冗余表。newform我也用的不多。send_mail没有参数化,content type和encode都不够灵活。模板escape的向后兼容性。当然这些问题都可以通过一些技巧,或者自己实现来替换调,不算太大的问题。

    应livid之约,胡言乱语几句django的开发心得,希望抛砖引玉,大家多多交流。至今,我已经用django开发了3个相对完整的网站,并且还希望继续的做下去。不过,django最近脚步很慢,希望1.0 milestone早点到来。最后,感谢我的django领路人limodou,他说当我的技术支持,真的说到做到,非常感谢。

    Reference

    Django http://www.djangoproject.com/

    Django Step by Step http://www.woodpecker.org.cn/obp/django/django-stepbystep/newtest/doc

    Django Book http://www.djangobook.com/

    Django Master Class http://toys.jacobian.org/presentations/2007/oscon/tutorial/

    Django Snippets http://www.djangosnippets.org/