实践:Backbone作前端,Django+Tastypie作后端的简单Web在线聊天室

一、界面设计:

二、数据模型设计

id 每个发言都有一个独立的id由tastypie自动生成

content 发言的内容

username 发言者

date 发言时间

三、前端制作

这里没有用到Backbone的Router,因为这里不需要记录hash记录

1.Div+CSS制作静态页面,这里item-template为每一个发言的模版

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style type="text/css">
        ul, li {
            margin:0px;
            padding:0px;
            list-style:none;
        }
        body {
        }
        #wrapper {
            width:1000px;
            margin:0px auto;
        }
            #wrapper .header {
                width: 100%;
                background-color: rgb(46, 177, 232);
            }
            #wrapper .content {
                width: 100%;
            }
                #wrapper .content .username {
                    color: red;
                }
                #wrapper .content .time {
                    color: orange;
                }
                #wrapper .content .item_content {
                    color: blue;
                }
            #wrapper .content_ul, #wrapper .item {
                background-color: rgb(237, 237, 237);
                padding: 10px;
            }
            #wrapper .destroy{
                color: green;
                font-weight: bold;
                cursor: pointer;
            }
            #wrapper .footer {
                width:100%;
                float: left;
                background-color: rgb(46, 177, 232);
                padding: 10px 0px;
            }
                #wrapper .footer .fl {
                    width:80%;
                    float:left;
                }
                #wrapper .footer .fr{
                    width:20%;
                    float:left;
                }
                    #wrapper .footer .fr::after {
                        clear:both;
                    }
        #new_chat {
            width: 100%;
            height: 80px;
        }
        #wrapper .footer .fr_up {
            margin-left: 30px;
            margin-bottom: 10px;
        }
        #wrapper .footer .fr_down {
            margin-left: 30px;
        }
        #nickname {
            width: 97px;
        }
        #wrapper .footer .send {
            width: 150px;
            background-color: green;
            display: block;
            text-align: center;
            padding: 20px;
            text-decoration: none;
        }

    </style>
</head>
<body>
    <div id="wrapper">
        <div class="header">
           [ Chat Room Beta 1.0 ]
        </div>
        <div class="content">
            <ul class="content_ul">
            </ul>
        </div>
        <div class="footer">
            <div class="fl"><textarea id="new_chat" autofocus></textarea></div>
            <div class="fr">
                <div class="fr_up">
                    呢称:<input id="nickname" type="text"/>
                </div>
                <div class="fr_down">
                    <button class="send" id="send">发送消息</button>
                </div>
            </div>
        </div>
    </div>
    <script type="text/template" id="item-template">
            <span class="username"><%=username %></span> : <span class="time"><%=date %></span> <a class="destroy">X</a><br />
            <span class="item_content"><%=content %></span>
    </script>

    <script src="/static/chatroom/js/vendor/jquery.js"></script>
    <script src="/static/chatroom/js/vendor/underscore.js"></script>
    <script src="/static/chatroom/js/vendor/backbone.js"></script>
    <script src="/static/chatroom/js/models.js"></script>
    <script src="/static/chatroom/js/views.js"></script>
</body>
</html>

2.Backbone Models 文件,为了方便,这里把model与collection都放到同一文件了,\static\chatroom\js\models.js

var Chat = Backbone.Model.extend({

    urlRoot: ‘/api/v1/chat/‘,

    defualts: {
        content: ‘‘,
        username: ‘‘,
        date: ‘‘
    },

    clear: function () {
        this.destroy();
    }
});

var ChatList = Backbone.Collection.extend({

    url: ‘/api/v1/chat/‘,
    parse: function (response) {
        return response.objects;
    },

    model: Chat

});

3.Backbone Views文件,为了方便,参照todoMVC把视图划分为两个,一个是ChatView用于每个发言,一个为AppView用于整体处理,这里把ChatView与AppView都放到同一文件了,\static\chatroom\js\views.js

