一个很好的例子:

许多新手,特别是从 ASP/PHP/JSP 转过来的同学,经常问下面这几个问题:

  • 所有东西都放在一个 code.py 中呀?我有好多东西该如何部署我的代码?
  • 是不是 /index 对应访问目录下的 /index.py?
  • 我想要PHP中的那个 include,在模板该怎么实现?
  • 我输出的内容为什么是纯文本的?我输入的是 Html,原样输出了哦。

嗯,我很理解,我当初也一样遇到,原因是我们对 Python 的基础工作原理不熟悉。Python 中有一个包机制,也就是说 code.py 中的东西都可以独立出来,做为一个模块或一个包存在,你需要什么就导入什么。例如 url 的配置,你可以独立成一个 url.py 的文件,这样你把 url 配置写在这里,在 code.py 中导入即可。

不是 /index 对应访问 /index.py 的,在 web.py 中,是对应后面的类。在 web.py 中,绝大部分是没有写死的,只有 GET 和 POST 是写死的。

工作文件目录看起来是如何的?

这是我的文件结构,不代表其他同学。

|-- code.py
|-- config/
|   |-- __init__.py
|   |-- settings.py
|   `-- url.py
|-- controllers/
|   |-- __init__.py
|   `-- todo.py
|-- static/
|   |-- images/
|   `-- styles/
|       |-- index/
|       |   |-- images/
|       |   |   `-- website.png
|       |   `-- style.css
|       `-- reset.css
`-- templates/
    |-- error.html
    |-- foot.html
    |-- header.html
    |-- index.html
    `-- todo/
        `-- edit.html

# 使用 Ulipad 的 目录树打印 功能输出。

他们如何工作?

code.py 主要用于启动,绝大部分时候它是没有用的。

/static 这个是静态文件目录,在内置的开发服务器上不可以修改,如果你使用其他 web server 来配置的是可以改的。

/controllers 控制层的代码,或者实际工作的代码就在这里。

__init__.py 这是用来做什么的?看起来像初始化?嗯… 如果你希望某个目录可以被引用,加上这个一样空白文件就好了,表示当前是一个模块可以被引用。这是给新手做的说明。

/config 一些常用配置,我把 url 的配置独立出来了,因为项目做大了,url 很长。

我取消了 model 层,不要问我为什么,这是一个很纠结的话题,如果你需要,你可以独立出一个 model 层。

其他的应该不用解释了。

简单说一下 url 的配置

pre_fix = 'controllers.'

urls = (
    '/',                    pre_fix + 'todo.Index',
    '/todo/new',            pre_fix + 'todo.New',
    '/todo/(\d+)',          pre_fix + 'todo.View',
    '/todo/(\d+)/edit',     pre_fix + 'todo.Edit',
    '/todo/(\d+)/delete',   pre_fix + 'todo.Delete',

)

原理前面说过了,前面的访问地址对应后面的方法路径。好多重复的字符串,所以我就把前面的弄成一个变量了。

大部分时候简单的正则可以适用你的常规应用了,数字用 (\d+),字符串用 (.*) 。

新手科普

#!/usr/bin/env python
# coding: utf-8

程序文件中请确保有这两行开头,你读过简明教程,对吧?你应该懂的。第一行表示在 *nix 下面,使用 python 来解释当前程序;第二行表示当前文件编码为 utf-8。

程序老是报编码错误

数据库、程序文件等,请全部使用 utf-8 编码。

经常遇到程序编码错误?web.py 内部默认使用 unicode,经过 web.py 处理过的都是 unicode,所以你如果有中文,尝试转为 unicode,比如 a = u'中文啊'。大部分情况下可能解决。

开发服务器加载CSS文件非常慢

请统一换行符,即文件格式问题,全部使用 Unix 风格的换行符。可能是你的 CSS 是 win 格式的编码,请改为 Unix 编码。

关于 static 静态文件目录

默认 webserver 开发模式下,不可改名,不可改路径。你要是拖了自己的其他  webserver,那你自己另外配,当然可以是任何名字。

类似 PHP 中的 include 引用在模板中如何实现?

把 render 做为全局变量放到模板中去,然后 $:render.header() 这样。同样本示例源码中也使用了该方式,而没有使用 layout 方式,该方式看官方文档。

$news.content 纯文本输出了啊?

这样 $:news.content

关于 web.input()

i = web.input() # get,post 提交的数据通收。

title = i.get('title', None) 这是什么意思?

从 i 中取 title,如果没有取到则将 title 赋值 None。不然,你直接 title = i.title 如果前面的表单中没有这一项会报错。

关于 db.select 返回的是列表

a = db.select(tb, where='id=$id', vars=locals())  # id 为自增的那个主键

select 返回的是一个列表,因此要 a[0] 取到第 1 条。不过你有经验的话,接下去仍然要判断下:

if not a:
    return '没有找到结果…'
return a[0]

QA 得差不多了,请阅读源代码,web.py 中文教程

读代码最实际,对吧?项目主页:

Google Code: http://code.google.com/p/simple-todo/

Bitbucket.org https://bitbucket.org/qichangxing/simple-todo

数据文件在 /static/sql 下面,请自行导入,默认使用了 mysql,需要可以修改成其他数据库,在/config/settings.py 中修改配置。

请放心,源码是可以直接工作的,可以直接在目录下 code.py 即可。其中用到了你经常用的常识,期望有了这个之后你可以轻松地开始 web.py 学习和应用之旅。那么马上开始吧:

E:\web\test\todo>code.py
http://0.0.0.0:8080/

使用 http://127.0.0.1:8080 访问。

如果想使用 80 端口访问,则可以直接加 80 端口号:

E:\web\test\todo>code.py 80

更新:

    • 2011.6.26:功能升级,对于当条 todo 增加完成功能,且把完成的放到最后。
    • 2013.4.3:使用 Nginx + uwsgi 运行本程序
    • 2013.7.16:增加关于 static 文件目录的说明,增加80端口的使用说明

转自:

http://chenxiaoyu.org/2010/03/19/webpy-database-tutorial.html

web.py simpletodo 例子的更多相关文章

  1. web.py模版系统

    介绍: 调用的web.py模版语言Templetor旨在将python的强大功能带入模版.它不是为模板创建新语法,而是重用python语法. Templetor故意限制模版中的变量访问.用户可以访问传 ...

  2. web.py学习心得

    1.注意判断数字时,如果是get传递的参数,一定要用int转换.不然出错. 2.$var 定义时,冒号后的内容不是python内容,需加上$符号.如$var naviId:$naviId. 3.各个模 ...

  3. python web.py安装使用

    官方首页:http://webpy.org/) 它的源代码非常整洁精干,学习它一方面可以让我们快速了解python语法(遇到看不懂的语法就去google),另一方面可以学习到python高级特性的使用 ...

  4. (转)Nginx + uwsgi + web.py + MySQLdb

    一.背景知识: Web服务器上有多种方式运行Python: 传统上的CGI方式:基本已被淘汰 mod_python的模块方式:仍在广泛使用,但生产环境中也被逐步淘汰 uwsgi方式:目前生产环境下最受 ...

  5. Web.py 框架学习笔记 - URL处理

    最近由于工作需要开始学习基于python的web应用框架web.py.为了方便学习,将学习心得逐日记下以便日后复习. URL 模板: web.py提供了一套url处理的模板,在python工程中,只需 ...

  6. web.py框架之高级应用

    二.高级应用 2.1 web.ctx 获取客户端信息,比如:来源页面.客户端浏览器类型等. web.ctx基于 threadeddict类,又被叫做 ThreadDict.这个类创建了一个类似字典(d ...

  7. web.py框架之基本应用

    一.基本应用 1.1 Hello World! # coding:utf-8 import web urls = ( "/.*", "Tk_online" ) ...

  8. 【Python】【Web.py】详细解读Python的web.py框架下的application.py模块

    详细解读Python的web.py框架下的application.py模块   这篇文章主要介绍了Python的web.py框架下的application.py模块,作者深入分析了web.py的源码, ...

  9. 【Python】web.py初识学习

    简单而直接的Python web 框架:web.py 2016年11月03日 14:09:08 擒贼先擒王 阅读数:35157更多 个人分类: Web   From:https://www.oschi ...

随机推荐

  1. js原型继承

    原型链: Object(构造函数) object(类型(对象)) var o = {}; alert(typeof o); //结果是object alert(typeof Object); //结果 ...

  2. switch-case参数类型

    switch语句用法: 0. switch语句由一个控制表达式和多个case标签组成 1. switch控制表达式支持的类型有byte.short.char.int.enum(JDK5).String ...

  3. [转]C#中yield用法

    yield 关键字向编译器指示它所在的方法是迭代器块.编译器生成一个类来实现迭代器块中表示的行为.在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值.这是一个返回值, ...

  4. 用户输出表单处理php

    php中的表单输入处理,我用两个文件,在linux输出: touch php_post1.html php_post1.php php_post1.html代码如下: <!doctype htm ...

  5. sql语句中like的使用

    先看一道题: 写出一条sql语句,找出表B中 字段Value中不全是字母 数字 下划线的数据 初看这道题,我们想到可以用like去进行模糊匹配,找出想要的结果.但是有一个地方需要注意:如果想在SQL ...

  6. Android手机修改Hosts的方法

    Android手机是和Google帐号紧密联系的,由于中国的操蛋情况,很多时候Google帐号无法登录,导致Android市场无法使用. 在电脑上我们通过修改Hosts方法可以解决Google帐号的登 ...

  7. jQuery 获取并设置 CSS 类

    通过 jQuery,可以很容易地对 CSS 元素进行操作. 切换 CSS 类 jQuery 操作 CSS jQuery 拥有若干进行 CSS 操作的方法.我们将学习下面这些: addClass() - ...

  8. javaScript 删除数组中指定元素

    Array.prototype.indexOf = function(val) { for (var i = 0; i < this.length; i++) { if (this[i] == ...

  9. SGU 144.Meeting

    题目: 两支地区ACM比赛的队伍决定为了国际决赛而在一起集训. 他们约定在某天的 X 时到 Y 时的某一时刻相会. 但由于他们很少按时到 (有的队伍比赛那天都会迟到), 他们没有设定一个确切的相遇时间 ...

  10. 读书笔记之 - javascript 设计模式 - 单体模式

    单体是一个用来划分命名空间,并将一批相关方法和属性组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次. 单体模式,就是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变量进行访问 ...