月度归档:2012年01月

Running Pylons with NGINX

从网上找到一篇介绍pylons和nginx的文章,里面写到只要nginx.conf中加入如下信息就行了:

location / {
            include /usr/local/nginx/conf/proxy.conf;
            proxy_pass  http://127.0.0.1:8080;
            proxy_redirect  default;
        }
当然在实际情况中,要根据环境信息进行相应的修改,
比如现在一般用uwsgi,在FreeBSD9里路径也不同,因此那句要改成:
include /usr/local/etc/nginx/uwsgi_params;
我是用单独一台服务器起服务,用另一台机器做客户端测试,因此在pylons配置中使用的是私网ip,因此第二句改成:
proxy_pass  http://192.168.1.6:5000;
测试了一下,很好很强大!

	

python函数参数的传递(参数带星号的说明) zt

python中函数参数的传递是通过赋值来传递的。函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析
先看第一个问题,在python中函数参数的定义主要有四种方式:
1.F(arg1,arg2,…)
这 是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等的 值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参。例 如:
def a(x,y):
print x,y
调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错。

2.F(arg1,arg2=value2,…)
这种方式就是第一种的改进版,提供了默认值
def a(x,y=3):
print x,y
调用该函数,a(1,2)同样还是x取1,y取2,但是如果a(1),则不会报错了,这个时候x还是1,y则为默认的3。上面这俩种方式,还可以更换参数位置,比如a(y=8,x=3)用这种形式也是可以的。

3.F(*arg1)
上 面俩个方式是有多少个形参,就传进去多少个实参,但有时候会不确定有多少个参数,则此时第三种方式就比较有用,它以一个*加上形参名的方式来表示这个函数 的实参个数不定,可能为0个也可能为n个。注意一点是,不管有多少个,在函数内部都被存放在以形参名为标识符的tuple中。
>>> def a(*x):
if len(x)==0:
print ‘None’
else:
print x
>>> a(1)
(1,) #存放在元组中
>>> a()
None
>>> a(1,2,3)
(1, 2, 3)
>>> a(m=1,y=2,z=3)
Traceback (most recent call last):
File ” “, line 1, in -toplevel-
a(m=1,y=2,z=3)
TypeError: a() got an unexpected keyword argument ‘m’

4.F(**arg1)
形参名前加俩个*表示,参数在函数内部将被存放在以形式名为标识符的dictionary中,这时调用函数的方法则需要采用arg1=value1,arg2=value2这样的形式。
>>> def a(**x):
if len(x)==0:
print ‘None’
else:
print x
>>> a()
None
>>> a(x=1,y=2)
{‘y': 2, ‘x': 1} #存放在字典中
>>> a(1,2) #这种调用则报错
Traceback (most recent call last):
File ” “, line 1, in -toplevel-
a(1,2)
TypeError: a() takes exactly 0 arguments (2 given)

上面介绍了四种定义方式,接下来看函数参数在调用过程中是怎么被解析的,其实只要记住上面这四种方法优先级依次降低,先1,后2,再3,最后4,也就是先把方式1中的arg解析,然后解析方式2中的arg=value,再解析方式3,即是把多出来的arg这种形式的实参组成个tuple传进去,最后把剩下的key=value这种形式的实参组成一个dictionary传给带俩个星号的形参,也就方式4。
>>> def test(x,y=1,*a,**b):
print x,y,a,b