var chatList = new ChatList;//New 一个Collection下面会用到
var ChatView = Backbone.View.extend({
    tagName: ‘li‘,
    className: ‘item‘,

    template: _.template($(‘#item-template‘).html()),
    events: {
        ‘click .destroy‘: ‘clear‘
    },

    initialize: function () {
        _.bindAll(this, ‘render‘, ‘remove‘);
        this.model.bind(‘change‘, this.render);
        this.model.bind(‘destroy‘, this.remove);
    },

    render: function () {
        $(this.el).html(this.template(this.model.toJSON()));
        This = $(this.el).find(‘.time‘);
        This.text(This.text().split(‘.‘)[0].replace(‘T‘,‘ ‘));//注意这里tastypie提供的时间格式为:2015-03-01T23:52:26.854388 所以要对时间进行格式化一下
        return this;
    },

    clear: function () {
        this.model.clear();
    }
});

var AppView = Backbone.View.extend({
    el: $(‘#wrapper‘),

    events: {
        "click #send": "say"
    },

    initialize: function () {
        _.bindAll(this, ‘addOne‘, ‘addAll‘);
        this.nickname = this.$(‘#nickname‘);
        this.textarea = this.$("#new_chat");

        chatList.bind(‘add‘, this.addOne);
        chatList.bind(‘reset‘, this.addAll);
        chatList.fetch();
        setInterval(function () {
            chatList.fetch({ add: true });
        }, 5000);
    },

    addOne: function (chat) {
        //页面所有的数据都来源于server端,如果不是server端的数据,不应添加到页面上
        if (!chat.isNew()) {
            var view = new ChatView({ model: chat });
            this.$(".content_ul").append(view.render().el);
            $(‘.content‘).scrollTop($(".content_ul").height() + 50);
        }
    },

    addAll: function () {
        chatList.each(this.addOne);
    },

    say: function (event) {
        chatList.create(this.newAttributes());
        //为了满足IE和FF以及chrome
        this.textarea.text(‘‘);
        this.textarea.val(‘‘);
        this.textarea.html(‘‘);

    },

    newAttributes: function () {

        var content = this.textarea.val();
        if (content == ‘‘) {
            content = this.textarea.text();
        }

        return {
            content: content,
            username: this.nickname.val()
        };
    }
});

var appView = new AppView;//启动程序

到这里前端代码已经完成。

四、后端处理

这里用Django自带的SQLite作后台数据库

1.Django Model文件-D:\project\mysite\ChatRoom\models.py

from django.db import models

class Chat(models.Model):
    content = models.CharField(max_length=1024)
    username = models.CharField(max_length=1024)
    date = models.DateTimeField(auto_now_add=True)

2.配置TastyPie API文件-D:\project\mysite\ChatRoom\api\resources.py

from tastypie.authorization import Authorization
from tastypie import fields
from tastypie.resources import ModelResource
from ChatRoom.models import Chat

class ChatResource(ModelResource):
    class Meta:
        queryset = Chat.objects.all()
        resource_name = ‘chat‘
        authorization = Authorization()
        fields=[‘id‘,‘username‘,‘content‘,‘date‘]

3.Restfull API的Url文件配置-D:\project\mysite\mysite\urls.py

from django.conf.urls import patterns, include, url
from tastypie.api import Api
from ChatRoom.api.resources import ChatResource

v1_api = Api(api_name=‘v1‘)
v1_api.register(ChatResource())

urlpatterns = patterns(‘‘,
    url(r‘^admin/‘, include(admin.site.urls)),
    url(r‘^api/‘, include(v1_api.urls)),
)

把数据库导好及配置好Tastypie,运行测试,可以正常留言!

参考引用

http://www.the5fire.com/

https://github.com/tastejs/todomvc

时间: 2024-10-08 20:49:08

实践:Backbone作前端,Django+Tastypie作后端的简单Web在线聊天室的相关文章

django+ajax实现在线聊天室

django+ajax实现在线聊天室 小项目中的一个,就是简单的聊天室 需求: 注册登陆之后才能发言 初始在聊天框中展示最近的消息 发送消息使用ajax,在后台完成消息的存储 使用轮循不断请求get新消息展示在聊天框中 Models 设计聊天消息主题的结构: class Chat(models.Model): sender = models.ForeignKey(User, related_name='has_chats') content = models.TextField() time =

Django + WebSocket + Redis 在线聊天室题文章

话不多说先上效果图演示 项目:http://112.74.164.107:9990/ 1.安装组建 redis: yum install redis/apt install redis 2.创建虚拟化环境并进入 python3/python -m venv venv source venv\bin\active 3.安装第三方库pip install -r requirements.txt 4.初始化python manage.py makemigrations python manage.py

Django+Tastypie作后端,RequireJS+Backbone作前端的TodoMVC

一.配置好环境 接着前一篇的例子,顺带测试一下已下载下来example里面的backbone_require的例子 注意:直接本地用backbone.localStorage插件运行TodoMVC会报错,因为RequireJS工作时,加载js文件及template文件是异步加载,这就好比ajax异步请求需要涉及到跨域的问题,文件必须要在同一下域下才能被异步加载. 因此,直接把所有文件放到上篇文件的static(E:\project\tastypie\mysite\blog\static)目录下,

WebSocket 网页聊天室的实现(服务器端:.net + windows服务,前端:Html5)

websocket是HTML5中的比较有特色一块,它使得以往在客户端软件中常用的socket在web程序中也能轻松的使用,较大的提高了效率.废话不多说,直接进入题. 网页聊天室包括2个部分,后端服务器+前端页面. 1.后端服务部分:.net4.0 + windows服务.相比寄宿在iis中,寄宿在进程中的windows服务更加的稳定可靠(文章中的例子用windows控制台程序演示,后面给出完整的windows服务的代码). 2.前端部分:html5 + jQuery + bootstrap.基本

&lt;&lt;Python编程:从入门到实践&gt;&gt;踩坑记 Django

<<Python编程:从入门到实践>>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是virtual studio code , 测试起来很是难受,因为我配置的debug环境,断点操作没有作用. 经过我不断的测试,才发现我失败的原因是由于之前的误操作,先建立new_pizzas.py后改为new_pizzas.html的,错误就在这里.在我之后新建

写给刚入门的前端工程师的前后端交互指南

转自原文 写给刚入门的前端工程师的前后端交互指南 作为刚接触前端的不久的童鞋,大家都会兴奋于CSS和JS所带来漂亮界面,然而,前端工程师除了UI重构外,还有非常重要的职责在正确的区域渲染出服务端的数据.毕竟,我们要构建一个大的web应用,必然不是普普通通的静态页面构成. 下文将罗列将来前端工程师应该必备的同后端打交道的常用技能. 服务端渲染 谈起服务端渲染,对于动态服务而言,这个世界上跑的大多数页面都经历过服务端的数据渲染,接口->前端赋值->模版渲染 .这一切都在服务器完成,我们查看源码时候

Android网络(3):HttpClient作客户端,Tomcat Servlet作服务器的交互示例

前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后台服务器用Eclipse的JavaEE版最好的,但单就Tomcat来说(不写jsp之类的),本文下面的服务器方面操作在普通版的Eclipse也是可以的.我这里为了和ADT-bundle分开,特意重新安个JavaEE版的Eclipse.] 1.下载Eclipse的Tomcat插件:http://www

购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session

原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session chsakell分享了前端使用AngularJS,后端使用ASP.NET Web API的购物车案例,非常精彩,这里这里记录下对此项目的理解. 文章:http://chsakell.com/2015/01/31/angularjs-feat-web-api/http://chsakell.com/2015/03/07/angularjs-feat-web-api-en

synergy配置 Ubuntu作Server, Win 7作client

Synergy 允许你轻松地在你办公桌上多台计算机之间共享你的鼠标和键盘,它免费并且开放源代码.你只要将鼠标(指针)从一台计算机的屏幕边缘移出到另一个屏幕就行 了.甚至可以共享你的剪贴板.你所需要的仅仅是一个网络连接.Synergy是跨平台的(可以运行于Windows,Mac OS X和Linux). 下载地址: http://symless.com/download/free/ 我是用Ubuntu作server,win7作client配置synergy 客户端: win7的client比较好配