web.py 十分钟创建简易博客实现代码


Posted in Python onApril 22, 2016

一、web.py简介
web.py是一款轻量级的Python web开发框架,简单、高效、学习成本低,特别适合作为python web开发的入门框架。官方站点:http://webpy.org/

二、web.py安装
1、下载:http://webpy.org/static/web.py-0.33.tar.gz
2、解压并进入web.py-0.33目录,安装:python setup.py install

三、创建简易博客
1、目录说明:主目录blog/,模板目录blog/templates
2、在数据库“test”中创建表“entries”

CREATE TABLE entries ( 
 id INT AUTO_INCREMENT, 
 title TEXT, 
 content TEXT, 
 posted_on DATETIME, 
 primary key (id) 
);

3、在主目录创建blog.py,blog/blog.py

#载入框架
import web
#载入数据库操作model(稍后创建)
import model
#URL映射
urls = (
  '/', 'Index',
  '/view/(/d+)', 'View',
  '/new', 'New',
  '/delete/(/d+)', 'Delete',
  '/edit/(/d+)', 'Edit',
  '/login', 'Login',
  '/logout', 'Logout',
  )
app = web.application(urls, globals())
#模板公共变量
t_globals = {
 'datestr': web.datestr,
 'cookie': web.cookies,
}
#指定模板目录,并设定公共模板
render = web.template.render('templates', base='base', globals=t_globals)
#创建登录表单
login = web.form.Form(
      web.form.Textbox('username'),
      web.form.Password('password'),
      web.form.Button('login')
      )
#首页类
class Index:
 def GET(self):
  login_form = login()
  posts = model.get_posts()
  return render.index(posts, login_form)
 def POST(self):
  login_form = login()
  if login_form.validates():
   if login_form.d.username == 'admin' /
    and login_form.d.password == 'admin':
    web.setcookie('username', login_form.d.username)
  raise web.seeother('/')
#查看文章类
class View:
 def GET(self, id):
  post = model.get_post(int(id))
  return render.view(post)
#新建文章类
class New:
 form = web.form.Form(
       web.form.Textbox('title',
       web.form.notnull,
       size=30,
       description='Post title: '),
       web.form.Textarea('content',
       web.form.notnull,
       rows=30,
       cols=80,
       description='Post content: '),
       web.form.Button('Post entry'),
       )
 def GET(self):
  form = self.form()
  return render.new(form)
 def POST(self):
  form = self.form()
  if not form.validates():
   return render.new(form)
  model.new_post(form.d.title, form.d.content)
  raise web.seeother('/')
#删除文章类
class Delete:
 def POST(self, id):
  model.del_post(int(id))
  raise web.seeother('/')
#编辑文章类
class Edit:
 def GET(self, id):
  post = model.get_post(int(id))
  form = New.form()
  form.fill(post)
  return render.edit(post, form)
 def POST(self, id):
  form = New.form()
  post = model.get_post(int(id))
  if not form.validates():
   return render.edit(post, form)
  model.update_post(int(id), form.d.title, form.d.content)
  raise web.seeother('/')
#退出登录
class Logout:
 def GET(self):
  web.setcookie('username', '', expires=-1)
  raise web.seeother('/')
#定义404错误显示内容
def notfound():
 return web.notfound("Sorry, the page you were looking for was not found.")
 
app.notfound = notfound
#运行
if __name__ == '__main__':
 app.run()

4、在主目录创建model.py,blog/model.py

import web
import datetime
#数据库连接
db = web.database(dbn = 'MySQL', db = 'test', user = 'root', pw = '123456')
#获取所有文章
def get_posts():
 return db.select('entries', order = 'id DESC')
 
#获取文章内容
def get_post(id):
 try:
  return db.select('entries', where = 'id=$id', vars = locals())[0]
 except IndexError:
  return None
#新建文章
def new_post(title, text):
 db.insert('entries',
  title = title,
  content = text,
  posted_on = datetime.datetime.utcnow())
#删除文章
def del_post(id):
 db.delete('entries', where = 'id = $id', vars = locals())
 
