写在Web考试后的一点小总结
在实验室折腾附加题折腾了一个多钟没做出来……晚上回到宿舍决定再试一试,按原来的思路居然行了,目测在实验室的时候什么地方打错字了吧(心在流血)
实现晃过元素后出现跟随鼠标的悬浮窗,只有几行代码给我折腾了好久,前端的JS果然debug困难 打错字都没提示OTZ 下次试试strict mode好了……
简而言之就是mouseover的时候show,mouseout的时候hide,mousemove的时候跟着改坐标
// tweet.js
$('#avatar').mouseover(function(e){
$('#tip').show();
});
$('#avatar').mousemove(function(e){
var offset = $('#avatar').offset();
var x = e.pageX - offset.left + 10;
var y = e.pageY - offset.top + 10;
$('#tip').css({"left": x + "px", top: y + "px"});
});
$('#avatar').mouseout(function(e){
$('#tip').hide();
});
在实验室的时候贪方便,数据库操作写到其他函数里,连接的代码复制粘贴重复了N遍,回去重新写了一下,直接放到application里,大家一起用:
#main.py
conn = pymongo.Connection("localhost", 27017)
twitterDB=conn["twitterDB"]
self.db = twitterDB.userSets
用的时候直接写self.application.db就可以了。因为userinfo只有一个instance,为了效率包数据的时候用namedtuple代替了class(看了知乎一个实习生笔试被拒的问答之后对“过度封装"格外敏感……),mongodb的查询回来之后被我改成了用projection提高效率(其实第二个抓tweets的操作也可以用projection的不过懒得写了……)
# main.py class MainPageHandler(BaseHandler):
"""Handle the main page."""
def get(self, index):
# retrieve data from local database
user = self.get_current_user()
# project user info and put it into a dict
info_dict = self.application.db.find_one({"name": user},
{"_id": 0, "name": 1, "image": 1, "age": 1, "email": 1})
# get tweets of the user
tweets = self.application.db.find_one({"name": user})['tweets'] # Since there's only one user per page, use namedtuple
info = namedtuple('Info', info_dict.keys())(*info_dict.values()) self.render('twitter.html', info=info, tweets=tweets, user=user)
AJAX操作方面用Jquery搞定,Prototype比较没那么灵活的样子(JSON一定要写清楚类型),不过安全起见还是多给header设置了几句。在TA的提示下给提交后的callback加了清空文本框,稍微自然一点。
实验室只有chrome,拿回去测试的时候发现FF下不行,看log发现点按钮之后给定的AJAX POST专用的url没动静,反而原来页面的url有个不成功的POST,也就是event.preventDefault()没有起到作用。google了一下发现是FF没有全局的event,所以不能写$("#submitTweet").click(function(){}),必须写$("#submitTweet").click(function(event){}),不然里面的函数拿不到event就取消不了按钮按下去的缺省效果
$("#submitTweet").click(function(event) {
event.preventDefault();
var tweet = {
time: $.datepicker.formatDate('M. dd, yy', new Date()),
content: $('#tweet-content').val()
};
$.ajax({
url: '/ajax/addTweet',
datatype: "json",
type: "POST",
data: JSON.stringify(tweet),
contentType: "application/json charset=utf-8",
processData: false,
success: function (data) {
insertTweet(tweet.time, tweet.content);
$('#tweet-content').val('');
},
error: function(e){
alert(e);
}
});
});
后端用了tornado自带的json_decode,忘了之前做什么东西的时候被py自带的json.loads坑过,用tornado带的比较安全一点
class addTweet(BaseHandler):
"""Get tweet posted with AJAX and save it to the local database."""
def post(self):
newTweet = tornado.escape.json_decode(self.request.body)
user = self.get_current_user()
record = self.application.db.find_one({"name": user})
record['tweets'].append(newTweet)
self.application.db.save(record)
为了方便debug写了几个print语句,会夹进log显示在终端, 方便看到数据库操作结果。有空试试看学着用logging,不要直接print……
另外回来之后帮人debug,发现好多人有出错不仔细看log啊= =b
考试之前还写了个自定义的404,关键在于给其他RequestHandler继承的类里面要记得定义get_error_html,并且这个函数不能用render,要用render_string,不过写法还是一样,模版放在老地方
class BaseHandler(tornado.web.RequestHandler):
def get_error_html(self, status_code, **kwargs):
return self.render_string("404.html",
err=kwargs.get('message', None))
然后在RequestHandler里有需要丢404的地方写
self.send_error(404, **error)
就可以了。其他状态码同理,加if语句配置就行。不想全都继承的话在只有需要的类里面定义get_error_html也OK。
代码依然在Github上
https://github.com/joyeec9h3/WebHWs/tree/master/Web2_0course
写在Web考试后的一点小总结的更多相关文章
- 原生ES6写的Web游戏:ES6-Mario,小美女,小帅哥快来玩啊~~
? ES6-Mario 这是一个用原生ES6语法和HTML5新特性写成的Web 游戏. 通过这个项目,你可以在实践中对ES6的主要内容.HTML Canvas 相关API以及Webpack的基础配置有 ...
- 基于tomcat7 web开发中的一点小东西
控制台: org.apache.jasper.compiler.TldLocationsCache tldScanJar 信息: At least one JAR was scanned for TL ...
- net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解
asp.net core 内置DI容器的一点小理解 DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...
- 用C写一个web服务器(一) 基础功能
.container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...
- 使用Node.js原生API写一个web服务器
Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...
- [技术博客] 软工-Ruby on Rails前端工具链的配置以及对Web应用结构设计的一点思考
一.相关工具链简介 HAML HAML是专门面向Ruby on Rails模版语法设计的一门标记语言,其结合RoR的views部分模版语法的特点,对原来的*.html.erb(嵌入Ruby代码的HTM ...
- 用c#写的一个局域网聊天客户端 类似小飞鸽
用c#写的一个局域网聊天客户端 类似小飞鸽 摘自: http://www.cnblogs.com/yyl8781697/archive/2012/12/07/csharp-socket-udp.htm ...
- 徒手用Java来写个Web服务器和框架吧<第三章:Service的实现和注册>
徒手用Java来写个Web服务器和框架吧<第一章:NIO篇> 徒手用Java来写个Web服务器和框架吧<第二章:Request和Response> 这一章先把Web框架的功能说 ...
- 职业生涯之完成OCM考试后的感想
背景知识:关于OCM认证,百科是这样描述的: Oracle Certified Master(OCM) 大师认证资质是Oracle认证的最高级别.此认证是对技术.知识和操作技能的最高级别的认可.Ora ...
随机推荐
- python基础---- __getattribute__----__str__,__repr__,__format__----__doc__----__module__和__class__
目录: 一. __getattribute__ 二.__str__,__repr__,__format__ 三.__doc__ 四.__module__和__class__ 一. __getattri ...
- iOS之富文本(一)
NSAttributedString叫做富文本,是一种带有属性的字符串,通过它可以轻松的在一个字符串中表现出多种字体.字号.字体大小等各不相同的风格,还可以对段落进行格式化. 通过以下代码即可实现上面 ...
- Adaboost 算法的原理与推导——转载及修改完善
<Adaboost算法的原理与推导>一文为他人所写,原文链接: http://blog.csdn.net/v_july_v/article/details/40718799 另外此文大部分 ...
- 8.Android_UiAutomator 报告查看
一.Android UiAutomator报告查看 1.错误类型 1)断言错误:就是断言这个用例的成功或者失败(AssrtionFailedError) 2)脚本错误:UiObjectNotFound ...
- Xshell连接Linux服务器总掉线
Xshell连接linux服务器总掉线,解决办法如下: 1.登录服务器后 [root@test134 ~]# cd /etc/ssh/ [root@test134 ssh]# vim sshd_con ...
- Nginx--try_files
Nginx的配置语法灵活,可控制度非常高.在0.7以后的版本中加入了一个try_files指令,配合命名location,可以部分替代原本常用的rewrite配置方式,提高解析效率. 作用域:se ...
- svn常见错误
1.svn提交报错:svn: Aborting commit:XXXXXremains in conflict 解决:说明Svn服务器上的对应内容,在你上次Update后已被别人修改了,而你也做了修改 ...
- DIV+CSS制作斜线效果记录
DIV+CSS 斜线效果很简单,只需设置一下CSS Border 的边框就能有斜线效果.代码分享给大家,你可以自己变通. 提示要注意两点:1.DIV宽高的定义.2.DIV在 IE6 中默认是有高度的. ...
- 基于Node的Web聊天室
1 项目名称 Web聊天室(<这是NodeJs实战>第二章的一个案例,把整个开发过程记录下来)
- 修改ecshop后台的管理菜单
ecshop后台菜单如何去修改,下面ecshop开发中心如何去修改 首先先打开后台菜单项相关文件: admin\includes\inc_menu.php languages\zh_cn\admin\ ...