LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 5008|回复: 7

从0开始了解Python,Pylons(留坑)

[复制链接]
发表于 2009-12-15 16:50:34 | 显示全部楼层 |阅读模式
原因无他,换工作耳,当是一个入门随笔吧
Day 1


我的工作环境ebian 5+unstable/ KDE4/ Eric4

pylons是一个python的framework,并且支持WSGI(python自己打web服务接口,就是不用安装什么apache啦,这个很有意思),性能方面后面有时间了再去测试.



安装python:
这个没啥好说的啦
  1. apt-get install python
复制代码

安装mysql:
  1. apt-get install mysql-server
复制代码

安装pylons:
按照官网向导安装最简单啦
http://pylonshq.com/docs/en/0.9.7/gettingstarted/

  1. #下载
  2. wget [url]http://www.pylonshq.com/download/0.9.7/go-pylons.py[/url]
  3. #安装,dev为你想要打目录名称,完毕后会生成一个dev目录,自己会把一些必要的系统文件copy进去,独立web服务就类似一个chroot系统,安全性考量很好,而且会自动装好一些必要的模块
  4. python go-pylons.py dev
  5. #激活目录
  6. source dev/bin/activate
  7. #新建一个项目(或者说站点),blog为项目名称
  8. cd dev
  9. paster create -t pylons blog
复制代码

提示你选择一个模板,pylons默认为mako,就先用这个吧
  1. Enter template_engine (mako/genshi/jinja2/etc: Template language) ['mako']:
复制代码


SQLAlchemy的设置,要使用数据库的话就输入True
  1. Enter sqlalchemy (True/False: Include SQLAlchemy 0.5 configuration) [False]:
复制代码

安装数据库需要的(似乎不分大小写),要注意的是mysql-python依赖的是libmysql15
easy_install SQLAlchemy
easy_install mysql-python

#启动WSGI服务
cd blog
paster serve --reload development.ini &
#或者
paster serve --reload --daemon development.ini
默认端口是5000,可以修改development.ini设置WSGI属性,--reload是pylons发现文件更改后会自动重启WSGI服务,启动过程真罗嗦啊


现在打开浏览器访问127.0.0.1:5000,可以看到pylons的欢迎页面了

今天就到这,收工
发表于 2009-12-29 22:07:44 | 显示全部楼层
顶一个。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-2-5 15:04:47 | 显示全部楼层
DAY2(白费力,请跳过此篇)

SqlSoup:

写了一点代码后发现SQLAlchmey非常不习惯,必须手动填写代码创建数据结构,反正我是不大喜欢这种风格:

[PHP]
import sqlalchemy as sa
from sqlalchemy import orm

from myapp.model import meta

def init_model(engine):
    """Call me before using any of the tables or classes in the model"""
    ## Reflected tables must be defined and mapped here
    #global reflected_table
    #reflected_table = sa.Table("Reflected", meta.metadata, autoload=True,
    #                           autoload_with=engine)
    #orm.mapper(Reflected, reflected_table)
    #
    meta.Session.configure(bind=engine)
    meta.engine = engine
#上面的废话pylons帮你建好了,见blog/model/meta.py

#这是一个叫Blog的ORM,对应数据库表是blog
t_blog = sa.Table('blog', meta.metadata,
        sa.Column('blog_id', sa.types.Integer, primary_key=True),
        sa.Column('catid', sa.types.Integer, index=True),
        sa.Column('subject', sa.types.String(150)),
        sa.Column('content', sa.types.Text),
        sa.Column('addtime', sa.types.Integer(11)),
        sa.Column('uptime', sa.types.Integer(11)),
        sa.Column('view', sa.types.Integer(9)),
        sa.Column('comments', sa.types.Integer(9)),
    )
class Tblog(object):
    pass
orm.mapper(Tblog, t_blog);

[/PHP]

参考文档: http://pylonshq.com/docs/en/0.9. ... les-and-orm-classes


大多数人还是喜欢先建好数据库的吧,不过SA还是提供了一个简单的插件,叫做SqlSoup,使用它就可以连接已经存在的数据库作为ORM了,SqlSoup同样也提供Session模式(非存储变量那个Session,主要是用作进程和控制的),不过一个不上集群的落单网站用不用也无所谓啦.另外和PHP的PDO类似,默认是不能同时保留两个Query Result的,这个要注意.

http://www.sqlalchemy.org/docs/05/reference/ext/sqlsoup.html

安装了SA以后SqlSoup就自带了.使用方法:
打开项目中的model/__init__.py文件,加上两行
[PHP]
from sqlalchemy.ext.sqlsoup import SqlSoup
db1 = SqlSoup('mysql://user:password@127.0.0.1:3306/database?charset=utf8')
[/PHP]

