内容

  这次是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. 记录项目代码迁移后,UI测试框架的搭建(配置文件的修改、测试脚本试运行)

    前文:记录一次项目代码迁移过程 上文代码迁移的目的就是为了新增vue脚手架自带的UI测试框架,工具有了,就需要实践运行在项目中了(修改配置文件.编写测试脚本等). 一.单元测试 测试框架 karma ...

  2. HCNA调整RIP的运行版本

    1.拓扑图 2.实验配置 R1配置RIPv1 md5加密认证 Please press enter to start cmd line! ############################### ...

  3. March 30 2017 Week 13 Thursday

    I learned the value of hard work by working hard. 只有真的努力了,才会知道努力的价值. On the day, March 12th 2017, I ...

  4. ZT在谷歌上班感受如何?

    在谷歌上班感受如何? 2013-11-05 作者:腾讯科技 出处: 互联网 责编:zlu     在谷歌这家全球最大最有抱负的技术公司工作将是怎样的情景呢?是天堂般的享受,还是地狱般的折磨呢?下面看一 ...

  5. 通过一个实际例子理解Kubernetes里pod的自动scale - 水平自动伸缩

    kubectl scale命令用于程序在负载加重或缩小时进行pod扩容或缩小,我们通过一些实际例子来观察scale命令到底能达到什么效果. 命令行创建一个deployment: kubectl run ...

  6. 设计模式——观察者模式(ObserverPattern)

    观察者模式(ObserverPattern):观察者模式又称发布-订阅(Publish/Subscribe)模式,定义了一个中一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状 ...

  7. 【[CTSC2018]混合果汁】

    题目 \(CTSC\)也有这么水的题啊 首先看到美味值来自于最小的美味值,我们就可以先考虑把所有的果汁按照美味值排序 接下来可以考虑二分,二分出一个\(mid\)我们只使用美味值大于等于\(mid\) ...

  8. 再回首数据结构—AVL树(一)

    前面所讲的二叉搜索树有个比较严重致命的问题就是极端情况下当数据以排序好的顺序创建搜索树此时二叉搜索树将退化为链表结构因此性能也大幅度下降,因此为了解决此问题我们下面要介绍的与二叉搜索树非常类似的结构就 ...

  9. 从OC和C#中找乐趣:相同又不同的delegate

    不想说话,本来第一段打了一大堆废话,结果浏览器崩溃了...直接进入正题吧.看Demo: C#里面也有delegate,我今天的目的就是模仿着OC里面的写法来写一个网络请求模拟类.先建一个“Protoc ...

  10. scr 和 href 区别

    HTML中的href和src有什么区别? 加载js的时候,用到的是<script style='text/javascript' src='js/demo.js'></script& ...