#修改文章
def update_post(id, title, text):
 db.update('entries',
  where = 'id = $id',
  vars = locals(),
  title = title,
  content = text)

5、在模板目录依次创建:base.html、edit.html、index.html、new.html、view.html

<!-- base.html -->
$def with (page)
<html>
 <head>
  <title>My Blog</title>
  <mce:style><!--
   #menu {
    width: 200px;
    float: right;
   }
  
--></mce:style><style mce_bogus="1">   #menu {
    width: 200px;
    float: right;
   }
  </style>
 </head>
 
 <body>
  <ul id="menu">
   <li><a href="/" mce_href="">Home</a></li>
   $if cookie().get('username'):
    <li><a href="/new" mce_href="new">New Post</a></li>
  </ul>
  
  $:page
 </body>
</html>

<!-- edit.html -->
$def with (post, form)
<h1>Edit $form.d.title</h1>
<form action="" method="post">
 $:form.render()
</form>
<h2>Delete post</h2>
<form action="/delete/$post.id" method="post">
 <input type="submit" value="Delete post" />
</form>

<!-- index.html -->
$def with (posts, login_form)
<h1>Blog posts</h1>
$if not cookie().get('username'):
 <form action="" method="post">
 $:login_form.render()
 </form>
$else:
 Welcome $cookie().get('username')!<a href="/logout" mce_href="logout">Logout</a>
<ul>
 $for post in posts:
  <li>
   <a href="/view/$post.id" mce_href="view/$post.id">$post.title</a>
   on $post.posted_on
   $if cookie().get('username'):
    <a href="/edit/$post.id" mce_href="edit/$post.id">Edit</a>
    <a href="/delete/$post.id" mce_href="delete/$post.id">Del</a>
  </li>
</ul>

<!-- new.html -->
$def with (form)
<h1>New Blog Post</h1>
<form action="" method="post">
$:form.render()
</form>

<!-- view.html -->
$def with (post)
<h1>$post.title</h1>
$post.posted_on<br />
$post.content

6、进入主目录在命令行下运行:python blog.py,将启动web服务,在浏览器输入:http://localhost:8080/,简易博客即已完成。

Python 相关文章推荐
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 Python
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
十个Python程序员易犯的错误
Dec 15 Python
django+js+ajax实现刷新页面的方法
May 22 Python
python交互式图形编程实例(三)
Nov 17 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
Django 表单模型选择框如何使用分组
May 16 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 Python
Python装饰器使用你可能不知道的几种姿势
Oct 25 Python
python 经典数字滤波实例
Dec 16 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
Aug 07 Python
解析python中的jsonpath 提取器
Jan 18 Python
在windows下快速搭建web.py开发框架方法
Apr 22 #Python
基于python实现的抓取腾讯视频所有电影的爬虫
Apr 22 #Python
Python开发之快速搭建自动回复微信公众号功能
Apr 22 #Python
Django小白教程之Django用户注册与登录
Apr 22 #Python
python中PIL安装简单教程
Apr 21 #Python
Python for Informatics 第11章之正则表达式(四)
Apr 21 #Python
Python for Informatics 第11章之正则表达式(二)
Apr 21 #Python
You might like
几种显示数据的方法的比较
2006/10/09 PHP
php关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
2016/05/12 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
Vue实现左右菜单联动实现代码
2018/08/12 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
vue实现前端分页完整代码
2020/06/17 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
[01:04]不如跳舞!DOTA2新英雄玛尔斯的欢乐日常
2019/03/11 DOTA
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
python实现网站的模拟登录
2016/01/04 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
python 数据提取及拆分的实现代码
2019/08/26 Python
python3实现高效的端口扫描
2019/08/31 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
python实现不同数据库间数据同步功能
2021/02/25 Python
教师产假请假条范文
2014/04/10 职场文书
博士生求职信
2014/07/06 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
工商行政处罚决定书
2015/06/24 职场文书
开学典礼校长致辞
2015/07/29 职场文书