先上个效果图:

这是每一个用户的主页。由于是基本功能。所以用户头像。爱好等信息都还没有,在下一阶段加上。右側“发表新文章”按钮点击后进入发表文章的页面:

之前尝试过一些开源的富文本编辑器widgEditor和百度的ueditor,总感觉太大众化,既然域名是hacker,那就用hack一些的方式,直接用裸的<textarea>然后用markdown格式就最优秀了嘛,发表后的样子:

完美支持markdown,并且我測试过的全部markdown编辑器比方retextdillinger.ioatomstackedit等都不支持<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建站】发表文章和评论的更多相关文章

  1. 【从0開始Tornado建站】0.9版本号python站点代码开源--持续更新中

            从5月份開始[从0開始Tornado建站]这个专栏,開始一点一点把这个分类兴趣站点弄起来,从无到有的过程也是令人兴奋的:-) 国庆的时候等待备案然后上线,如今站点域名为ustchack ...

  2. 【从0開始Tornado建站】整体设计

    Tornado是一个非堵塞的webserver,也是python的web框架中很优秀的一款.网上关于django的tutorial许多并且具体,关于tornado的使用就很少了.我想以我从0開始的方式 ...

  3. 【从0開始Tornado建站】群聊

    群聊的前台主要代码: {%block content%} <!--<p class='text-success h3'>測试版本号,每天凌晨4:00清水,enjoy it~~:-)& ...

  4. 【从0開始Tornado建站】显示全部注冊用户

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/littlethunder/article/details/25559749         显示注冊 ...

  5. 从0開始写MyScrollView

    从0開始写MyScrollView 上篇文章对ScrollView的详细实现进行了分析.本文依据上篇分析的结果.自己动手写一个ScrollView. step1 尾随手指滑动,非常easy.重写2个函 ...

  6. 从0開始学习 GitHub 系列之「07.GitHub 常见的几种操作」

    之前写了一个 GitHub 系列,反响非常不错,突然发现居然还落下点东西没写,前段时间 GitHub 也改版了,借此机会补充下. 我们都说开源社区最大的魅力是人人多能够參与进去,发挥众人的力量,让一个 ...

  7. 从今天開始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用

    iOSFoundation框架 当你着手为你的应用编写代码的时候,你会发现有很多可供使用的Objective-C的框架类,当中尤其重要的就是基础框架类.它为平台全部的应用提供基础服务.基础框架类中包括 ...

  8. seo建站需要注意哪些

    seo建站是搜索引擎优化的意思,通过seo建站技术,我们可以为站点带来可观的流量.那么,要怎样才能做好seo建站?seo建站优化过程中应该注意的事项有哪些?这些问题,是每一个站长都关心的.鉴于此,笔者 ...

  9. 【Bootstrap3.0建站笔记一】表单元素排版

    1.文字和输入框前后排列: 代码: <div class="row"> <div class="col-lg-12"> <div ...

随机推荐

  1. 多个@bean无法通过@resource注入对应的bean(org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found )

    一.异常 org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type ' ...

  2. Akka源码分析-ActorSystem

    由于本人对Akka比较感兴趣,也用Akka开发了一些系统,但对Akka的源码还没有具体分析过,希望研究源码的同时写一点博客跟大家分享.有不当之处还请指正.我准备采取Debug的方式来研究Akka的运行 ...

  3. centos7离线安装rabbitmq

    准备工作 一台centos7的机器 erlang-21.3.8.2 RabbitMQ 3.7.15 socat-1.7.3.2-2.el7.x86_64.rpm 开始安装 登录centos ,把上面的 ...

  4. 【知识总结】扩展卢卡斯定理(exLucas)

    扩展卢卡斯定理用于求如下式子(其中\(p\)不一定是质数): \[C_n^m\ mod\ p\] 我们将这个问题由总体到局部地分为三个层次解决. 层次一:原问题 首先对\(p\)进行质因数分解: \[ ...

  5. 343 Integer Break 整数拆分

    给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积.例如,给定 n = 2,返回1(2 = 1 + 1):给定 n = 10,返回36(10 = 3 ...

  6. js 滚动条

    <script type="text/javascript"> //文档高度1016 包含隐藏的margin和padding 实际1000 //文档1000 //窗口高 ...

  7. Python之进程 基础知识 上

    阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 在python程序中的进程操作 multiprocess模块 进程的创建和mu ...

  8. CodeCombat代码全记录(Python学习利器)--Kithgard地牢代码1

    Kithgard地牢注意:在调用函数时,要在函数的后面加上括号内容,否则在python中,将不会认为你在调用这个函数内容,而你的英雄将像木头一样站在原地不会执行上左下右的移动!!! hero.move ...

  9. Unity中确定时间是否在一定范围内

    NowTime = DateTime.Now.ToLocalTime(); Timeyear = DateTime.Now.ToLocalTime().ToString("yyyy-MM-d ...

  10. LINUX-查看进程内环境变量

    ps -ef find PID cat /proc/$PID/environ | grep ENV