文档章节

使用web.py在BAE建立自已的电影网站

Kevin_Yang
 Kevin_Yang
发布于 2013/10/31 23:52
字数 2457
阅读 1056
收藏 1
点赞 0
评论 7

最近在网上看了一篇文章使用web.py在BAE上建立电影网站,http://www.51bigfool.com/%E6%88%91%E6%98%AF%E5%A6%82%E4%BD%95%E7%94%A8bae%E5%92%8Cweb-py%E6%89%93%E9%80%A0%E8%B1%86%E7%93%A3%E7%94%B5%E5%BD%B1top100%E7%9A%84.html 我自已也在此基础上做了一些改进,也在一点点的熟悉使用web.py这个框架,可以看一下我弄了一半的应用 http://mypythontest.duapp.com/

准备 BAE web.py

1. 在BAE上建立一个python的应用(快速创建即可),选择Iframe

create

之后进入云引擎将环境类型设置为python

python

先简单看一下目录结构如下

│  index.py
│  model.py

├─static
│  └─images
│          lg_movie_a12_2.png

└─templates
    │  add.html
    │  base.html
    │  index.html
    │  play.html
    │  show.html
    │  top250style.css

新建一个Mysql,进入phpmyadmin导入所需的表

 

CREATE TABLE DoubanTop250(
    id INT AUTO_INCREMENT ,
    moviename TEXT,
    score FLOAT,
    url TEXT,
    PRIMARY KEY ( id )
)

我先按照原来的教程添加了相应的代码

model.py

# _*_ coding:utf-8 _*_
import web
import web.db
from bae.core import const
 
dbname = "数据库名字"
 
db = web.database(
    dbn='mysql',
    host=const.MYSQL_HOST,
    port=int(const.MYSQL_PORT),
    user=const.MYSQL_USER,
    passwd=const.MYSQL_PASS,
    db=dbname
)
 
def additem(name, rating, address):
    return db.insert('DoubanTop250', moviename=name, score=rating, url=address)
 
def get_items():
    return db.select('DoubanTop250', order='id')
 
def get_item(id):
    return db.select('DoubanTop250', where='id=$id', vars=locals())[0]

index.py

#_*_ coding:utf-8 _*_
import web
import model
import os
import re
 
urls = (
    "/", "Index",
    "/play/(\d+)", "Play"
)
 
t_globals = {
    'datestr': web.datestr
}
 
app_root = os.path.dirname(__file__)
template_root = os.path.join(app_root, 'templates/')
render = web.template.render(template_root, base='base', globals=t_globals)
 
class Index:
    def GET(self):
        items = model.get_items()
#       return render.test(items)
        return render.index(items)
 
class Play:
    def POST(self, id):
        id = int(id)
        item = model.get_item(id)
        return render.play(item)
 
app = web.application(urls, globals()).wsgifunc()
from bae.core.wsgi import WSGIApplication
application = WSGIApplication(app)

base.html

$def with (page)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html  xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title> 杨彦星的自娱自乐</title>
        <link type="text/css" rel="stylesheet" href="/templates/top250style.css" />
    </head>
 
    <body>
        <div id="header">
            <a target="_blank" href="http://movie.douban.com/chart" title="豆瓣电影排行旁"><img src="/static/images/lg_movie_a12_2.png" ></a>
        </div>
 
        <div id="main">
          <h1> 这是瞎写的我会乱说吗|<a target="_blank" href = "/addmovie/">添加电影</a></h1>
            $:page
        </div>
 
        <div id="footer">
            <div id="copyright">
                <p>本站纯属自娱自乐与学习python之用,电影啥的全是网上收集</p>
              <a href = "/">返回首页</a>
                <p><em>Proudly powered by Web.py</em></p>
            </div>
        </div>
 
    </body>
</html>

index.html

$def with(items)
        <table>
            <tr>
                <th>排名</th>
                <th>影片名</th>
                <th>得分</th>
                <th>百度影音播放</th>
            </tr>
            $for item in items:
            <tr>
                <td id="tdstyle">$item.id</td>
                <td id="tdstyle">$item.moviename</td>
                <td id="tdstyle">$item.score</td>
                <td id="tdstyle">
                    <form action="/play/$item.id" method="post">
                      <input type="submit" value="播放" />
                    </form>
                </td>
            </tr>
        </table>

play.html

$def with(item)
<h2>$item.id $item.moviename</h2>
<blockquote>
        <object classid="clsid:02E2D748-67F8-48B4-8AB4-0A085374BB99" width="600" height="400" id="BaiduPlayer" name="BaiduPlayer" onError=if(window.confirm('请您先安装百度影音软件,然后刷新本页才可以正常播放.')){window.open('http://player.baidu.com')}else{self.location='http://player.baidu.com'}>
        <PARAM NAME='URL' VALUE=$item.url>
        <PARAM NAME='Autoplay' VALUE='1'>
        </object>
 
<a title="返回首页" href="http://kanimdb.duapp.com"> 返回首页 </a>
</blockquote>

top250style.css

body{
  background-image: url(tw.jpg);
  
  background-position:right;
  background-color: #fff;
  margin-left:15%;
  margin-right:15%;
  border: 2px dotted gray;
  padding: 20px 20px 20px 20px;
  font-family: sans-serif;
}
 
h1 {
  font-family: sans-serif;
  font-weight: bolder;;
  color: green;
  border-bottom: 2px solid gray;
  text-align: center;
}
 
table {
  width: 500px;
  text-align: center;
  margin-top: 30px;
  margin-left: 20%;
  margin-right: 20%;
  border: thin solid black;
  border-collapse: collapse;
}
 
th, #tdstyle {
  border: thin dotted gray;
  padding: 5px;
  background-color: silver;
}
th {
  background-color: #fcba7a;
}
 
#main {
  padding-top: 20px;
  padding-bottom: 20px;
}
 
#bdplaer {
  padding-left: 10px;
  padding-right: 10px;
}
 
#header {
  text-align: center;
}
 
#footer {
  padding: 10px, 10px, 10px, 10px;
  
  text-align: center;
}
 
#copyright {
  padding: 10px, 10px, 10px, 10px;
  font-size: small;
}

修改app.conf

handlers:
  - url : /static/images/(.*)
    script: /static/images/$1
  - url : /templates/(.*)
    script: /templates/$1
  - url : /(.*)
    script: index.py
 
  - expire : .jpg modify 10 years
  - expire : .swf modify 10 years
  - expire : .png modify 10 years
  - expire : .gif modify 10 years
  - expire : .JPG modify 10 years
  - expire : .ico modify 10 years

好了,现在这个应用基本上就可以看了,不过现在请忘了以上的代码。因为我们要为其添加一些自已的想要的东西

首先我们要添加“添加影片”功能

修改urls配置

urls = (
    "/","Index",
    "/play/(\d+)","Play",
    "/add/","Add",
    "/addmovie/","addmovie"
)

这里的addmovie 其实只是想render到一个模板中

添加class addmovie实现

class addmovie:
  def GET(self):
    return render.add()

添加add.html

<form action="/add/" method="post">
电影名:<input type="text" name = "name"><br>
得分:<input type="text" name = "rating"><br>
播放地址:<input type="text" name = "address"><br>
<input type="submit" value="add">
</form>

很简单的表单,我前端不会,只会写简单的html

这里name值可以随便写,有意义或者你自已认识即可,反正后面的python代码会做处理

这里将movie的信息post到/add/中

转为urls里已经配置了

"/add/","Add",

下面来写class Add实现

class Add:
  def POST(self):
    movieinfo = web.data()
    #model.additem(movieinfo)
    #return render.show(movieinfo)
    postlist = movieinfo.split('&')   
    movie = []
    for i in postlist:
      movie.append(i.split('=')[1])
    model.additem(urllib.unquote(movie[0]),movie[1],urllib.unquote(movie[2]))
    web.seeother("/")

这里的代码写的太ugly了,但是可以满足需要,如果有更好的实现可以和我说下

先将post来的数据使用&分割,将会得到name=xxx,rating=xxx,address=xxx的列表

接着来获取相应的值,也就是再将列表中的各个项再用‘=’进行分割,然后将值append到一个新的列表中

然后将新的列表中的各个值进行unquote,要不你插入到数据库中的将不是中文等,而是quote过的数据

插件结束后跳转到首页 web.seeother(“/”)

好了,现在我们完成了添加电影的操作

2.完成后你现在就去找些电影和百度影音地址来添加看看,但是我发现一个新的问题,百度影音在非IE浏览器上是不好用的,这还了得……

在网上找方法,有一个通过 javacsript先判断浏览器的appname来决定使用哪个,http://pcbbs.baidu.com/thread-62871-1-1.html

这个是我试过了,可以实现在chrome与FF下调用百度影音,但是我要传的$item.url不能传入javascrip中,传入后就是$item.url,在网上查找说可以要写两个$,我也试过了,但是还是不能播放,于是我决定放弃IE用户,让所有播放都走非IE的方法中,爱咋地咋地。


<embed id="QvodPlayer2" name="QvodPlayer2" width="860" height="460" URL=$item.url type='application/qvod-plugin' Autoplay='1' Showcontrol='1' ></embed>


百度这点做的就不如qvod,人家官方都出了在非IE浏览器上调用的方法,而百度还在使用IE,真是不思进取,我也决定在网页上调用qvod播放接口

那么新的问题又来了,程序怎么知道你是要用qvod还是百度来播放?其实很简单,你在添加播放地址的时候,qvod的地址是以qvod开始的,百度影音是以bdhd开始的,只要判断一下$item.url是以哪个开头的就可以了

但是网上更多的还是thunder,edk等协议的影视资源,这些无论是百度还是qvod都无法播放,于是我想到了现在很流行的云点播,迅雷的云点播可以播放,但是非白金会员只能播放一段时间,随便找了几个提供在线云点播的,有弹出式广告的占大多数,于是找了一个没有广告的,okdvd,其接口调用也挺简单的

<iframe scrolling="no" frameborder="0" name="win_vod" id="win_vod" border="0" style="width: 950px; height: 550px" src="http://www.okdvd.com/api.php#!url=后面加上播放地址"></iframe>

所以最终修改我的play.html为

$def with(item)
<h2>$item.id $item.moviename</h2>
<blockquote>
<div align = "center">
$if item.url.startswith('qvod'):
    				<object classid="clsid:F3D0D36F-23F8-4682-A195-74C92B03D4AF" width="860" height="460"
                    id="QvodPlayer" name="QvodPlayer" onerror="document.getElementById('QvodPlayer').style.display='none';document.getElementById('iframe_down').style.display='';document.getElementById('iframe_down').src='http://error2.qvod.com/error4.htm';">
                    <param name='Showcontrol' value='2'>
                    <param name='URL' value=$item.url>
                    <param name='Autoplay' value='1'>
                    <embed id="QvodPlayer2" name="QvodPlayer2" width="860" height="460" URL=$item.url type='application/qvod-plugin' Autoplay='1' Showcontrol='1' ></embed>
					   </object>    
$elif item.url.startswith('bdhd'):
	<object id="BaiduPlayer" name="BaiduPlayer" type="application/player-activex" width="860" height="460" progid="Xbdyy.PlayCtrl.1" param_URL=$item.url param_OnPlay="onPlay" param_OnPause="onPause" param_OnFirstBufferingStart="onFirstBufferingStart" param_OnFirstBufferingEnd="onFirstBufferingEnd" param_OnPlayBufferingStart="onPlayBufferingStart" param_OnPlayBufferingEnd="onPlayBufferingEnd" param_OnComplete="onComplete" param_Autoplay="1"></object>
$else:
	<iframe scrolling="no" frameborder="0" name="win_vod" id="win_vod" border="0" style="width: 860px; height: 460px" src="http://www.okdvd.com/okapi.php#!url=$item.url"></iframe>
</div>
</blockquote>

这里有一个问题困扰了我很长时间,原来这里的模板如果有python代码的话也是要遵循其缩进原则的,如$if 下面的<object>如果和$if同级,那么也会报错,BAE提供错误日志,可以很快的查看到哪里出错了

3.首页上播放按钮现在还都是“播放”字样,我想让它显示是百度还是qvod播放,其实方法和上面一样,判断$item.url的startswith()方法,另外我又有了新的需求,因为网上有些电影的资源实在不好找到百度或者qvod与thunder或者edk资源,但是优酷或者土豆上有,那我可以让其跳转到相应的网址上播放

所以最终的index.html修改成这样

$def with(items)
        <table>
            <tr>
                <th>排名</th>
                <th>影片名</th>
                <th>得分</th>
                <th>播放</th>
            </tr>
            $for item in items:
            <tr>
                <td id="tdstyle">$item.id</td>
                <td id="tdstyle">$item.moviename</td>
                <td id="tdstyle">$item.score</td>
                <td id="tdstyle">
                  $if item.url.startswith("http"):                  
                    <form action="$item.url" method="get" target="_blank">
                    <input type="submit" value="新页面播放" />
                    </form>
                  $elif item.url.startswith('bdhd'):
                    <form action="/play/$item.id" method="post">
                    <input type="submit" value="百度影音播放" />
                    </form>
                  $elif item.url.startswith('qvod'):
                    <form action="/play/$item.id" method="post">
                    <input type="submit" value="qvod播放" />
                    </form>
                  $else:
                    <form action="/play/$item.id" method="post">
                    <input type="submit" value="云点播播放" />
                    </form>
                </td>
            </tr>
        </table>

而最终的index.html修改成这样

#-*- coding:utf-8 -*-
import web
import model
import os
import re
import urllib

urls = (
    "/","Index",
    "/play/(\d+)","Play",
    "/add/","Add",
    "/addmovie/","addmovie"
)
 
t_globals = {
    'datestr': web.datestr
}
 
app_root = os.path.dirname(__file__)
template_root = os.path.join(app_root, 'templates/')
render = web.template.render(template_root, base='base', globals=t_globals)
 
class Index:
    def GET(self):
        items = model.get_items()
#       return render.test(items)
        return render.index(items)
 
class Play:
    def POST(self, id):
        id = int(id)
        item = model.get_item(id)
        return render.play(item)
      
class Add:
  def POST(self):
    movieinfo = web.data()
    #model.additem(movieinfo)
    #return render.show(movieinfo)
    postlist = movieinfo.split('&')   
    movie = []
    for i in postlist:
      movie.append(i.split('=')[1])
    model.additem(urllib.unquote(movie[0]),movie[1],urllib.unquote(movie[2]))
    web.seeother("/")

class addmovie:
  def GET(self):
    return render.add()
      
app = web.application(urls, globals()).wsgifunc()
from bae.core.wsgi import WSGIApplication
application = WSGIApplication(app)

 

4.遗留问题,现在没有权限限制,谁都可以添加,也没有修改与删除选项,所以后面我将添加相应的权限管理,另外总不能自已都去手工添加电影,考虑使用爬虫来自动添加电影

5.献给热爱的电影的同胞们,向亚伦&middot;斯沃茨 致敬

Aaron_Swartz_at_Boston_Wikipedia_Meetup,_2009-08-18_

  向汤唯致敬

357px-Tang_Wei2

© 著作权归作者所有

共有 人打赏支持
Kevin_Yang
粉丝 247
博文 34
码字总数 34570
作品 0
通州
加载中

评论(7)

Skqing
Skqing
怎么抢呢, 都不知道入口! 擦, 干啥都是抢...27
Kevin_Yang
Kevin_Yang

引用来自“DolphinBoy”的评论

现在已经无法申请到 python 的部署资源了, 太坑了!

可以申请资源,每周四下午2点开始抢,这是最坑的…… 老版的BAE已经不允许绑定域名了
Skqing
Skqing
现在已经无法申请到 python 的部署资源了, 太坑了!
Skqing
Skqing

引用来自“Kevin_Yang”的评论

引用来自“DolphinBoy”的评论

无法解析主机名 是不是挂掉了啊!

嗯,百度把未备案的域名解析给去掉了,你可以访问http://mypythontest.duapp.com/ 查看效果

可以访问, BAE还支持自己的域名吗?
Kevin_Yang
Kevin_Yang

引用来自“DolphinBoy”的评论

无法解析主机名 是不是挂掉了啊!

嗯,百度把未备案的域名解析给去掉了,你可以访问http://mypythontest.duapp.com/ 查看效果
Skqing
Skqing
无法解析主机名 是不是挂掉了啊!
itfanr
itfanr
谢谢分享
JFinal结合百度BAE进行开发

使用JFinal结合百度BAE的云环境(Jetty)、云数据库(MYSQL)进行开发网站。 1.申请百度开发者账号,登录百度开发者中心。 2.在百度开发者管理中心的管理面板中,快速创建应用,新建一个WEB...

CapJes ⋅ 2013/09/17 ⋅ 11

Python 商业网站

Sohu 邮箱 大量使用了 web.py、Django 等 海报网 可能是国内最大的 Django 应用网站 果壳网 科技-新知-智趣,很新税的科技主题网站,用 Django 做的 福窝网 家庭装修指南网站,使用 Django 构...

岭南六少 ⋅ 2011/08/07 ⋅ 0

毕设demo写好

2015年1月20日 14:41:47 阶段性暂停!! 把运行结果截图给了老师,老师说先整理下文档,然后下学期来了再部署到服务器上。 那么,下学期来了,估计也要把Epm和CR1000什么的搞好了。 先总结一...

lovedan ⋅ 2015/01/20 ⋅ 0

ubuntu10.10---用Apache+mod_wsgi部署python程序

使用Apache+mod_wsgi部署webpy等python程序 webpy是一个python上的非常轻量级的web框架,它和其他许多python web框架一样,都能支持wsgi部署,而目前来看比较优秀的wsgi部署方案自然是Apache+mo...

durban ⋅ 2012/05/09 ⋅ 0

nginx部署基于webpy的网站,登录验证使用session,但是无法验证成功

经过发现,在登录页load出来的过程中,使用webpy的session机制产生的文件下存在两个session文件。但是使用webpy自带的server的话,始终是一个session文件。 进一步查看,发现问题是webpy需要...

__FresHmaN ⋅ 2011/08/22 ⋅ 3

【微信公众平台开发】之二:高级功能开发(基于SAE)

选择BAE还是SAE? * BAE3.0使用git推送每次修改非常爽, 1> 本地修改 2> 推送到oschina(自己留念)和BAE 3> 点击发布>实际测试; 但是没有在线代码编辑功能!!中间出现问题就很坑爹,得重来...

realsa ⋅ 2014/09/21 ⋅ 9

web.py轻量级博客系统--GarfieltBlog-webpy

Garfielt Blog是一款基于web.py的轻量级开源博客系统。 可访问 http://blog.iscsky.net 体验功能效果。 开发初衷是定制一款自己使用顺手的博客,个人不喜欢臃肿,简洁至上,开发过程中力求代...

Garfielt ⋅ 2013/06/24 ⋅ 0

lighttpd+web.py 搭建web service

搭建web service是一种灵活解决问题、分解任务的好选择。以服务的形式,以数据为驱动,实现一个庞大系统中的某一部分相对独立功能。 web service其实就是一个忽略view的web server,只要关注...

小编辑 ⋅ 2010/02/03 ⋅ 1

百度BAE2.0 JAVA环境项目部署和调试

起初在一个应用挂在虚拟主机上,昨天早上虚拟主机挂了。本来考虑迁移到SAE上的,但之前发现SAE的JVM云豆消耗的太快(PS:我是中级开发者,每月10000云豆,如果有哪位大神对SAE JAVA云豆能控制...

using ⋅ 2013/10/07 ⋅ 61

JeeWx(捷微) 百度BAE 部署文档

JeeWx(捷微) 百度BAE 部署文档 开始前的准备 1. WAR包 下载地址: 链接: http://pan.baidu.com/s/1bnlcsk3 密码: 592i 下载war包和sql脚本文件用于部署 2. 注册百度账号 http://developer...

Jeecg ⋅ 2014/07/10 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 43分钟前 ⋅ 0

Spring JavaConfig 注解

JavaConfig注解允许开发者将Bean的定义和配置放在Java类中。它是除使用XML文件定义和配置Bean外的另一种方案。 配置: 如一个Bean如果在XML文件可以这样配置: <bean id="helloBean" class="...

霍淇滨 ⋅ 51分钟前 ⋅ 0

Spring clound 组件

Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。...

英雄有梦没死就别停 ⋅ 52分钟前 ⋅ 0

Confluence 6 重新获得站点备份文件

Confluence 将会创建备份,同时压缩 XML 文件后存储熬你的 <home-directory>/backups> 目录中。你需要自己访问你安装的 Confluence 服务器,并且从服务器上获得这个文件。 运行从 Confluence...

honeymose ⋅ 57分钟前 ⋅ 0

informix的常用SQL语句

1、创建数据库 eg1. 创建不记录日志的库testdb,参考语句如下: CREATE DATABASE testdb; eg2. 创建带缓冲式的记录日志的数据库testdb(SQL语句不一定在事务之中,拥有者名字不被用于对象的解...

wangxuwei ⋅ 今天 ⋅ 0

matplotlib画图

最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数。 from pylab import *from numpy import *x = linspace(0, 5, 10)y = x ** 2figure()plot(x, y, 'r')...

Dr_hu ⋅ 今天 ⋅ 0

RabbitMQ学习以及与Spring的集成(三)

本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收。 在RabbitMQ的Spring配置文件中,首先需要增加命名空间。 xmlns:rabbit="http://www.springframework.org/schema/rabbit" 其次是模...

onedotdot ⋅ 今天 ⋅ 0

JAVA实现仿微信红包分配规则

最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制 对于微...

小致dad ⋅ 今天 ⋅ 0

Python 数电表格格式化 xlutils xlwt xlrd的使用

需要安装 xlutils xlwt xlrd 格式化前 格式化后 代码 先copy读取的表格,然后按照一定的规则修改,将昵称中的学号提取出来替换昵称即可 from xlrd import open_workbookfrom xlutils.copy ...

阿豪boy ⋅ 今天 ⋅ 0

面试题:使用rand5()生成rand7()

前言 读研究生这3 年,思维与本科相比变化挺大的,这几年除了看论文、设计方案,更重要的是学会注重先思考、再实现,感觉更加成熟吧,不再像个小P孩,人年轻时总会心高气傲。有1 道面试题:给...

初雪之音 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部