首先安装markdown2库来支持markdown语言:
$ sudo pip install markdown2
$ sudo pip install pygments
注意要把安装后的markdown2.py和pygments文件夹放到www文件夹下,因为我们想支持代码块以及表格等额外的markdown语言,而默认这些特性是关闭的,因此需要稍微修改一下markdown2.py:
...
def markdown_path(path, encoding="utf-8", html4tags=False, tab_width=DEFAULT_TAB_WIDTH,
safe_mode=None, extras=["fenced-code-blocks", "tables"],
link_patterns=None, use_file_vars=False):
...
需要什么就在这里找到然后填在extras后面。
还需要下载至少一种pygments-css来支持代码颜色:
$ git clone https://github.com/richleland/pygments-css.git
$ cd pygments-css
把makefile文件里的.highlight
替换成.codehilite
,接着:
$ make cssfiles
当然还要在base.html里面添加这个css文件,不然也是显示不出来的:
随便选了一个,好像不太好看,有空再换一换。另外需要在三个反引号后指出用的是什么语言,不然还是不能显示出颜色...(这是后话):
然后修改handlers.py,添加如下内容:
- 将输入文本转化成html文本
- 检查用户是否为管理员
- 获取页码
- 呈现博客内容的网页处理函数
- 根据博客id获取博客内容的网页处理函数
- 创建/编辑博客的网页处理函数
- 发布博客的网页处理函数
import markdown2
def text2html(text):
# 先将text去除空行,再写成html格式
lines = map(lambda s: '%s
' % s.replace('&', '&').replace('<', '<').replace('>', '>'), filter(lambda s: s.strip() != '', text.split('\n')))
return ''.join(lines)
def check_admin(request):
if request.__user__ is None or not request.__user__.admin:
raise APIPermissionError()
def get_page_index(page_str):
p = 1
try:
p = int(page_str)
except ValueError as e:
pass
if p < 1:
p = 1
return p
@get('/blog/{id}')
async def get_blog(id):
blog = await Blog.find(id) # 根据id查询到blog对象
comments = await Comment.findAll('blog_id=?', [id], orderBy='created_at desc')
for c in comments:
c.html_content = text2html(c.content)
blog.html_content = markdown2.markdown(blog.content)
return {
'__template__': 'blog.html',
'blog': blog,
'comments': comments
}
@get('/manage/blogs/create')
def manage_create_blogs():
return {
'__template__': 'manage_blog_edit.html',
'id': '',
'action': '/api/blogs'
}
@get('/api/blogs/{id}')
async def api_get_blog(*, id):
blog = await Blog.find(id)
# 返回到manage_blog_edit.html中, 当需要编辑旧博客时
return blog
@post('/api/blogs')
async def api_create_blog(request, *, name, summary, content):
check_admin(request) # 只有管理员才可以发布博客
if not name or not name.strip():
raise APIValueError('name', 'name cannot be empty.')
if not summary or not summary.strip():
raise APIValueError('summary', 'summary cannot be empty.')
if not content or not content.strip():
raise APIValueError('content', 'content cannot be empty.')
blog = Blog(
user_id=request.__user__.id, # app.py中把cookie2user获取到的用户赋给了request.__user__
user_name=request.__user__.name,
user_image=request.__user__.image,
name=name.strip(),
summary=summary.strip(),
content=content.strip()
)
await blog.save()
return blog
然后使用MVVM模式写一个创建博客的页面templates/manage_blog_edit.html,这种模式的好处是前后端分离,逻辑清晰:
{% extends '__base__.html' %}
{% block title %}编辑日志{% endblock %}
{% block beforehead %}
{% endblock %}
{% block content %}
正在加载...
{% endblock %}
注意我们默认注册的时候都不是admin账户,需要在数据库中修改权限:
之所以admin两边要加反引号是因为admin是数据库的关键字,要避免冲突,不然会报“Error 1064”错误。
然后登陆这个账户才是管理员权限,可以写博客。