工程项目去问你详细做了什么,用到了什么关键技术等

个人博客项目

STAR

S:

二次评论的设计 :

  • 我想设计成类似于百度贴吧那种楼中楼的样式 , 不知道怎么设计数据表.
    • 当时查了很多资料,最后设计了三个表,一级评论和二级评论继承抽象表
  • 抽象表BaseComment
  • 一级评论表ArticleComment
  • 二级评论表ArticleCommentReply
  • 抽象表外键是用户id
  • 一级评论外键是文章,
  • 二级评论外键是一级评论和to_user(允许为空,为空表示回复层主)

二级评论表设计两个外键,

  • 一个外键是一级评论,表示一级评论下的所有二级评论
  • 一个外键是to_user(二级评论),也就是说绑定自己,表示允许互相回复。

查找步骤:

  1. 首先根据文章ID找出所有的一级评论
  2. 根据一级评论id找出所有的二级评论,
  3. 按时间排序即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class BaseComment(models.Model):
'基础评论模型'
objects = IsDeleteManager()

content = models.TextField(verbose_name="评论内容")
create_time = models.DateTimeField(verbose_name='评论时间',auto_now_add=True)
from_user = models.ForeignKey(TouristUser, verbose_name='评论用户', on_delete=models.CASCADE)
isDelete = models.BooleanField(verbose_name='是否删除',default=0)

class Meta:
abstract = True
verbose_name = verbose_name_plural = '文章评论'

def __str__(self):
return self.from_user.username


class ArticleComment(BaseComment):
'文章评论'
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments', verbose_name='评论文章')

class Meta:
verbose_name = verbose_name_plural = '文章评论'
ordering = ['-create_time']


class ArticleCommentReply(BaseComment):
'文章评论回复(二级评论)'
comment = models.ForeignKey(ArticleComment, on_delete=models.CASCADE, related_name='replies', verbose_name='一级评论')
to_user = models.ForeignKey('user', null=True, blank=True, on_delete=models.CASCADE, verbose_name='回复二级评论')
class Meta:
ordering = ['create_time']
verbose_name = verbose_name_plural = '二级评论'

你是如何防止XSS攻击和SQL攻击

XSS攻击和SQL攻击主要发生在URL和提交的表单上,我就对用户提交的内容进行编码和过滤.

  1. 编码 : 对于大于号小于号等等解析
  2. 使用DOM Parser 进行解析过滤,过滤掉一些危险标签和属性

web项目的性能优化

后端优化:

  • 缓存存储读写次数高,变化少的数据,先从缓存中读取,如果读取不到或数据已失效,再访问磁盘数据库,并将数据再次写入缓存。
  • 异步方式,如果有耗时操作,可以采用异步,比如celery

数据库优化:

  • 如有条件,数据可以存放于redis,读取速度快
  • 建立索引、外键等

websocket项目

接入流程:

  1. 判断是否为websocket链接
  2. 创建用户,并且将其存储到客户端列表
  3. 使用while True
  4. 等待消息的传入
  5. 如果消息不为空,使用send更新所有人前端的用户列表
  6. 如果消息为空,说明用户断开了连接,从客户端列表中删除,然后更新所有人前端的用户列表

向发生信息流程:

  1. 用户使用ajax发送数据,(其中包括是群发还是私聊的标志)
  2. 后台获取相应的数据
  3. 如果是群发就获取向所有客户端发送信息,否则就先特定的用户发送信息

困难:

  • 试了好久发现获取不到cookies , aiohttp支持的session仅仅是HTTPONLY类型,
  • 最后使用token,就token藏在隐藏表单

困难二 :

  • sqlalchemy的session新建问题
  • 因为协程本质就是单线程,所以为了有效利用资源就不session设计成了单例模式
  • 要调用sqlalchemy的session来存储数据,然后我发现使用session存储的数据并不能在数据库读出来,必须关闭session后才真的写入数据
  • 这就意味着我要频繁的新建session,写入数据,然后关闭
  • 解决思路就是 : 使用主从复制与读写分离
  • 先将数据存缓到redis中 , 等用户下线或者点击查看历史信息的时候再写入数据

时间

2019-5 基于 Django的博客项目

全栈开发

  1. 项目简介: 独立开发网站 http://obgnail.com ; 实现博文展示 ; 支持Markdown和富文本的博文发表 ; 表单验证 ; 通过 Ajax发送请求实现登录注册 ; 使用 Django REST framework优化接口 ; 对游客用户访问限制 ; 反爬虫限制 ; 防止 CSRF和 XSS,SQL 注入攻击
  2. 项目实现: 存缓(Redis)+持久存储(MySQL)的数据库结构; 基于 Celery的延时任务 ; cookies+session实现登录状态的保存和检验 ; 对提交的内容进行编码,避免 XSS和 SQL注入攻击 ; 使用中间件拦截后台访问进行反爬

2019-6 到2019-6 基于 aiohttp的网络聊天室项目

后台开发

  1. 项目简介: 使用 WebSocket搭建线上网络聊天室 ; 支持用户注册登录 ; 支持匿名聊天; 支持群聊和私聊 ; 聊天记录保存与查看 ; 实时消息推送 ; 断线自动重连 ; 用户黑名单
  2. 项目实现: 使用 aiohttp处理 WebScoket连接 ; 使用 Redis存缓 session ; Celery + sqlalchemy封装为 DAO , 异步存储聊天记录 ; 函数装饰器拦截黑名单用户

2018-10 到 2018-10 基于 Scrapy + Selenium+ PhantomJS的爬虫开发项目

后台开发

  1. 项目简介: 使用 Scrapy框架抓取知乎网用户信息,并使用 MongoBD 数据库存储
  2. 项目实现: 通过频率,IP 池,cookies 池应对网站的反扒 ; 使用 Selenium+ PhantomJS避免网站加密参数 ; 使用云服务器托管 python 爬虫

2018-9 到 2019-4 基于Numpy + Pandas的医院入院检查诊断数据整理分析项目