Bottle 快速入门


- 1 - bottlebottlebottlebottle 快 速入 门 1111、先从hello hello hello hello 开 始代 码: #-*- coding: utf-8 -*- from bottle import route,run #加 载模 块 @route('/hello') #映 射地 址 def hello(): #地 址内 容的 发布 return "hello world" run(host='localhost',port=8080) #运行 从 这个 框架 来看 ,我 们只 需要 两个 函数 route 和run。route 建 立地 址映 射表 , run 解 析地 址。 我 们只 需要 定义 一些 route 对 应的 地址 名称 相对 应的 函数 就可 以了 。 似 乎这 些就 是 bottle 的 全部 。 需 要特 别说 明的 是想 要显 示中 文只 需要 开头 加上 #-*- coding: utf-8 -*- 并 将文 件保 存为 utf-8编 码形 式即 可。 2222、HTMLHTMLHTMLHTML?BottleBottleBottleBottle?CGICGICGICGI? 下 面再 看一 个例 子: #-*- coding: utf-8 -*- from bottle import route,run #加 载模 块 shtml=''' my test

WELCOME !

''' @route('/hello') #映 射地 址 def hello(): #地 址内 容的 发布 return shtml run(host='localhost',port=8080) #运行 用过cgi 的 朋友 可能 会觉 得这 个貌 似很 简单 啊 。直 接将 html 文 件保 存在 一个 字符 下 ,一 切都 可以 搞定 。 我 想应 该是 的 。问 题在 于这 是对 于静 态 web 页 是可 以的 ,(还 要有 一个 限制 ,就 是没 有 css 等 等之 类的 其 他语 言 ,一 个纯 的 html 文 本可 以这 么干 )。但 是感 觉这 样做 还是 不是 很好 。也 许我 们可 以使 用 bottle 提 供的 模板 。 - 2 - 3333、模板 Bottle 的 模板 是一 个后 缀为 tpl 的 文件 。比 如以 上我 们在 shtml 中 给出 的 HTML 语 言可 以用 下面 的方 式 给 出, 保存 在 t1.tpl 下。 my test

WELCOME !

以 上的 代码 可以 改为 : #-*- coding: utf-8 -*- from bottle import route,run ,template#加 载模 块 @route('/hello') #映 射地 址 def hello(): #地 址内 容的 发布 return template('t1') run(host='localhost',port=8080) #运行 显 示结 果为 : 4444、在 模板 中引 用静 态文 件 Css 和images 不 会自 动识 别, 必须 同 route 和 控制 回调 才可 以找 到他 们 fromfromfromfrom bottlebottlebottlebottle importimportimportimport static_file @route@route@route@route('/static/:filename') defdefdefdef server_static(filename): returnreturnreturnreturn static_file(filename, root='/path/to/your/static/files') 例 子: 我 们给 出一 个模 板文 件 t1.tpl. - 3 - bottle 点滴 Body 的 背景 色彩

段 落的 色彩

大 写的 背景 色

index.css: body{background-color:red} p{background-color:green} h1{background-color:blue} hello.py: from bottle import template,run,route,static_file import os dirname=os.getcwd() @route('/static/:filename') def sendingstaticfile(filename): return static_file(filename,root=dirname+'/static') @route('/hello') def hello(): return template('t1') 显 示结 果为 : 5555、交互 进 一步 的交 互, get 和post。 例1、 (1)模 板给 出界 面, t1.tpl post and get
- 4 -
这 里给 了两 个输 入, name 和password。 下面 的代 码演 示了 如何 对他 们进 行处 理 。(ex1.py) #-*- coding: utf-8 -*- from bottle import get, post, request,run,template def check_login(name,password):#定 义一 个检 验密 码是 否正 确的 小函 数, 密码 设置 为 1234. if str(1234)==str(password): return True else: return False #@route('/login') # 默 认就 是 GET 方式 @get('/login') # 也 可以 使用 get()函数 def login_form(): return template('t1') #@route('/login', method='POST') # 使用method 参 数指 定 @post('/login') # 或 者直 接使 用 post()函数 def login_submit(): name = request.forms.get('name') password = request.forms.get('password') if check_login(name, password): return "

WELCOME %s!Your login was correct

"%name else: #这 里可 以看 出, 可以 完全 像在 python 中 处理 字符 串一 样处 理 bottle 内 的东 西 return "

Login failed,you may give a wrong name:%s

"%name run() 这 段代 码包 含两 部分 ,第 一部 分为 get, 就是 得到 客户 端输 入的 信息 。第 二部 分是 post, 即处 理应 答 。 运 行结 果: 或 者输 入错 误的 密码 : - 5 - 6666、简 单的 数据 处理 实 在是 懒得 学习 什么 xml 之 类的 。也 许 txt 也 不错 。 (a) 建立 一个 字典 dict, 来对 应文 件文 本。 一 篇文 章放 在一 个 txt 文 本里 。自 动以 标题 命名 。通 过字 典来 读取 或者 查询 。 (b)手 动建 立文 章 ,并 对应 的建 立一 个回 复文 本 。标 号与 文章 标号 一致 。这 样来 取代 数据 库 。建 立留 言 簿等 。 (c) 自己 建立 一个 小型 数据 类型 ,来 匹配 回复 文本 。 (d) 以这 个进 度下 去会 有一 个新 的 xml 呵 呵。 先 建立 一个 用文 本来 存储 用户 信息 的登 录程 序。 Ti.py
登陆

id:

密码:

data.zh 数 据: zhang 1234 wu 4321 Login.py #-*- coding: utf-8 -*- from bottle import get, post, request,run,template,static_file,route import os dirname=os.getcwd() def getuser(filename): file=open(dirname+'/data/'+filename,'r') useinfo=[_.split('\t') for _ in (file.read()).split('\n')] userdict={} for item in useinfo: userdict[item[0]]=item[1] return userdict userdict=getuser('data.zh') def check_login(name,password):#定 义一 个检 验密 码是 否正 确的 小函 数, 密码 设置 为 1234. try : if userdict[name]==str(password): return 1 else: return 2 except: return 3 - 6 - #@route('/login') # 默 认就 是 GET 方式 @get('/login') # 也 可以 使用 get()函数 def login_form(): return template('t1') #@route('/login', method='POST') # 使用method 参 数指 定 @post('/login') # 或 者直 接使 用 post()函数 def login_submit(): name = request.forms.get('user_id') password = request.forms.get('password') result=check_login(name, str(password)) if result==1: return "

%s!你 好, 欢迎 登陆

"%name elif result==2 : #这 里可 以看 出, 可以 完全 像在 python 中 处理 字符 串一 样处 理 bottle 内 的东 西 return "

登 陆失 败, 请重 新检 查你 的密 码 :%s

"%name else : return "

没 有这 个用 户名 %s

"%name run() 运 行结 果: 这 次密 码正 确: 换 一个 密码 错误 的 - 7 - 换 一个 用户 名错 误的 : 不 考虑 安全 性, bottle 的 使用 真的 很简 单, 可以 像在 python 里 使用 一样 的方 便 7777、留 言薄 基于 txttxttxttxt 我在csdn 里 发了 一个 很简 单的 留言 板 ,那 个是 用 sqlite3 来 完成 的 。现 在我 们使 用 txt 来 做一 个简 单 的 notebook。 先 来设 计一 下我 们的 界面 : 也 许就 是这 么个 简单 的留 言界 面。 在 这个 程序 里, 我们 会用 到静 态文 件的 加载 , txt 作 为数 据库 的使 用, 模板 。一 个小 组合 哈。 先 设计 一下 我们 的 txt 小 数据 库吧 ! 每 一天 我们 用什 么来 分割 呢? 向 xml 学 习用 怎 么样 呵呵 ,用 分 割用 户名 和内 容。 开始 我 们也 许是 这样 的 datanote.txt 人 间道 我 喜欢 用 txt 做 数据 库 天 涯海 角 原 始点 好, 简单 ,我 也喜 欢 运 行一 下下 面的 代码 : fp=open('./data/notedata.txt','r') s=fp.read() s1=s.split('' s2=s1.split('') print s2[0]+'\n\+s2[1] 结 果是 : - 8 - 提 取没 什么 问题 。 写 入呢 ? 从 整个 过程 来看 ,也 许我 们需 要对 我们 的文 件做 一个 类, 来专 门处 理这 个问 题。 以 下是 完整 代码 : notebook.py #-*- coding: utf-8 -*- from bottle import get, post, request,run,template,static_file,route import bottle from bottle import error import os bottle.debug(True) @error(500) def proc_error( error ): return error.traceback dirname=os.getcwd() def getold(filename): file=open(dirname+'/data/'+filename,'r') s=file.read() s1=s.split('') file.close() useinfo=[i.split('') for i in s1] oldst="" for item in useinfo: for it1 in item: oldst=oldst+it1 oldst=oldst+'''

