Python之路,day22-BBS基础

Python之路,day22-BBS基础

多级评论

from  django.template import Library
from django.utils.safestring import mark_safe

register = Library()

@register.simple_tag
def truncate_upload_img(img_src):
    print(dir(img_src))
    print(img_src.name)
    return img_src.name.lstrip("/uploads/")

@register.simple_tag
def render_paginator_btn(articles,page):

    current_page = articles.number
    if abs(current_page - page) <= 5 :
        ele = """<li ><a href="?page={page}">{page}</a></li>""".format(page=page)
        return mark_safe(ele)

    return ‘‘

def build_comment_tree(comment_dic,obj):
    """递归的去把每个评论放到合适的层级里面"""

    for k,v in comment_dic.items():
        if obj.p_node ==  k: #代表找他了它父节点,把自己加到k下面
            print("[%s]找到了父节点[%s]" %(obj,k))
            comment_dic[k][obj] = {}
        else: #开始进行深度查询
            print("没找到,进入下一层查找",obj)
            build_comment_tree(comment_dic[k], obj)

def build_comment_html(comment_dic,margin_arg):
    """循环评论的字典, 拼接html"""

    comment_eles = ‘‘
    for k,v in comment_dic.items():
        comment_eles += ‘‘‘<div style=‘border:1px dashed black;padding:10px;margin-left:{margin}px‘>{user} ---- {date} --- {comment}</div>‘‘‘            .format(user=k.user,
                    date=k.date.strftime(‘%Y-%m-%d %H:%M:%S‘),
                    comment=k.comment,
                    margin=margin_arg)
        if v:

            comment_eles += build_comment_html(comment_dic[k],margin_arg+20)

    return comment_eles

@register.simple_tag
def load_comments(article_obj):

    #1.先把数据库里所有的这篇文章的评论查出来,转成字典
    #2.递归的循环这个字典,生成html评论元素

    comment_dic = {
    }

    comment_objs = article_obj.comment_set.all().order_by(‘date‘) #列表

    for obj in comment_objs:

        if not obj.p_node:#判断obj有没有p_node,没有的话,那它自己就是顶级评论
            comment_dic[obj] = {}
        else: #有父亲节点
            build_comment_tree(comment_dic,obj)
    print(comment_dic)

    comment_list = sorted(comment_dic.items(),key=lambda x:x[0].date)
    print("comment objs:",comment_list)

    comment_html = """"""

    for comment_branch in comment_list:
        margin_arg=0
        branch_ele = """<div style=‘border:1px dashed black;padding:10px;margin-left:{margin}px‘>{user} ---- {date} --- {comment}</div>""".            format(user=comment_branch[0].user,
                   date=comment_branch[0].date.strftime(‘%Y-%m-%d %H:%M:%S‘),
                   comment=comment_branch[0].comment,
                   margin=margin_arg)
        comment_html += branch_ele

        #开始构建它的子级评论的元素
        comment_html +=  build_comment_html(comment_branch[1],margin_arg+20)

    return mark_safe(comment_html)

  

webqq

from django.shortcuts import render,HttpResponse
from django.views.decorators.csrf import csrf_exempt
from webqq.msg_handler import MsgHandler
import queue,json
# Create your views here.

MSG_QUEUES = {}

def dashboard(request):

    print("user--",request.user.userproifle)
    return render(request,"webqq/dashboard.html")

#@csrf_exempt
def msg_api(request):

    msg_obj = MsgHandler(request, MSG_QUEUES)
    if request.method == "POST":

        msg_obj.msg_send()
        return HttpResponse(json.dumps({"msg_send_status": 1}))
    else:
        msg_data = msg_obj.msg_recv()
        return HttpResponse(json.dumps(msg_data))

  

  1 {% extends ‘index.html‘ %}
  2
  3 {% block extra-head-resources %}
  4     <link href="/static/css/webqq_style.css" rel="stylesheet">
  5
  6 {% endblock %}
  7
  8
  9 {% block container %}
 10 <div  class="row" style="margin-top: 50px;height: 100%;">
 11 {% csrf_token %}
 12     <div class="col-lg-2 contact_list">
 13
 14         <ul class="nav nav-tabs" role="tablist">
 15           <li role="presentation"><a href="#contacts" aria-controls="contacts" role="tab" data-toggle="tab">c</a></li>
 16           <li role="presentation"><a href="#groups" aria-controls="groups" role="tab" data-toggle="tab">g</a></li>
 17
 18         </ul>
 19
 20
 21          <div class="tab-content">
 22             <div role="tabpanel" class="tab-pane active" id="contacts">
 23
 24                 <div class="list-group">
 25                     {% for contact in request.user.userproifle.friends.all %}
 26
 27                         <a href="#" class="list-group-item" contact_id="{{ contact.id }}" contact_name="{{ contact.name }}" onclick="OpenSession(this)">{{ contact }}
 28 {#                            <span class="badge">14</span>#}
 29                         </a>
 30
 31                     {% endfor %}
 32
 33                 </div>
 34
 35             </div>
 36             <div role="tabpanel" class="tab-pane" id="groups">groups</div>
 37           </div>
 38
 39
 40
 41     </div>
 42     <div class="col-lg-8  chat_panel">
 43
 44         <div class="row chat_panel_header">
 45
 46             <div class="hidden" style="color: green">
 47                 正在与<span contact_id="" id="chat_panel_header_text"></span>聊天
 48             </div>
 49         </div>
 50
 51         <div class="row chat_panel_body">
 52             body
 53         </div>
 54
 55         <div class="row chat_panel_input_box">
 56
 57             <textarea id="msg_input_box" class="msg_input_box">
 58
 59
 60
 61             </textarea>
 62
 63         </div>
 64
 65     </div>
 66
 67
 68 </div>
 69
 70
 71 {% endblock %}
 72
 73
 74 {% block bottom-js %}
 75
 76 <script>
 77
 78     $(document).ready(function () {
 79
 80          csrfmiddlewaretoken  = $("input[name=‘csrfmiddlewaretoken‘]").val();
 81
 82
 83          $("body").delegate("textarea", "keydown",function(e){
 84                 if(e.which == 13) {//Enter key down
 85                     //send msg button clicked
 86                     var msg_text = $("textarea").val();
 87                     if ($.trim(msg_text).length > 0){
 88                         //console.log(msg_text);
 89                         SendMsg(msg_text);
 90                     }
 91                     //no wait the send_msg‘s call confirm msg
 92                     AddSentMsgIntoBox(msg_text);
 93                     $("textarea").val(‘‘);
 94                 }
 95          });//end body
 96
 97
 98
 99
100          /*setInterval(function () {
101              LoadNewMsgs();
102          },1000)*/
103
104           LoadNewMsgs();
105
106
107
108
109     });//end doc ready
110
111
112     function LoadNewMsgs() {
113
114
115
116         $.get("{% url ‘get_msg‘ %}",function(callback){
117             console.log("get_msg callback:",callback);
118             return LoadNewMsgs();
119         });//end get
120     }
121
122     function SendMsg(msg) {
123         console.log("going tosend msg" + msg);
124
125
126
127         var msg_data = {
128             ‘csrfmiddlewaretoken‘:csrfmiddlewaretoken,
129             ‘from‘:"{{ request.user.userproifle.id }}",
130             ‘to‘: $("#chat_panel_header_text").attr("contact_id"),
131             ‘data‘:msg
132         }
133         $.post("{% url ‘msg_api‘ %}", msg_data ,function(callback){
134
135             var callback = JSON.parse(callback); //json反序列化
136             console.log("msg_send_status:",callback.msg_send_status);
137             if ( callback.msg_send_status != 1){
138                 alert("消息发送失败:"+ msg);
139             }
140         });//end post
141
142
143     }
144     function AddSentMsgIntoBox(msg_text) {
145         var d = new Date();
146         var msg_ele = "<div>   <div>{{ request.user.userproifle.name }}  "+ d.getHours() + ":" +d.getMinutes() + ":" + d.getSeconds() + "</div>";
147         msg_ele += "<div>" + msg_text +"</div> </div>";
148         $(".chat_panel_body").append(msg_ele);
149
150
151         $(‘.chat_panel_body‘).animate({
152             scrollTop: $(‘.chat_panel_body‘)[0].scrollHeight}, 500)
153
154     }
155     function  OpenSession(ele) {
156         var contact_id = $(ele).attr("contact_id");
157         var contact_name = $(ele).attr("contact_name");
158         $(ele).addClass("active");
159         $(ele).siblings().removeClass("active");
160         $("#chat_panel_header_text").text(contact_name);
161         $("#chat_panel_header_text").parent().removeClass("hidden");
162         $("#chat_panel_header_text").attr("contact_id",contact_id);
163
164     }
165
166
167
168
169
170
171 </script>
172
173
174 {% endblock %}
时间: 2024-12-28 11:38:57

Python之路,day22-BBS基础的相关文章

Python 之路 Day06 类基础和概念

本章大纲: 类的对象和类的区别 类的名称空间 __dict__ 类的对象的名称空间 __dict__ 绑定方法和非绑定方法 类和类型 变量变形(封装变量,控制变量引用)__ 类的绑定方法 id命令分析内存地址(类的名称空间属性和类对象名称空间属性内存指向) is命令(比较内存地址指向) property类对象的属性方法 staticmethod类对象的非绑定方法 __str__自定义str(self)  类对象字符串格式打印 类的继承 __bases__显示类的继承 类的继承查找顺序 类的继承查

Python之路,day16-Python基础

Python之路,day16-javascript基础 发展历史:     1.table     2.table + css     3.div + css js: js简介: 1.JavaScript 被设计用来向 HTML 页面添加交互行为. 2.JavaScript 是一种脚本语言(脚本语言是一种轻量级的编程语言). 3.JavaScript 通常被直接嵌入 HTML 页面. 4.JavaScript 是一种解释性语言(就是说,代码执行不进行预编译) 浏览器---解释器: 1.html解

Python之路,day13-Python基础

一.redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周

Python之路,day3-Python基础

三级菜单 1 menu = { 2 '北京':{ 3 '海淀':{ 4 '五道口':{ 5 'soho':{}, 6 '网易':{}, 7 'google':{} 8 }, 9 '中关村':{ 10 '爱奇艺':{}, 11 '汽车之家':{}, 12 'youku':{}, 13 }, 14 '上地':{ 15 '百度':{}, 16 }, 17 }, 18 '昌平':{ 19 '沙河':{ 20 '老男孩':{}, 21 '北航':{}, 22 }, 23 '天通苑':{}, 24 '回龙观

Python之路-Linux命令基础(4)

作业一: 1)开启Linux系统前添加一块大小为15G的SCSI硬盘 2)开启系统,右击桌面,打开终端 3)为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区,大小为5G 4)格式化主分区为ext3系统 5)将逻辑分区设置为交换分区 6)启用上一步的交换分区 7)查看交换分区的状态 作业二:free命令查看内存 整理buffer与cache的作用 计算真实的内存使用率 buffer: 缓冲区,是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘

Python之路 day2 文件基础操作

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author:ersa 4 ''' 5 #f,文件句柄;模式 a : append 追加文件内容 6 f = open("yesterday2",'a',encoding="utf-8") 7 8 f.write("\nWhen i was yount i listen to the radio\n") 9 f.write("I lo

Python之路,day5-Python基础

for#列表生成式 1 data = [1,2,3,4,5,6,7] 2 3 #####列表生成式 4 #data = [i+1 for i in data] 5 6 data = [i*2 if i>5 else i for i in data] 7 8 print(data) 9 10 11 data = [i//2 if i>4 else i for i in data] 12 13 print(data) 1.生成器 yield a #返回a,同时挂起当前这个函数yield a #返回

Python之路,day11-Python基础

回顾:进程一个程序需要运行所需的资源的集合每个进程数据是独立的每个进程里至少有一个线程进程里可以有多个线程线程数据是共享的 一个进程的多个线 6程可以充分利用多核cpu multiprocessing pipe queue 实现的是进程间的数据传递,通信 manager 实现了多进程间的数据共享 进程间共享数据的代价是高昂的,所以要尽量避免进程间的数据共享 线程间的数据本来就是共享的 线程要修改同一份数据,必须加锁,互斥锁mutex event 线程间交互 生产者消费者模型 解耦 (降低进程间的

Python之路,day7-Python基础

os.system 输出命令结果到屏幕,返回命令执行状态os.popen("dir").read()#会保存命令的执行结果输出 py2.7commandscommands.getstatusoutput("dir")#windows不好用#linux可以 subprocess==================================面向对象 模板造对象 一.类的特性 1.封装 防止数据被随意修改 使外部程序不需要关注对象内部的构造(逻辑结构),只需要通过此