【从0開始Tornado建站】发表文章和评论
先上个效果图:
这是每一个用户的主页。由于是基本功能。所以用户头像。爱好等信息都还没有,在下一阶段加上。右側“发表新文章”按钮点击后进入发表文章的页面:
之前尝试过一些开源的富文本编辑器widgEditor和百度的ueditor,总感觉太大众化,既然域名是hacker,那就用hack一些的方式,直接用裸的<textarea>然后用markdown格式就最优秀了嘛,发表后的样子:
完美支持markdown,并且我測试过的全部markdown编辑器比方retext、dillinger.io、atom、stackedit等都不支持<pre>中的“<”和“>”。所以在这些编辑器中#include<stdio.h>是打印不出来的,我用python-markdown2转码就没有这个问题,注意在#前要用“\”转义,否则觉得markdown语法中的主标题,字体会变大的哈。发表文章的前端主要代码例如以下:
- {%block content%}
- <form action='/post' method='post' class='well'>
- <div class='form-group'>
- <label class='sr-only'>标题</label>
- <input type='text' name='title' class='form-control' placeholder='请输入标题'/>
- </div>
- <div class='form-group'>
- <label class='sr-only'>正文</label>
- <textarea rows='20' type='text' name='blog' class='form-control' placeholder='请输入文章正文'></textarea>
- </div>
- <button type='submit' class='btn btn-warning'>发送</button>
- </form>
- {%end%}
发表文章的后端代码例如以下:
- class postHandler(tornado.web.RequestHandler):
- def get(self):
- name=self.get_cookie('hackerName')
- self.render('post.html',cookieName=name)
- def post(self):
- title=self.get_argument('title')
- blog_md=self.get_argument('blog')
- blog=translate(blog_md)
- name=self.get_cookie('hackerName')
- idvalue=insertBlog(name,title,blog)
- self.redirect('/blog/'+str(idvalue))
insertBlog函数定义例如以下:
- def insertBlog(name,title,blog):
- now=time.ctime()
- c.execute('insert into blog(name,title,blog,time) values("'+name+'","'+title+'","'+blog+'","'+now+'")')
- db.commit()
- c.execute('select max(id) from blog')
- return c.fetchone()[0] #新插入数据的id
translate函数定义例如以下:
- def translate(md):
- for i in whiteList:
- if i[0] in md:
- md=md.replace(i[0],i[1])
- md2=html.escape(md)
- data=markdown2.markdown(md2)
- for i in whiteList:
- if i[1] in data:
- data=data.replace(i[1],i[0])
- return data
显示文章的前段主要代码例如以下:
- {%block content%}
- <div>
- <p class='text-success h2'>{{blog[1]}}的专栏</p>
- <br/>
- <p class='text-danger h3'>{{blog[2]}}</p>
- <p class='text-muted h6'>{{blog[4]}}</p>
- <br/>
- {%raw blog[3]%}
- </div>
- <div>
- <ul>
- {%for i in comments%}
- <li><a href='/user/{{i[2]}}' class='text-success h4'>{{i[2]}}</a>: <label class='text-warning h4'>{{i[3]}}</label> <label class='text-muted h6'>{{i[4]}}</label></li>
- {%end%}
- </ul>
- </div>
- <div>
- <form action='/comment' method='post' class='form-inline'>
- <div class='form-group'>
- <label class='sr-only'>评论</label>
- <input type='text' name='comment' class='form-control' placeholder='请输入评论'></input>
- </div>
- <button type='submit' class='btn btn-default'>评论</button>
- </form>
- </div>
- {%end%}
显示文章和评论的后端代码例如以下:
- class blogHandler(tornado.web.RequestHandler):
- def get(self,idvalue):
- selfname=self.get_cookie('hackerName')
- blog=showOneBlog(idvalue)
- comments=showComment(idvalue)
- self.render('blog.html',cookieName=selfname,blog=blog,comments=comments)
- class commentHandler(tornado.web.RequestHandler):
- def post(self):
- selfname=self.get_cookie('hackerName')
- comment=self.get_argument('comment')
- refer=self.request.headers.get('referer')
- for i in range(len(refer)-1,0,-1):
- if refer[i]=='/':
- break
- blogid=refer[i+1:]
- print(blogid)
- addComment(blogid,selfname,comment)
- self.redirect('/blog/'+blogid)
文章和评论的表格定义例如以下:
- CREATE TABLE blog(id integer primary key,name text,title text,blog text,time text);
- CREATE TABLE comment(id integer primary key,blogid integer,name text,comment text,time text);
我想在接下来升级中加上评论的@功能,还有评论提示功能。
转载请注明:转自http://blog.csdn.net/littlethunder/article/details/25560463
【从0開始Tornado建站】发表文章和评论的更多相关文章
- 【从0開始Tornado建站】0.9版本号python站点代码开源--持续更新中
从5月份開始[从0開始Tornado建站]这个专栏,開始一点一点把这个分类兴趣站点弄起来,从无到有的过程也是令人兴奋的:-) 国庆的时候等待备案然后上线,如今站点域名为ustchack ...
- 【从0開始Tornado建站】整体设计
Tornado是一个非堵塞的webserver,也是python的web框架中很优秀的一款.网上关于django的tutorial许多并且具体,关于tornado的使用就很少了.我想以我从0開始的方式 ...
- 【从0開始Tornado建站】群聊
群聊的前台主要代码: {%block content%} <!--<p class='text-success h3'>測试版本号,每天凌晨4:00清水,enjoy it~~:-)& ...
- 【从0開始Tornado建站】显示全部注冊用户
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/littlethunder/article/details/25559749 显示注冊 ...
- 从0開始写MyScrollView
从0開始写MyScrollView 上篇文章对ScrollView的详细实现进行了分析.本文依据上篇分析的结果.自己动手写一个ScrollView. step1 尾随手指滑动,非常easy.重写2个函 ...
- 从0開始学习 GitHub 系列之「07.GitHub 常见的几种操作」
之前写了一个 GitHub 系列,反响非常不错,突然发现居然还落下点东西没写,前段时间 GitHub 也改版了,借此机会补充下. 我们都说开源社区最大的魅力是人人多能够參与进去,发挥众人的力量,让一个 ...
- 从今天開始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用
iOSFoundation框架 当你着手为你的应用编写代码的时候,你会发现有很多可供使用的Objective-C的框架类,当中尤其重要的就是基础框架类.它为平台全部的应用提供基础服务.基础框架类中包括 ...
- seo建站需要注意哪些
seo建站是搜索引擎优化的意思,通过seo建站技术,我们可以为站点带来可观的流量.那么,要怎样才能做好seo建站?seo建站优化过程中应该注意的事项有哪些?这些问题,是每一个站长都关心的.鉴于此,笔者 ...
- 【Bootstrap3.0建站笔记一】表单元素排版
1.文字和输入框前后排列: 代码: <div class="row"> <div class="col-lg-12"> <div ...
随机推荐
- 这里有最全的C/C++入门到进阶书籍推荐,你需要嘛?
编程是操作性很强的一门知识,看书少不了,但只有学习和实践相结合才能起到很好的效果,一种学习方法是看视频->看书->研究书中例子->自己做些东西->交流->看书. 研究经典 ...
- JavaSE综合项目演练
光阴似箭日月如梭,大家学习已经有了一段时间了,转眼间,从刚开始如何配置JDK已经到了现在快学完网络编程了.学了这么多,眼看就要进入下一个阶段了,数据库编程了,那么在进入下个阶段前,我们来完成一个综合性 ...
- Android点9图的运用
在Android UI设计开发中,我们经常会用到一些图标.图片来做背景等. 相信很多同学都会遇到一个问题,就是我们让美工做好一张图,一个图标,呃,看起来挺好看的,但是放进app中,扩大或缩小.在不同分 ...
- java 重载父类报错 Remove '@override' annotation解决办法
Remove '@override' annotation解决办法 最近刚刚配置了新机器,将原来的代码放在eclipse上执行,总会出现Remove '@override' annotati ...
- 【LeetCode】-- 260. Single Number III
问题描述: https://leetcode.com/problems/single-number-iii/ 在一个数组里面,只有两个元素仅出现过1次,其余都出现过两次.找出出现仅一次的那两个(a, ...
- Java系列学习(十三)-字符串
1.字符串基础 概念:字符串本质是打包字符数组的对象,是java.lang.String类的实例 2.字符串的构造方法 public String() public String(byte[] byt ...
- Redis主从复制失败(master_link_status:down)
今天配置redis主从复制时出现master_link_status:down提示. 首先打开slave的redis.conf配置文件,确定slaveof 和masterauth 两个选项配置是否正确 ...
- C#——设置开机启动
将exe应用程序设置为开机启动,有多种方法,我们主要通过注册表设置开机启动选项. using Microsoft.Win32; using System.Windows.Forms; static v ...
- java网络
title: java 网络 date: 2017年3月11日11:14:52 1. 复杂的东西就把他封装成对象 概述:(网络就是找到别人) 找到对方的机器,(找到对方的ip地址) 每个机器中有很多进 ...
- Cookie的实现
Cookie是web server下发给浏览器的任意的一段文本,在后续的http 请求中,浏览器会将cookie带回给Web Server.同时在浏览器允许脚本执行的情况下,Cookie是可以被Jav ...