>>> test(1)
1 1 () {}
>>> test(1,2)
1 2 () {}
>>> test(1,2,3)
1 2 (3,) {}
>>> test(1,2,3,4)
1 2 (3, 4) {}
>>> test(x=1,y=2)
1 2 () {}
>>> test(1,a=2)
1 1 () {‘a': 2}
>>> test(1,2,3,a=4)
1 2 (3,) {‘a': 4}
>>> test(1,2,3,y=4)
Traceback (most recent call last):
File ” “, line 1, in -toplevel-
test(1,2,3,y=4)
TypeError: test() got multiple values for keyword argument ‘y’

 

另外自己看帮助文档中的例子:

def parrot(voltage, state=’a stiff’, action=’voom’):
print “– This parrot wouldn’t”, action,
print “if you put”, voltage, “volts through it.”,
print “E’s”, state, “!”

d = {“voltage”: “four million”, “state”: “bleedin’ demised”, “action”: “VOOM”}

>>> parrot(**d)

— This parrot wouldn’t VOOM if you put four million volts through it. E’s bleedin’ demised !

python 函数参数的传递(参数带星号的说明) zt

python中函数参数的传递是通过赋值来传递的。函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析
先看第一个问题,在python中函数参数的定义主要有四种方式:
1.F(arg1,arg2,…)
这 是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等的 值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参。例 如:
def a(x,y):
print x,y
调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错。

2.F(arg1,arg2=value2,…)
这种方式就是第一种的改进版,提供了默认值
def a(x,y=3):
print x,y
调用该函数,a(1,2)同样还是x取1,y取2,但是如果a(1),则不会报错了,这个时候x还是1,y则为默认的3。上面这俩种方式,还可以更换参数位置,比如a(y=8,x=3)用这种形式也是可以的。

3.F(*arg1)
上 面俩个方式是有多少个形参,就传进去多少个实参,但有时候会不确定有多少个参数,则此时第三种方式就比较有用,它以一个*加上形参名的方式来表示这个函数 的实参个数不定,可能为0个也可能为n个。注意一点是,不管有多少个,在函数内部都被存放在以形参名为标识符的tuple中。
>>> def a(*x):
if len(x)==0:
print ‘None’
else:
print x
>>> a(1)
(1,) #存放在元组中
>>> a()
None
>>> a(1,2,3)
(1, 2, 3)
>>> a(m=1,y=2,z=3)
Traceback (most recent call last):
File ” “, line 1, in -toplevel-
a(m=1,y=2,z=3)
TypeError: a() got an unexpected keyword argument ‘m’

4.F(**arg1)
形参名前加俩个*表示,参数在函数内部将被存放在以形式名为标识符的dictionary中,这时调用函数的方法则需要采用arg1=value1,arg2=value2这样的形式。
>>> def a(**x):
if len(x)==0:
print ‘None’
else:
print x
>>> a()
None
>>> a(x=1,y=2)
{‘y': 2, ‘x': 1} #存放在字典中
>>> a(1,2) #这种调用则报错
Traceback (most recent call last):
File ” “, line 1, in -toplevel-
a(1,2)
TypeError: a() takes exactly 0 arguments (2 given)

上面介绍了四种定义方式,接下来看函数参数在调用过程中是怎么被解析的,其实只要记住上面这四种方法优先级依次降低,先1,后2,再3,最后4,也就是先把方式1中的arg解析,然后解析方式2中的arg=value,再解析方式3,即是把多出来的arg这种形式的实参组成个tuple传进去,最后把剩下的key=value这种形式的实参组成一个dictionary传给带俩个星号的形参,也就方式4。
>>> def test(x,y=1,*a,**b):
print x,y,a,b

>>> test(1)
1 1 () {}
>>> test(1,2)
1 2 () {}
>>> test(1,2,3)
1 2 (3,) {}
>>> test(1,2,3,4)
1 2 (3, 4) {}
>>> test(x=1,y=2)
1 2 () {}
>>> test(1,a=2)
1 1 () {‘a': 2}
>>> test(1,2,3,a=4)
1 2 (3,) {‘a': 4}
>>> test(1,2,3,y=4)
Traceback (most recent call last):
File ” “, line 1, in -toplevel-
test(1,2,3,y=4)
TypeError: test() got multiple values for keyword argument ‘y’

 

另外自己看帮助文档中的例子:

def parrot(voltage, state=’a stiff’, action=’voom’):
print “– This parrot wouldn’t”, action,
print “if you put”, voltage, “volts through it.”,
print “E’s”, state, “!”

d = {“voltage”: “four million”, “state”: “bleedin’ demised”, “action”: “VOOM”}

>>> parrot(**d)

— This parrot wouldn’t VOOM if you put four million volts through it. E’s bleedin’ demised !

FreeBSD安装Xorg黑屏

是彻底的黑屏,尽管caplock等键灯还是响应,但是除了ctrl-alt-del键外,其它的看不出来有什么反映,尤其是不能切换控制台以及ctrl-c终止,每次我都是按ctrl-alt-dle重启机器。

看到网上有朋友讲了解决的方法,明天试试:

这个问题在这里早就有人解决过,
需要在xorg.conf.new的Section “ServerLayout”中添加
Option          “AutoAddDevices” “false”
来禁止这个功能。然后在Xorg -config ~/xorg.conf.new -retro

1.19 今天将那句Option加入,故障依旧。

制作FreeBSD的usb启动盘

FreeBSD手册中讲的很仔细,为了方便以后的资料调取,这里特定存档。

制作步骤:

1 先从网上下载memstick.img文件,最新的9.0的地址是:

ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/ISO-IMAGES/9.0/FreeBSD-9.0-RELEASE-i386-memstick.img.

2 从网上下载Image Writer for Windows,这样图形界面的软件在windows下更易使用。直接将img映像文件写入u盘;如果是在freebsd下,直接用dd写入就行了。

这个启动盘就做好了,据我试用,这个盘应该是还可以再编辑,比如安装其它软件的,具体等以后试验了。

http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/install-pre.html

To create a bootable memory stick, follow these steps:

  1. Acquire the Memory Stick ImageThe memory stick image can be downloaded from the ISO-IMAGES/ directory fromftp://ftp.FreeBSD.org/pub/FreeBSD/releases/arch/ISO-IMAGES/version/FreeBSD-version-RELEASE-arch-memstick.img. Replace arch andversion with the architecture and the version number which you want to install, respectively. For example, the memory stick images for FreeBSD/i386 9.0-RELEASE are available from ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/ISO-IMAGES/9.0/FreeBSD-9.0-RELEASE-i386-memstick.img.The memory stick image has a .img extension. The ISO-IMAGES/ directory contains a number of different images, and the one you will need to use will depend on the version of FreeBSD you are installing, and in some cases, the hardware you are installing to.

    Important: Before proceeding, back up the data you currently have on your USB stick, as this procedure will erase it.

  2. Write The Image File to the Memory Stick

    Using FreeBSD To Write the Image

    Warning: The example below lists /dev/da0 as the target device where the image will be written. Be very careful that you have the correct device as the output target, or you may destroy your existing data.

    1. Writing the Image with dd(1)The .img file is not a regular file you copy to the memory stick. It is an image of the complete contents of the disk. This means that you cannot simply copy files from one disk to another. Instead, you must usedd(1) to write the image directly to the disk:
      # dd if=FreeBSD-9.0-RELEASE-i386-memstick.img of=/dev/da0 bs=64k

      If an Operation not permitted error is displayed, make certain that the target device is not in use, mounted, or being automounted by some well-intentioned utility program. Then try again.

    Using Windows® To Write the Image

    Warning: Make sure you use the correct drive letter as the output target, or you may overwrite and destroy existing data.

    1. Obtaining Image Writer for WindowsImage Writer for Windows is a free application that can correctly write an image file to a memory stick. Download it from https://launchpad.net/win32-image-writer/ and extract it into a folder.
    2. Writing The Image with Image WriterDouble-click the Win32DiskImager icon to start the program. Verify that the drive letter shown underDevice is the drive with the memory stick. Click the folder icon and select the image to be written to the memory stick. Click Save to accept the image file name. Verify that everything is correct, and that no folders on the memory stick are open in other windows. Finally, click Write to write the image file to the drive.

Pylons的controller

参照手册中的介绍,创建一个hello world程序。注意在
class HelloController(BaseController) 中定义的
def index(self): 就是hello/index 路径对应的,也就是如果网址是hello/test ,那么只要在里面 def test(self) 就行了。
http://docs.pylonsproject.org/projects/pylons-webframework/en/latest/gettingstarted.html#creating-a-pylons-project

Hello World

To create the basic hello world application, first create a controller in the project to handle requests:

$ paster controller hello

Open the helloworld/controllers/hello.py module that was created. The default controller will return just the string ‘Hello World’:

import logging

from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from helloworld.lib.base import BaseController, render

log = logging.getLogger(__name__)

class HelloController(BaseController):

    def index(self):
        # Return a rendered template
        #return render('/hello.mako')
        # or, Return a response
        return 'Hello World'

At the top of the module, some commonly used objects are imported automatically.

Navigate to http://127.0.0.1:5000/hello/index where there should be a short text string saying “Hello World” (start up the app if needed):

Pylons 的controller

参照手册中的介绍,创建一个hello world程序。注意在
class HelloController(BaseController) 中定义的
def index(self): 就是hello/index 路径对应的,也就是如果网址是hello/test ,那么只要在里面 def test(self) 就行了。
http://docs.pylonsproject.org/projects/pylons-webframework/en/latest/gettingstarted.html#creating-a-pylons-project

Hello World

To create the basic hello world application, first create a controller in the project to handle requests:

$ paster controller hello

Open the helloworld/controllers/hello.py module that was created. The default controller will return just the string ‘Hello World’:

import logging

from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from helloworld.lib.base import BaseController, render

log = logging.getLogger(__name__)

class HelloController(BaseController):

    def index(self):
        # Return a rendered template
        #return render('/hello.mako')
        # or, Return a response
        return 'Hello World'

At the top of the module, some commonly used objects are imported automatically.

Navigate to http://127.0.0.1:5000/hello/index where there should be a short text string saying “Hello World” (start up the app if needed):

Python框架Pylons学习笔记

如果只是简单的安装,那过程很简单:

1 安装python

2 安装easyinstall(setuptools)

3 使用easyinstall 安装 pylons

4 安装Pylons完成后,创建测试项目(paster create -t pylons helloworld)

但是实际安装中,为了使用virtualenv ,会增加很多变数。Virtualenv我是按照手册中(source mydevenv/bin/activate),但是activate不成功,总是提示:Badly placed ()’s ,暂时还没从网上找到原因。现在我的解决方法就是手工到env目录中,手工activate它:env/bin/python env/bin/activate_this.py

使用virtualenv的pylons安装过程是:

1 安装python

2 安装setuptools

3 创建虚拟路径:virtualenv env ,然后激活它:env/bin/python env/bin/activate_this.py

4  在虚拟机中安装pylons等模块:env/bin/easyinstall pylons

5 安装Pylons完成后,创建测试项目(env/bin/paster create -t pylons helloworld)。按理说前面已经激活虚拟机,因此这里应该可以直接paster的,这个有待继续验证。

3.5日补充:

activate不成功的原因,是因为那个activate(source mydevenv/bin/activate)不支持csh,我晕。

8.19日补充:

启动pylons框架:

paster serve --reload development.ini