2014年3月25日星期二

Django:View, UrlMappping,Template

Reference: https://docs.djangoproject.com/en/1.6/intro/tutorial03/ 
【笔记性质,做好的材料还是原文!】

Web page在Django来自于view。view可由Python的函数表示(定义),view也可由方法表示。如果view是由方法而非函数定义,则说这个view是基于类的。Django通过检查URL知道对应的view。URL到view的映射,在Django里被称作URLconfs。URLconf把URL patterns映射到views。URLconf就是对应module目录下的文件urls.py

1) 定义View
官方例子,view的定义如下(views.py):
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the poll index.")

def detail(request, poll_id):
    return HttpResponse("You're looking at poll %s." % poll_id)

上面的两个函数idnex和detail分别定义(或者说指向了)了两个view。

2) 定义URLconf
作为URLconf的文件urls.py的内容如下,
from django.conf.urls import patterns, url
from polls import views

urlpatterns = patterns('',
    # ex: /polls/
    url(r'^$', views.index, name='index'),
    # ex: /polls/5/
    url(r'^(?P\d+)/$', views.detail, name='detail'),
)

urls.py中的url方法的第二参数就是函数名。
如,views.index,就是views.py中的函数index;  urls.py中的views.detail,就是views.py中的函数detail。
在urls.py中的url方法的第三参数就是视图名称。name='index' name='detail',就是分别定义了view的名字。
url的第一参数定义了reuqest's url到view的匹配规则。

**熟悉例子的时候,因为copy/past而没有修改对应的package名,结果导致在自己的application中,一直在调用无关应用polls的views.index方法。所以,最好不用用views这样的泛泛的名字做文件名,使用YourFeatuherViews这样具体的名称做文件名更好。

3) 把应用的url路由加入到project的路由定义中
最后,在project目录下的urls.py中,加入你创建的application的URLconf:
url(r'^autoInstaller/', include('autoInstaller.urls')),
url(r'^polls/', include('polls.urls')),

4)url到view的映射过程
当请求被Django server接收到,首先有项目的URLconf进行处理,如果找到了与某个应用application对应的url,则按照url()里的定义截取掉匹配的部分,然后继续转给这个应用的URLconf,这个应用再进行匹配处理,比如根据应用的URLconfg来截取、分割url。最后转给与之匹配的view method。 这种处理方式带来一个好处——方便应用的共享、分发。加入你的应用到新的project中时,只需要修改project的URLconfig与你的应用的对应url匹配规则就好了。

5)Template
view 要么返回一个HttpResponse要么抛出Exception

在view里,实际上你可以做很多事情,读数据库记录、生成PDF...但最后总期望的总是HttpResonse、或是Exception。页面显示方面的代码可以直接在view方法里写,当然最好是写到template里。Django的模板loader可以找到你应用下的template目录作为源导入其中的模板。在你应用的目录下建立目录tempaltes,在templates目录下再建立以app名为名字的目录。在这个目录下面保存这个app需要的模板。
下面这个段是模板代码:
{% if latest_poll_list %}
    {% for poll in latest_poll_list %}
           href="/polls/{{ poll.id }}/">{{ poll.question }}
    {% endfor %}
{% else %}      No polls are available. {% endif %}
    
下面这个段是导入模板、渲染模板的代码:
from django.http import HttpResponse
from django.template import RequestContext, loader

from polls.models import Poll

def index(request):
    latest_poll_list = Poll.objects.order_by('-pub_date')[:5]
    template = loader.get_template('polls/index.html')
    context = RequestContext(request, {
        'latest_poll_list': latest_poll_list,
    })
    return HttpResponse(template.render(context))
context就是把模板变量映射到python对象的字典。在模板里通过{%  %}把python代码扩起来。

可以把上面那段代码通过from django.shortcuts import render 简化成一行: return render(request, 'polls/index.html', context)

|

2014年1月16日星期四

iOS笔记:CocoaPods

吐槽一下:类似Maven、Gradle,当然更像gradle, 很怀疑maven是学院派的人主导的产品(一堆xml让谁看啊?!),gradle才有搞工程人的实际品质。

安装CocoaPods需要有:
1)Ruby 环境。下面的命令更新Ruby环境。
sudo gem update --system
2) Command Line Tools for Xcode

安装CocoaPod:
sudo gem install cocoapods
pod setup
执行sudo gem install cocoapods时会提示:
rake's executable "rake" conflicts with /usr/bin/rake
Overwrite the executable? [yN]  y
Successfully installed rake-10.1.1
选择y覆盖,否则需要设置user的环境变量。Ref: http://guides.cocoapods.org/using/getting-started.html

创建Podfile:
open -e Podfile
platform :iOS
pod ‘AFNetWorking’, ‘0.9'


运行pod install, 抓取Podfile里指定的库到本地。
pod install

用xcode打开pod install生成的workspace文件,而不是原来的project文件。否则会有下面的错误:ld: library not found for -lPods


RubyGems 是什么? 
The RubyGems software allows you to easily download, install, and use ruby software packages on your system. The software package is called a "gem" and contains a package Ruby application or library.

Gems can be used to extend or modify functionality in Ruby applications. Commonly they're used to distribute reusable functionality that is shared with other Rubyists for use in their applications and libraries. Some gems provide command line utilities to help automate tasks and speed up your work.  


尝试Django


已经决定2014在公司自娱的项目,就用python来做了。这些日子熟悉了sublime,Paramiko,tenjin。把一些基本的操作点代码写出来了,如果只是做个命令行的东西,从技术点上该尝试的都已经ok了。

我不喜欢在命令行敲命令去驱动程序,我喜欢在屏幕上输入参数,点击“Run”。。。运行的逻辑在心里,看到的应该只是状态...

下面这篇文章讲了几个python上的web框架,不错。http://feilong.me/2011/01/talk-about-python-web-framework

我选了djiango,应该能省不少事吧。https://www.djangoproject.com/

参考入门教程: https://docs.djangoproject.com/en/1.6/intro/tutorial01/

上面的教程跟当前版本有出入,运行easy_install Sphinx 安装文档生成器。再到Django的doc目录运行命令“make html”来生成HTML文档。


1)创建Djiango Project。
可以把project理解成一个web应用,一个project会包含一些app。
创建一个项目的根目录,运行:“python C:\Python27\Lib\site-packages\django\bin\django-admin.py startproject oesTester”

2)默认的创建出来的project会带有几个app,其中的一些app需要数据库的支持,所以,需要运行“python manage.py syncdb”来在数据库中创建一些表。最后会提示你创建后台管理应用的管理员账号、密码。

3)创建Project里的一个app。
可以把一个app理解成负责某项功能的模块。app的python代码可以在任何python path里。
python C:\Python27\Lib\site-packages\django\bin\django-admin.py startproject oesTester
一个project有多个apps组成。在DJango中model是data class的意思,对应于ORM里的数据模型。
下面的命令创建一个app,名称是"autoInstaller"。
python manage.py startapp autoInstaller

启动Web Server: python manage.py runserver

4) 创建model的步骤略去,因为这个项目第一版不准备使用DB.


5) 访问 ,页面没有加载css,开始一直以为是Django static的配置问题。后来注意到console有“mimetypes.py", line 249, in enum_types”之类的信息,原来这是python2.7的一个bug导致的。
   修改mimetypes.py,注释掉下面这些行
                #try:
                #    ctype = ctype.encode(default_encoding) # omit in 3.x!
                #except UnicodeEncodeError:
                #    pass