在实验室折腾附加题折腾了一个多钟没做出来……晚上回到宿舍决定再试一试,按原来的思路居然行了,目测在实验室的时候什么地方打错字了吧(心在流血)

实现晃过元素后出现跟随鼠标的悬浮窗,只有几行代码给我折腾了好久,前端的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考试后的一点小总结的更多相关文章

  1. 基于tomcat7 web开发中的一点小东西

    控制台: org.apache.jasper.compiler.TldLocationsCache tldScanJar 信息: At least one JAR was scanned for TL ...

  2. net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解

    asp.net core 内置DI容器的一点小理解   DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...

  3. 用C写一个web服务器(一) 基础功能

    .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...

  4. 用c#写的一个局域网聊天客户端 类似小飞鸽

    用c#写的一个局域网聊天客户端 类似小飞鸽 摘自: http://www.cnblogs.com/yyl8781697/archive/2012/12/07/csharp-socket-udp.htm ...

  5. 徒手用Java来写个Web服务器和框架吧<第三章:Service的实现和注册>

    徒手用Java来写个Web服务器和框架吧<第一章:NIO篇> 徒手用Java来写个Web服务器和框架吧<第二章:Request和Response> 这一章先把Web框架的功能说 ...

  6. 职业生涯之完成OCM考试后的感想

    背景知识:关于OCM认证,百科是这样描述的: Oracle Certified Master(OCM) 大师认证资质是Oracle认证的最高级别.此认证是对技术.知识和操作技能的最高级别的认可.Ora ...

  7. 转:C#写的WEB服务器

    转:http://www.cnblogs.com/x369/articles/79245.html 这只是一个简单的用C#写的WEB服务器,只实现了get方式的对html文件的请求,有兴趣的朋友可以在 ...

  8. 关于win8开发的一点小总结

    我今天做画面的时候,发现了一点小问题. 我在xmal文件里面加了一个CheckBox控件,设置IsChecked属性为True,并添加了Checked事件.Checked事件里面有对另外一个TextB ...

  9. 用C写一个web服务器(二) I/O多路复用之epoll

    .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...

随机推荐

  1. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  2. iOS开发常见错误解决方法

    1.出现下面的错误: StoryboardApp[8593:207] Failed to instantiate the default view controller for UIMainStory ...

  3. 让Bootstrap轮播插件carousel支持左右滑动手势的三种方法

    因为最近开发的项目涉及到移动设备上的 HTML5 开发,其中需要实现轮播效果.然后最快捷的方式,你知道的(Bootstrap),然后原生的 Bootstrap 的 carousel.js 插件并没有支 ...

  4. Provides PHP completions for Sublime Text

    来源:https://packagecontrol.io/packages/PHP%20Completions%20Kit php-completions php-completions plugin ...

  5. OC数组中文排序

    -(void)sortStudentInfo { if(studentInfoArray && studentInfoArray.count > 0) { for(TWDetai ...

  6. grep经常使用使用方法

    grep简单介绍 正如linux的man文件里所描写叙述的那样: grep searches the named input FILEs (or standard input if no files ...

  7. 《30天自制操作系统》读书笔记(2)hello, world

    让系统跑起来 要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实 ...

  8. iphone真机开发流程之--证书申请

    一.申请 1.进入ios开发者中心 http://www.apple.com.cn/developer/ios/index.html 2.点击登录 输入用户名和密码(前提:已经有Apple ID,且花 ...

  9. 《如何阅读一本书》(How to Read a Book)

    值得一读的书,有深入浅出,也有并不能完全读懂的部分,以下是第11章对之前内容的总结整理. 阅读的层次 1. 基础阅读 2. 检视阅读 3. 分析阅读 4. 主题阅读 分析阅读 第一阶段:这本书在谈些什 ...

  10. 版本控制工具——Git常用操作(上)

    本文由云+社区发表 作者:工程师小熊 摘要:用了很久的Git和svn,由于总是眼高手低,没能静下心来写这些程序员日常开发最常用的知识点.现在准备开一个专题,专门来总结一下版本控制工具,让我们从git开 ...