''' return oldst def update(filename,str1): file=open(dirname+'/data/'+filename,'r') s1=file.read() file.close() file=open(dirname+'/data/'+filename,'w+') file.writelines(s1+str1) file.close() #@route('/login') # 默 认就 是 GET 方式 @get('/note') # 也 可以 使用 get()函数 def login_form(): return template('t1',old=getold('notedata.txt')) #@route('/login', method='POST') # 使用method 参 数指 定 - 9 - @post('/note') # 或 者直 接使 用 post()函数 def login_submit(): usernote1 = request.forms.get('notebody') name=request.forms.get('user_id') str1=''''''+name+':'+''''''+usernote1+'\n' update('notedata.txt',str1) str1='' return template('t1',old=getold('notedata.txt')) run() 模 板文 件: t1.tpl 留 言薄 留 言薄 - 10 - 这 是一 个小 的留 言薄 ,数 据库 是用 txt 来 进行 的。
以 往记 录
{{!old}}
输 入窗 口:
称昵:
这 里注 意: 只 要返 回的 是一 个字 符串 或是 一个 字符 串表 示, 花括 号中 的任 何 Python 语 句都 是被 允许 的。 >>> template('你好{{name}}!', name = '世界') u'你 好世 界! ' >>> template('你好{{name.title() if name else "陌 生人 "}}!', name = None) u'你 好陌 生人 ! ' >>> template('你好{{name.title() if name else "陌 生人 "}}!', name = 'mArC') u'你好Marc!' 被 包含 的 Python 语 句在 渲染 时间 被执 行, 并且 可以 访问 传递 给 SimpleTemplate.render() 方 法的 所有 关键字参数。HTML 特殊字符被自动地转义,以避免XSS 攻击(跨站脚本攻击)。你可以以一个感 叹 号( !) 开始 一个 语句 ,以 禁用 对该 语句 的转 义: >>> template('你好{{name}}!', name = '〈b〉 世界 〈 /b〉') u'你 好& lt;b>世 界& lt;/b>!' >>> template('你好{{!name}}!', name = '〈b〉 世界 〈 /b〉') u'你 好〈 b〉 世界 〈 /b〉!' 然 后再 你的 文件 夹下 建立 一个 新的 文件 夹比 如 data 文 件夹 ,里 面新 建一 个 txt 文 件用 以保 存留 言的 信 息 。我 这里 用的 是 notedata.txt. 运 行界 面如 下: - 11 - 到 目前 为止 ,我 们做 了几 件事 , css 文 件调 用, 用户 登录 ,留 言薄 .还 需要 什么 呢? 作 为最 简单 的互 动的 信息 ,我 想已 经基 本上 够了 。我 们不 谈那 些大 量数 据交 换所 带来 的问 题。 只考 虑 可 以使 用。 附录1.python 读 取操 作基 本命 令: - 12 - Python Python Python Python 文 件操 作 ,open ,open ,open ,open 读 写文 件 ,,,,追 加文 本内 容 1.open1.open1.open1.open 使用open 打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally 语句来确保最 后 能关 闭文 件。 file_object = open('thefile.txt') try: all_the_text = file_object.read( ) finally: file_object.close( ) 注:不能把open 语 句放 在try 块里,因 为当 打开 文件 出现 异常 时 ,文 件对 象file_object 无 法执 行close() 方 法。 2.2.2.2.读 文件 读 文本 文件 input = open('data','r') #第 二个 参数 默认 为 r input = open('data') 读 二进 制文 件 input = open('data','rb') 读 取所 有内 容 file_object = open('thefile.txt') try: all_the_text = file_object.read( ) finally: file_object.close( ) 读 固定 字节 file_object = open('abinfile','rb') try: while True: chunk = file_object.read(100) if not chunk: break do_something_with(chunk) finally: file_object.close( ) 读 每行 list_of_all_the_lines = file_object.readlines( ) 如 果文 件是 文本 文件 ,还 可以 直接 遍历 文件 对象 获取 每行 : for line in file_object: - 13 - process line ....写 文件 写 文本 文件 output = open('data','w') 写 二进 制文 件 output = open('data','wb') 追 加写 文件 output = open('data','w+') 写 数据 file_object = open('thefile.txt','w') file_object.write(all_the_text) file_object.close( ) 写 入多 行 file_object.writelines(list_of_text_strings)
还剩12页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

jim_zs

贡献于2014-10-26

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf