内容

  这次是python的一个web框架,tornado,这个web框架在python的几个web框架中一个比较简单的web框架,刚开始接触python的时候就知道python有两个比较常用的web框架,一个是tornado,一个是Django,今天终于让我接触到tornado。

  本次的tornado的练习是一个简单的针对一个网站进行简单的后台操作,一个网站的登录验证,以及登录之后的发布信息的操作,本次练习中可能会有些地方有不足或者错误,欢迎大家来探讨或者指正我的错误,好的就不多说了,直接上代码。

  首先是一个基本的tornado的web框架,由于第一个学习,没有对这些代码进行更好的位置存放以及管理,所以请大家见谅。

  torndao.py

 #!/usr/bin/env python
# -*- coding:utf-8 -*- import tornado.ioloop
import tornado.web
from nov_seven import uimethod as mt
from nov_seven import uimodule as md INPUT_LIST = []
USER_INFO = {'is_login':None}
NEW_LIST = [
{'title':'信息仿佛再次实现攻击范围来到你的面前','content':'从前你们的游戏不在是现在的我',
},
{'title':'信息仿佛再次实现攻击范围来到你的面前','content':'从前你们的游戏不在是现在的我',
}
]
#如果想在输出的时候不替换之前的内容就在新建一个字典在,它的下面,如上 class MainHandler(tornado.web.RequestHandler):
#继承RequestHandler这个类
def get(self):
# self.write("Hello, world")
# self.render("s1.html") #默认到当前目录下面找
# 当执行get函数的时候跳转到s1页面
# self.render("s1.html", xxxooo=[11, 22, 33, 44]) print(self.get_argument('name',123))
print(self.get_argument('age',123))
#接收通过url传输的参数 #当仅仅使用url传值的时候,由于定义了xxx,但是没有传值所以出现bad request
name = self.get_argument('xxx',None) #设置默认值为None
if(name):#当获取的值不为none的时候,才添加值
INPUT_LIST.append(name)
self.render("s1.html", xxxooo=INPUT_LIST,npm='nPm')
#可以传多个值,传值之后就可以在html文件里使用这个参数 def post(self, *args, **kwargs):
# self.write("Hello")
# print('post') name = self.get_argument('xxx')
#name拿到的是表单里提交的数据
INPUT_LIST.append(name)
self.render("s1.html", xxxooo=INPUT_LIST)
print(INPUT_LIST) #render内部应该是打开文件将文件的内容返回
#1.打开s1.html文件,读取内容(包含特殊语法)
#2.当这里的render里添加第二参数的时候,xxxooo = [11,22,33,44]&&读取内容(包含特殊语法)
# 这里为2的示例 (self.render("s1.html",xxxooo=[11,22,33,44]))
#3.得到新的字符串(就是已经替换完毕的字符串)
#4.返回给用户 class IndexHandler(tornado.web.RequestHandler):
def get(self,*args,**kwargs):
self.render('index.html',is_login = USER_INFO,new_list = NEW_LIST) class LoginHandler(tornado.web.RequestHandler):
def post(self,*args,**kwargs):
username = self.get_argument('username',None)
passwd = self.get_argument('passwd',None)
if username == 'alexsel'and passwd == '':
USER_INFO['is_login'] = True
USER_INFO['username'] = username
# self.render('index.html',is_login = USER_INFO['is_login'],is_name = USER_INFO['username'])
# self.render('index.html', is_login=USER_INFO,new_list = NEW_LIST)
#传字典方式失败,以后进行修改,三 115 24,自己发现错误成功使用字典方式传递错误 self.redirect('index')
# 跳转到的url class PublishHandler(tornado.web.RequestHandler):
def post(self,*args,**kwargs):
if USER_INFO['is_login']:
headline = self.get_argument('headline', None)
words = self.get_argument('words', None)
temp = {'title':headline, 'content':words}
NEW_LIST.append(temp)
# self.render('index.html',insertcontnet=temp)
self.redirect('index')
#跳转到index页面,同时NEW_LIST已经更新,所以自己添加的内容就刷新到了页面上 settings = {
"template_path":"template", #模版路径的配置
"static_path":"static",
"static_url_prefix":"/sss/",
"ui_methods":mt,
"ui_modules":md,
}
# template_path
#配置参数,用来添加寻找目录template_path为固定写法,:后面为目录,就像上面的s1在template下面,然而没有写
#路径仅仅是写了文件名就可以执行,因为添加查询目录在里面 #static_path
#静态文件的配置(写程序的时候会把CSS,javascript都当作静态文件来处理,所以这些文件必须放在特殊的文件夹里)
#就像你引入的CSS文件(自己定义样式),无论你怎莫修改样式都无法找到这个CSS文件,所以需要特殊处理 #static_url_prefix
# 静态文件的前缀,就像s1里href的static一样,定义之后添加这个前缀,写上这个前缀就代表去static_path定义的目录
#里(static)面找,自己看s1文件里的写法 #ui_methods
#自己定义的函数(方法),通过import把含有自己定义方法的py文件引入进来,引入到进来,这个mt是别名,在这里声明(注册)
#之后就可以在与这个相关联的html文件里使用这个文件里的定义的方法了 #ui_modules
#将有自己定义的类的文件引入进来,然后再这里声明(注册),然后就可以在关联的html文件里使用这个类 #静态文件还可以做进一步的处理 #路由映射,路由系统
application = tornado.web.Application([
# (r"/index", MainHandler),
(r"/index",IndexHandler),
(r"/login", LoginHandler),
(r'/publish',PublishHandler)
],**settings) #创建了一个对象
#检索你输入的url是否和上面的index是否匹配,匹配之后自动执行后面那个类,然后自动执行后面的那个
#get方法,这个执行这个get方法就是一个定死的,是一个规定,好像必须是get这个才行
#第二个这个Application的第二个参数为配置参数,
#这个使用get还是post方法是要看html里的form表单里method的值是什么,这里就选择什么方式(post/get) if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
# 里面执行了socket

接下来就是页面的代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{{static_url('plugins/bootstrap3/css/bootstrap.css')}}">
<style>
img{
border:0;
}
ul{
list-style: none;
margin-top:0;
}
li {
float: left;
} body{
margin:0;
background-color: gainsboro;
}
div .sm li a{ font-family:方正姚体;
padding:0 10px ;
color: white;
font-size: 15px;
/*width: 40px;*/
text-decoration: none;
}
.one .wtp .menu li:hover{
background-color: red; }
.one .menu .login li:hover{
background-color: red;
}
body{
border-right: 1px;
margin: 0;
}
.one{
background-color:#2459a2; }
.wtp{
background-color:#2459a2;
width: 980px;
height: 28px;
margin: 0 auto; }
.imgan{
margin-top: 5px;
float: left;
}
.one .menu{
float: left;
line-height: 28px; }
.one .wtp .search{
float: right;
margin-top: 2px;
}
.one .wtp .login ul{
margin-top: 2px;
float: right;
list-style-type:none;
margin-left: 100px;
}
.one .login a{
font-size: 15px;
font-family:方正姚体;
text-decoration: none;
color: white;
}
.two{
margin: 0;
padding:0;
/*background-color: white;*/
}
.two .b_body{
background-color: white;
padding: 0;
width: 850px;
margin:0 auto;
}
.two .b_body .body_right{
float: right;
width: 250px;
background-color: white;
/*margin-left: px;*/
}
.two .b_body .body_left{
border: 0;
float: left;
width: 600px;
height: 1000px;
background-color: white;
}
.two .body_left .tp1 li{
margin-top: 15px;
padding: 0 10px;
font-size: 15px;
font-family: 楷体;
text-decoration: none;
}
.two .body_left .tp2 li{
padding:0 10px;
font-size: 14px;
float: right;
text-decoration: none;
}
.two .body_left .tyj p{
width: 450px;
font-family: 楷体;
padding:0 20px;
font-size: 14px; }
.two .body_left .tyj p a{
color: #369;
text-decoration: none;
}
.two .body_left .tyj p a:hover{
color: purple;
}
.two .tyj img{
float: right;
margin:0 10px;
width: 60px;
height: 60px;
}
.footer{
background-color: #2459a2;
clear: both;
}
.body_right p{
width: 195px;
margin:0 auto;
}
.body_right a{
color: darkgray;
padding:0 20px;
font-size: 12px;
font-family: 微软雅黑; }
.body_right a:hover{
color: purple;
} </style>
</head>
<body>
<div style="float: left ;position: fixed;" class="sivier">
<img style="width:100px;height:100px" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1506189359107&di=2920620b7071efc5f9e5e5835198e10e&imgtype=0&src=http%3A%2F%2Fwww.people.com.cn%2Fmediafile%2Fpic%2F20150619%2F42%2F17794731963561654358.jpg">
</div>
<div class="one">
<div class="wtp">
<div class="imgan">
<img style="width:85px;" src="http://dig.chouti.com/images/logo.png"/>
</div>
<div class="menu">
<ul class="sm">
<li><a href="http://baidu.com">全部</a></li>
<li><a href="http://baidu.com">42区</a></li>
<li><a href="http://baidu.com">段子</a></li>
<li><a href="http://baidu.com">图片</a></li>
<li><a href="http://baidu.com">挨踢1024</a></li>
<li><a href="http://baidu.com">你问我答</a></li>
</ul>
</div>
<div class="search">
<form action="https://baidu.com/s?">
<input type="text" name="wd" value="百度一下你就知道" />
</form>
</div>
<div class="login">
<ul>
{% if is_login['is_login'] %}
<li><a href="index.html">{{is_login['username']}}</a></li>
{% else %}
<li><a id="undid" href="#" onclick="Login();">登录</a></li>
<li><a>注册</a></li>
{%end%}
</ul>
</div>
</div>
</div>
<div class="two">
<div class="b_body">
<div class="body_left">
<ul class="tp1">
<li><a href="http://baidu.com">最热</a></li>
<li><a href="http://baidu.com">发现</a></li>
<li><a href="http://baidu.com">人类发布</a></li>
</ul>
<ul class="tp2">
<li><a href="#" onclick="Insert();">+发布</a></li>
<li><a href="http://baidu.com">24小时3天</a></li>
<li><a href="http://baidu.com">即时排序</a></li>
</ul>
<br>
<div class="tyj">
{% for new in new_list %}
<hr>
<div class="item">
<img src="/index.html/img3.chouti.com/CHOUTI_0EFA5D07942D4E6B818D8E26FA4D6AAB_W320H320=C60x60.jpg">
<p>
<a style="font-size:20px;color:darkblue;" href="http://baidu.com">
{{new['title']}}
</a>
<p><a>{{new['content']}}</a></p> </p>
<a style="font-size: 10px" src="sss">
<img style="width: 10px;height: 10px;float: left;" src="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=244214795,2938463942&fm=27&gp=0.jpg">
520
</a>
</div>
{%end%} <!--<hr>-->
<!--<div class="item">-->
<!--<img src="/index.html/img3.chouti.com/CHOUTI_0EFA5D07942D4E6B818D8E26FA4D6AAB_W320H320=C60x60.jpg">-->
<!--<p>-->
<!--<a href="http://baidu.com">-->
<!--抽屉新热榜今天中午12点起开始实行实名制,未绑定过手机号的老用户注意了!-->
<!--</a>-->
<!--</p>-->
<!--<a style="font-size: 10px" src="sss">-->
<!--<img style="width: 10px;height: 10px;float: left;" src="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=244214795,2938463942&fm=27&gp=0.jpg">-->
<!---->
<!--</a>-->
<!--</div>-->
<!--<hr>-->
<!--<div class="item">-->
<!--<img src="http://img5.imgtn.bdimg.com/it/u=1116060335,1837790544&fm=27&gp=0.jpg">-->
<!--<p>-->
<!--<a href="http://baidu.com">【传奇步枪AK-47诞生70年 俄罗斯立世界枪王铜像】今年是传奇步枪AK-47诞生70周年, 9月19日,俄罗斯为其发明者卡拉-->
<!--什尼科夫举行了纪念仪式,并在莫斯科为他树立起一座雕像。据统计,卡拉什尼科夫研发的枪械产量已超过一亿支,装备了100多个国家的武装力量。他也被称为世界枪王。-->
<!--</a>-->
<!--</p>--> <!--</div>--> <!--<hr>-->
<!--<div class="item">-->
<!--<img src="http://img3.chouti.com/CHOUTI_AF567EAA9C84489691D5F196D5AAB07E_W285H285=C200x200.jpg">-->
<!--<p>-->
<!--<a href="http://baidu.com">【关于今天下午朝鲜地震的各方表态】中国地震局:疑爆;韩国气象厅:自然地震;-->
<!--日本政府相关人士:目前正在收集信息,但现阶段没有官邸干部的紧急集合;俄罗斯气象部门官员:辐射量与往常数值无异,-->
<!--未观测到异常情况。朝鲜过去实施的核试验均观测到了里氏4.0级以上的地震。-->
<!--</a>-->
<!--</p>--> <!--</div>--> <!--<hr>-->
<!--<div class="item">-->
<!--<img src="http://img3.chouti.com/CHOUTI_4052A9DC4A16491D934190069C273380_W1280H960=C60x60.jpg">-->
<!--<p>-->
<!--<a href="http://baidu.com">有钱人的精致生活-->
<!--<br>-->
<!--<br>-->
<!--<br>-->
<!--</a>-->
<!--</p>-->
<!--</div>--> <!--<hr>-->
<!--<div class="item">-->
<!--<img src="http://img3.chouti.com/CHOUTI_AAB2CE03F61041AF811420E8DC2DCF34_W550H412=C60x60.jpg">-->
<!--<p>-->
<!--<a href="http://baidu.com">【数据显示:有了共享单车,广州拥堵下降6.8%】交通部科学研究院的报告显示,在共享单车推出之后,-->
<!--广州和深圳的拥堵程度分别下降6.8%和4.1%,同时自行车出行的占比从5.5%翻倍增长到了11.6%。-->
<!--</a>-->
<!--</p>-->
<!--</div>--> </div>
</div>
<div class="body_right">
<img style="margin: 10px 10px 10px 25px; width: 200px; height: 150px" src="http://dig.chouti.com//images/homepage_download.png">
<HR style="border:1 dashed #987cb9" width="80%" color=#987cb9 SIZE=1>
<p>
<a href="http://img1.qq.com/ent/pics/17553/17553008.jpg">
3.1415926545
</a>
</p>
<HR style="border:1 dashed #987cb9" width="80%" color=#987cb9 SIZE=1>
<p>
<a href="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1506782933&di=dec08e284975eb316d19dd9ae83e51c2&imgtype=jpg&er=1&src=http%3A%2F%2Fi1.sinaimg.cn%2Ftravel%2F2010%2F0817%2F201081795558.jpg">
3.1415926545
</a>
</p>
</div>
<div style="clear: both;"></div>
</div>
</div> <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="exampleModalLabel">用户登录</h4>
</div>
<form action="/login" method="post">
<div class="modal-body"> <div class="form-group">
<label class="control-label">用户名:</label>
<input type="text" name="username" class="form-control">
</div>
<div class="form-group">
<label class="control-label">密码:</label>
<!--<textarea class="form-control" id="message-text"></textarea>-->
<input type="password" name="passwd" class="form-control">
</div> </div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary">登录</button>
</div>
</form>
</div>
</div>
</div>
<div class="modal fade" id="exampleModal_pub" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="exampleModalLabel_pub">发布内容</h4>
</div>
<form method="post" action="/publish">
<div class="modal-body"> <div class="form-group">
<label for="recipient-name" class="control-label">标题:</label>
<input type="text" name="headline" class="form-control" id="recipient-name">
</div>
<div class="form-group">
<label for="message-text" class="control-label">内容:</label>
<textarea class="form-control" name="words" id="message-text"></textarea>
</div> </div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary">发布内容</button>
</div>
</form>
</div>
</div>
</div>
<div class="footer">r</div>
<script src="{{static_url('jquery-1.10.2.js')}}"></script>
<script src="{{static_url('plugins/bootstrap3/js/bootstrap.js')}}"></script>
<script>
function Login(){
$('#exampleModal').modal('show'); }
function Insert(){
$('#exampleModal_pub').modal('show');
}
</script>
</body>
</html>

这个练习就是有关于前端后端简单的数据交互,第一次学习tornado,以后还要多加练习。

  

第一次学习tornado小练习的更多相关文章

  1. JAVA小项目实例源码—学习娱乐小助手

    代码地址如下:http://www.demodashi.com/demo/11456.html 一.程序实现 项目目录: MyJFrame:实现项目界面样式: AppProcess:实现调用api或爬 ...

  2. 学习tornado:模板

    第一次接触tornado的template,是在做oastub的时候,因为一位同学在handler里面硬编码了html代码,我决定引入template机制来降低逻辑与页面的耦合. 简介 tornado ...

  3. 与大家分享学习微信小程序开发的一些心得

    因为我也才开始学习微信小程序不久,下文也是现在的一时之言,大家有不同的想法也可以在评论里共同交流讨论,希望文章能给大家提供一点点帮助. 最近接触到了一些前端框架,像Vue.js,React,发现小程序 ...

  4. Linux内核分析第一次学习报告

    Linux内核分析第一次学习报告 学生 黎静 学习内容 1.存储程序计算机工作模型 冯诺依曼体系结构:核心思想为存储程序计算机. CPU抽象为for循环,总是执行下一条指令,内存保存指令和数据,CPU ...

  5. 13本热门书籍免费送!(Python、SpingBoot、Entity Framework、Ionic、MySQL、深度学习、小程序开发等)

    七月第一周,网易云社区联合清华大学出版社为大家送出13本数据分析以及移动开发的书籍(Python.SpingBoot.Entity Framework.Ionic.MySQL.深度学习.小程序开发等) ...

  6. hnust 不爱学习的小w

    问题 C: 不爱学习的小W 时间限制: 2 Sec  内存限制: 64 MB提交: 1431  解决: 102[提交][状态][讨论版] 题目描述 “叮铃铃”上课了,同学们都及时到了教室坐到了座位上, ...

  7. Deep learning:四十(龙星计划2013深度学习课程小总结)

    头脑一热,坐几十个小时的硬座北上去天津大学去听了门4天的深度学习课程,课程预先的计划内容见:http://cs.tju.edu.cn/web/courseIntro.html.上课老师为微软研究院的大 ...

  8. Linux 第一次学习笔记

    一.Linux 为何物 Linux 就是一个操作系统,就像你多少已经了解的 Windows(xp,7,8)和 Max OS ,至于操作系统是什么,就不用过多解释了,如果你学习过前面的入门课程,应该会有 ...

  9. 20145211 《Java程序设计》第1周学习总结——小荷才露尖尖角

    教材学习内容总结 Java语言概述 Java是SUN1995年推出的一门高级编程语言,完全面向对象,安全可靠,具有跨平台性(用其编写的语言在任何系统上都能运行,只需安装一个JVM) Java三大平台包 ...

随机推荐

  1. Tcpdump usage examples

    In most cases you will need root permission to be able to capture packets on an interface. Using tcp ...

  2. HDU 2647 拓扑排序

    题意:每个人的工资至少888,然后有m个条件,前者比后者要多.求最少工资. 分析: 最开始的开邻接矩阵的肯定超时,如果dfs,会出现由于刚开始不是从入度为0的点出发,后期修改不了.比较麻烦. 正确方式 ...

  3. 【[HAOI2011]Problem c】

    好题啊 先考虑一些如何判掉无解的情况 我们开一个桶,存一下每个编号有多少个人必须选,之后做一个后缀和,之后我们扫一遍,如果一旦有一个后缀和\(pre[i]\)超过\(n-i+1\)就不合法了,因为我们 ...

  4. 记一次msfconsole_android渗透实验

    1>查看本机IP 2>生成App木马 3>将生成的木马安装至手机 4>打开msfconsole 1,  use exploit/multi/handler  加载模块. 2, ...

  5. 更改win7关机菜单选项功能

    说明:如果你不希望别人对你的电脑进行注销切换等操,那么可以使用如下的方法 实现效果:          实现步骤: 效果1 1>切换用户: 2>注销:(需重启资源管理器生效) 效果2:

  6. D - Going Home POJ - 2195 网络流

    On a grid map there are n little men and n houses. In each unit time, every little man can move one ...

  7. WebStorm11 注册码及激活

    网址:http://www.jianshu.com/p/5ce394a28ce5 1.获取注册码 打开第一个网址(IntelliJ IDEA 注册码),我们能看到下面的界面,直接点击获取激活码,将生成 ...

  8. DEM、DTM和DSM的区别

    一.DTM(Digital Terrain Model) 数字地面模型是利用一个任意坐标系中大量选择的已知x.y.z的坐标点对连续地面的一个简单的统计表示,或者说,DTM就是地形表面形态属性信息的数字 ...

  9. Cesium.js学习第二天(立方体)

    var viewer = new Cesium.Viewer('cs'); viewer.entities.add({//图标 position: Cesium.Cartesian3.fromDegr ...

  10. 【题解】洛谷P2926 [USACO08DEC]拍头Patting Heads

    洛谷P2926:https://www.luogu.org/problemnew/show/P2926 思路 对于每一个出现的数 从1到Max 凡是这个数的倍数 那么ans就加上他的个数 PS:最后要 ...