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 相关文章推荐
pycharm 使用心得(七)一些实用功能介绍
Jun 06 Python
用python删除java文件头上版权信息的方法
Jul 31 Python
简单实现python进度条脚本
Dec 18 Python
python 中字典嵌套列表的方法
Jul 03 Python
详解python 爬取12306验证码
May 10 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
利用Python实现某OA系统的自动定位功能
May 27 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
python温度转换华氏温度实现代码
Dec 06 Python
Python如何实现Paramiko的二次封装
Jan 30 Python
Python抖音快手代码舞(字符舞)的实现方法
Feb 07 Python
python图片灰度化处理的几种方法
Jun 23 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
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
php实现的redis缓存类定义与使用方法示例
2017/08/09 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
2017/11/20 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
jQuery 处理表单元素的代码
2010/02/15 Javascript
JQuery 文本框使用小结
2010/05/22 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
Bootstrap按钮组件详解
2016/04/26 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
Angular2 自定义validators的实现方法
2017/07/05 Javascript
mint-ui的search组件在键盘显示搜索按钮的实现方法
2017/10/27 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
微信小程序实现滚动加载更多的代码
2019/12/06 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
python二进制文件的转译详解
2019/07/03 Python
Django实现跨域的2种方法
2019/07/31 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
Python-jenkins 获取job构建信息方式
2020/05/12 Python
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
儿科护理实习自我鉴定
2013/09/19 职场文书
自荐信格式的六要素
2013/09/21 职场文书
技术学校毕业生求职信分享
2013/12/02 职场文书
银行党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
住房抵押登记委托书
2014/09/27 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
学校体育节班级口号
2015/12/25 职场文书