内容

  这次是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. <meta name="viewport" content="width=device-width, initial-scale=1.0">理解

    ViewPort <meta>标记用于指定用户是否可以缩放Web页面,如果可以,那么缩放到的最大和最小缩放比例是什么.使用ViewPort <meta>标记还表示文档针对移动设 ...

  2. Centos7安装完毕后无法联网的解决方法(转)

    今天在VMware虚拟机中经过千辛万苦终于安装好了centos7..正兴致勃勃的例行yum update 却发现centos系统貌似默认网卡没配置好,反馈无法联网.经过一番研究,终于让centos连上 ...

  3. HttpClient拉取连载小说

    上午刚入手的小说,下午心血来潮想从网站上拉取下来做成电子书,呵呵,瞎折腾-说做就做- [抓包] 这一步比什么都重要,如果找不到获取真正资源的那个请求,就什么都不用做了- 先是打算用迅雷把所有页面都下载 ...

  4. js常用函数汇总(不定期更新)

    1.图片按比例压缩 function setImgSize(){ var outbox_w=imgbox.width(), outbox_h=imgbox.height(); imgbox.find( ...

  5. traceroute工具

    traceroute是类Unix的命令工具,用于测试到网络上某台主机host的跳数以及延时情况.其运行原理是,通过发送指定TTL的UDP包给目的主机host,通过将TTL逐渐增大,就能收到一些ICMP ...

  6. June 13th 2017 Week 24th Tuesday

    There are no regrets in life, just lessons. 人生中没有后悔,只有教训. Some people can learn from their past mist ...

  7. May 19th 2017 Week 20th Friday

    Good luck is another name for tenacity of purpose. 好运不过是坚持不懈的结果. To some extent, I don't agree with ...

  8. Python-time和datetime模块

    一.time模块 1.表示时间的三种方式 >>> import time >>> time.time() #当前时间戳 1509525556.8485825 > ...

  9. Linq 集合比较

    List<RemindTbl> l_lstRemind = (from x in RemindTbl where (from y in RemindTblOld where x.Atten ...

  10. 【luogu P3369 普通平衡树(Treap/SBT)】 模板 Splay

    题目链接:https://www.luogu.org/problemnew/show/P3369 #include <cstdio> #include <algorithm> ...