需要调用的地方只要调用
[PHP]
from blog(项目名称,这里是blog).model import db1
[/PHP]
就可以了,查询的时候就是db1.blog.all()就可以了,其他查询方法具体请参照官方文档





和nginx的集成:
正式用的时候肯定不会挂在5001端口下了,如果你已经装了别的应用比如PHP这样的,弄一个nginx做个反向代 理吧
debian下先安装nginx:
apt-get install nginx


在/etc/nginx/conf.d目录下新建一个proxy.conf:
proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      300;
proxy_read_timeout      300;
proxy_buffer_size       4k;
proxy_buffers           4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;



编辑/etc/nginx/site-enabled/default,增加以下内容:
server {
        listen   80;
        
        #域名
        server_name  nbx.8800.org;

        location / {
            include /etc/nginx/conf.d/proxy.conf;
            proxy_pass  http://127.0.0.1:5000;
            proxy_redirect  default;

        }
}
回复 支持 反对

使用道具 举报

发表于 2010-2-26 21:21:50 | 显示全部楼层
pylons都让tg2给整合进去了。
自己最近在选,tg呢?web.py呢?web2py呢?
做web应用的。
回复 支持 反对

使用道具 举报

发表于 2010-3-14 12:50:15 | 显示全部楼层
谢谢,我刚开始学
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-3-15 16:22:12 | 显示全部楼层
Post by jobinson99;2071985
pylons都让tg2给整合进去了。
自己最近在选,tg呢?web.py呢?web2py呢?
做web应用的。


外面那层自己弄个反向**就好了吧……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-3-17 19:05:43 | 显示全部楼层
Day 3:
SqlSoup太让人崩溃了……几个连接进程就挂了,算了,咱还是迁移到正统ORM吧,可是一个个字段重新定义太罗嗦了,还有办法不?有!

sqlsoup先别急着删掉,继续用:
[PHP]
    def tables2model(self):
        tables = db1.bind.execute("show tables").fetchall()
        str='<pre>'
        for t in tables:
            str+= '\n'
            str+= "t_%s = schema.Table('%s', meta1, autoload=True)\n"%(t[0], t[0])
            str+= "class %s(object):\n"%(t[0].capitalize())
            str+= "    pass\n"
            
        str+= '\n'
        str+= '\n'
        for t in tables:
            str+= "orm.mapper(%s, t_%s)\n"%(t[0].capitalize(), t[0])
            str+= '\n'
        str+='</pre>'
        return str
[/PHP]


浏览器输出的代码会像这样:
[PHP]
t_schedules = schema.Table('schedules', meta1, autoload=True)
class Schedules(object):
    pass
orm.mapper(Schedules, t_schedules)


t_trailers = schema.Table('trailers', meta1, autoload=True)
class Trailers(object):
    pass
orm.mapper(Trailers, t_trailers)

..............
[/PHP]
上面这些就是你想要的数据结构了,下面我们来设置数据库连接

[PHP]
#引用的裤不一定能用上,不过你可能会在开发中需要到它们
from sqlalchemy import orm, schema, types, create_engine
from sqlalchemy.databases import mysql
from sqlalchemy.sql import insert, update, select


#Database commection settings
#pool_recycle对于mysql数据库比较有用
e1 = create_engine('mysql://user:password@127.0.0.1:3306/db?charset=utf8', pool_recycle=3600, pool_size=5)

meta1 = schema.MetaData()

meta1.bind = e1
sm1 = orm.sessionmaker(bind=e1, autoflush=False, autocommit=True, expire_on_commit=True)
db1 = orm.scoped_session(sm1)

#ORMs
t_ad_logs = schema.Table('ad_logs', meta2, autoload=True)
class Ad_logs(object):
    pass
orm.mapper(Ad_logs, t_ad_logs)


t_log_archives = schema.Table('log_archives', meta2, autoload=True)
class Log_archives(object):
    pass
orm.mapper(Log_archives, t_log_archives)

[/PHP]


由于session必须使用ForeignKey实现join,定义外键可以这样:
[PHP]
#注意声明对象的顺序,否则会报告语法错误
t_roles = schema.Table('roles', meta1, autoload=True)
class Roles(object):
    pass

t_users = schema.Table('users', meta1,
                       schema.ForeignKeyConstraint(['role'], ['roles.id']),
                       autoload=True)
class Users(object):
    pass

orm.mapper(Roles, t_roles)
orm.mapper(Users, t_users, properties={
    'Role': orm.relation(Roles)
})
[/PHP]
回复 支持 反对

使用道具 举报

发表于 2010-7-13 13:48:36 | 显示全部楼层
目前我用的是django,也想看看pylons这个框架
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表