Django SNS 微博项目开发
1、功能需求
- 一个人可以follow很多人
- 一个用户如果发了新weibo会自动推送所有关注他的人
- 可以搜索、关注其它用户
- 可以分类关注
- 用户可以发weibo, 转发、收藏、@其它人
- 发微博时可选择公开、隐私、只能好友看等
- 可私信聊天
- 热门微博无需关注
- 我的微博列表
- 可以评论、点赞微博
- 发微博时可以上传图片、视频、可以发表情
2.1 设计架构前需要考虑的问题
- weibo目前的架构经历了多次演变才做到目前支持大并发的成熟产品, 我们在设计架构时要考虑以下问题
- 亿级用户数据的存储如何高效实现?
- 用户发一条微博,后台要进行入库、分发、推送等多个动作才能完成,如何让用户感觉发微博速度快?
- 用户发weibo要推送给关注他的人,如何提高推送效率?
- 如何降低不同产品、模块、服务之前的耦合,使产品、功能的水平扩展等?
- “Break large complex systems down into many services… google.com search touches 100s of service(ads, web search, books, news, spelling correction…”
- 如何做到去中心化,避免单点及瓶颈
- 如何实现接口安全
2.2 架构实现
所需服务组件:
- django: 用户页面呈现
- nginx: 前端高并发必备
- cdn:异地高并发、静态内容速度快必备
- redis: 热点weibo\话题数据高效存储
- rabbitMQ: 用户weibo推送
- SOA:服务解耦,服务接口化
- zabbix,nagios: 系统监控
- google analysis: 用户访问质量、行为分析监控
用户发微博流程图

3.表结构设计
from django.db import models
from django.contrib.auth.models import User
# Create your models here. class Weibo(models.Model):
'''所有微博'''
wb_type_choices = (
(0,'new'),
(1,'forward'),
(2,'collect'),
)
wb_type = models.IntegerField(choices=wb_type_choices,default=0)
forward_or_collect_from = models.ForeignKey('self',related_name="forward_or_collects",blank=True,null=True)
user = models.ForeignKey('UserProfile')
text = models.CharField(max_length=140)
pictures_link_id = models.CharField(max_length=128,blank=True,null=True)
video_link_id = models.CharField(max_length=128,blank=True,null=True)
perm_choice = ((0,'public'),
(1,'private'),
(2,'friends'))
perm = models.IntegerField(choices=perm_choice,default=0)
date = models.DateTimeField(auto_now_add=True) def __str__(self):
return self.text class Topic(models.Model):
'''话题'''
name = models.CharField(max_length=140)
date = models.DateTimeField()
def __str__(self):
return self.name
class Category(models.Model):
'''微博分类''' name = models.CharField(max_length=32)
def __str__(self):
return self.name class Comment(models.Model):
'''评论'''
to_weibo = models.ForeignKey(Weibo)
p_comment = models.ForeignKey('self',related_name="child_comments")
user = models.ForeignKey('UserProfile')
comment_type_choices = ((0,'comment'),(1,'thumb_up'))
comment_type = models.IntegerField(choices=comment_type_choices,default=0)
comment = models.CharField(max_length=140)
date = models.DateTimeField(auto_created=True) def __str__(self):
return self.comment class Tags(models.Model):
'''标签'''
name = models.CharField(max_length=64)
def __str__(self):
return self.name class UserProfile(models.Model):
'''用户信息''' user = models.OneToOneField(User)
name = models.CharField(max_length=64)
brief = models.CharField(max_length=140,blank=True,null=True)
sex_type = ((1,'Male'),(0,'Female'))
sex = models.IntegerField(choices=sex_type,default=1)
age = models.PositiveSmallIntegerField(blank=True,null=True)
email = models.EmailField()
tags = models.ManyToManyField(Tags)
head_img = models.ImageField() follow_list = models.ManyToManyField('self',blank=True,related_name="my_followers",symmetrical=False) #registration_date = models.DateTimeField(auto_created=True)
def __str__(self):
return self.name
4.上传图片本地预览功能
如下图,发微博时,可以同时发图片,图片我们肯定是通过ajax异步上传到后台,但是我只是从电脑里选择了图片后,我还想实现一个在本地小图预览的功能, 这个需求如何实现呢?

本地预览实现
function handleFileSelect(evt) {
var files = evt.target.files;
// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {
// Only process image files.
if (!f.type.match('image.*')) {
continue;
}
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = (function(theFile) {
return function(e) {
// Render thumbnail.
var span = document.createElement('span');
span.innerHTML =
[
'<img style="height: 75px; border: 1px solid #000; margin: 5px" src="',
e.target.result,
'" title="', escape(theFile.name),
'"/>'
].join('');
document.getElementById('list').insertBefore(span, null);
};
})(f);
// Read in the image file as a data URL.
reader.readAsDataURL(f);
}
}
document.getElementById('files').addEventListener('change', handleFileSelect, false);
<input type="file" id="files" multiple />
<output id="list"></output>
参考 http://stackoverflow.com/questions/14069421/show-an-image-preview-before-upload
Django SNS 微博项目开发的更多相关文章
- Django实际站点项目开发经验谈
开发了两个月的Django站点正式上线了,看着网站从无到有,从前端到后台,从本地开发到环境部署,一点一滴的堆砌成型,着实带给我不小的乐趣. Django站点介绍: 开发环境:阿里云服务器centos6 ...
- Django学习day14BBS项目开发1.0
每日测验 """ 1.简述auth模块功能 2.简述项目开发流程 3.简述bbs表设计 """ 内容回顾 auth模块 "&quo ...
- Django学习day15BBS项目开发4.0(完结)
每日测验 """ 今日考题: 1.简述自定义标签,过滤器,inclusion_tag的方法,并简要说一说三者的特点及响应流程 2.简述个人侧边栏展示及筛选业务逻辑 3.简 ...
- Django学习day15BBS项目开发2.0
每日测验 """ 今日日考 1.img标签src属性可以指代的值有哪些,各有什么特点 2.pillow模块是干什么用的,主要的方法有哪些 3.简述登陆功能图片验证码相关逻 ...
- Django学习day15BBS项目开发3.0
每日测验 """ 今日考题 1.django admin作用及用法 2.media配置如何实现,基于该配置能够做到什么以及需要注意什么 3.阐述博客园为何支持用户自定义个 ...
- PyCharm Django项目开发的调试方法
下面介绍两种PyCharm Django项目开发的调试方法: 方法一: 1. 使用PyCharm 自带的django项目Debug工具, 当然前提条件是django项目环境已经搭建好了. 2. 在代码 ...
- Django (九) 项目开发流程&项目架构
项目开发流程&项目架构 1. 软件开发的一般流程 1. 需求分析及确认: 由需求分析工程师与客户确认甚至挖掘需求.输出需求说明文档. 2. 概要设计及详细设计: 开发对需求进行概要设计,包 ...
- Django学习笔记(19)——BBS+Blog项目开发(3)细节知识点补充
本文将BBS+Blog项目开发中所需要的细节知识点进行补充,其中内容包括KindEditor编辑器的使用,BeautifulSoup 模块及其防XSS攻击,Django中admin管理工具的使用,me ...
- Django项目开发,XSS攻击,图片防盗链,图片验证码,kindeditor编辑器
目录 一.Django项目开发 1. 项目开发流程 2. auth模块的补充 (1)django的admin可视化管理页面 (2)将admin可视化管理页面的模型表显示成中文 (3)auth模块的用户 ...
随机推荐
- 在ASP.NET 中检测手机浏览器(转)
引言 之前做的项目中需要在浏览器查看PDF文件.在电脑端没有问题,但是手机端网页打开失败. 后来使用了pdf.js,个人认为pdf.js的页面不够清爽,就希望网站能自动检测登录设备,电脑端保持原样,手 ...
- Directory Opus(DO) 11破解版安装方法(转)
DO11原版下载 32位:http://www.gpsoft.com.au/DScripts/download.asp?file=Opus11/DOpusInstall.exe 64位:http:// ...
- 由会话信息保存认识ThreadLocal
这次想总结ThreadLocal这个东西,也是由于项目中使用到了它去帮助保存会话信息.传统的(或者说我在学校的时候)方法,大多是用服务端的session保存会话,与浏览器端的cookie协作去追踪这个 ...
- 【CJOJ P1365】最短路
http://oj.changjun.com.cn/problem/detail/pid/1365 Description 给出N个点,M条无向边的简单图,问所有点对之间的最短路. Input 第1行 ...
- Heavy Transportation POJ - 1797
题意 给你n个点,1为起点,n为终点,要求所有1到n所有路径中每条路径上最小值的最最值. 思路 不想打最短路 跑一边最大生成树,再扫一遍1到n的路径,取最小值即可,类似Frogger POJ - 22 ...
- Health Check - 每天5分钟玩转 Docker 容器技术(142)
强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness 探测机制设置更精 ...
- Lintcode249 Count of Smaller Number before itself solution 题解
[题目描述] Give you an integer array (index from 0 to n-1, where n is the size of this array, data value ...
- pycharm+selenium搭建环境之no module named 'selenium'异常解决
在pycharm上搭建python+selenium自动化测试环境时,遇到一个很坑的问题:no moduel named 'selenium' 如下图: 解决方法: 1.查看你的python是否正确安 ...
- 正则表达式入门+实战(c#实现)
如果有人和你说,如果不将字符串转换为数字,你要如何判断字符串是否由全数字组成?把字符串拆成char数组,然后放入一个循环,来判断每个char是否为数字?那你要如何判断手机号是否合法?IP是否合法呢?把 ...
- 提高UI设计效率的4个技巧
提高UI设计效率的4个技巧 如何提高UI设计的速度?在这里分享一些我观察到的常见问题和改善方式.当然,需要注意的地方何其多. 身为设计师的你,应该要了解工程实作的基本原理: 业界 NG 率:接近 10 ...