使用 django-blog-zinnia 搭建个人博客

django-blog-zinnia 虽然小巧,但是具备了个人博客应用的全部基础功能,且具有很高的拓展性,并且开箱即用。以下是官方列出的一些特性:

  • 评论
  • 站点地图(用于搜索引擎优化)
  • 文章归档视图(自动按时间归档博文,包括年、月、星期、日各个时间维度)
  • RSS 或者 Atom Feed
  • 分类和标签云
  • 全文搜索
  • Markdown 语法标记

等等其他一些博客应用具备的全部基本功能。

你可以参照它的官方文档 ( django-blog-zinnia documentation ) 的 installation 部分进行初始的安装,但本文也会给出详细的安装教程,并对相关的细节进行进一步补充,对功能进行进一步地拓展设置。

注:本博客在写作时每一个步骤均在实际环境下测试了一遍,确保没有问题。但是由于个人写作时的疏忽或者计算机环境的差异,也可能会有一些错误导致你卡在某个地方无法继续进行下去。如果是这样请首先仔细看文中步骤和代码,尤其要注意版本兼容问题。

1、环境搭建

python 2.7,zinnia 0.16,sqlite3

安装代码:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django==1.8.2
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django-blog-zinnia==0.16
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple markdown
pip install django-app-namespace-template-loader
pip install zinnia-theme-bootstrap
# 如果提示 pip 找不到,请先安装python包管理器 pip:  https://pip.pypa.io/en/latest/installing/#id7

####如果没有安装python包管理器 pip,也可以直接基于本地代码安装:
#先下载 https://github.com/Fantomas42/django-blog-zinnia/archive/v0.16.zip
#然后 cd django-blog-zinnia
#最后 python setup.py install

#tips:一些必要的依赖 pip 其会自动帮我们安装,但是一些拓展依赖需要我们手动安装,包括:
pip install markdown 安装 markdown,以便使博客文章支持 markdown 格式的文本。
pip install pygments 安装 pygments,以便支持代码语法高亮。

#下载安装 sqlite3
https://sqlite.org/2017/sqlite-dll-win64-x64-3160200.zip

再次提醒,一定要注意版本问题,这个项目涉及到的插件很多,很容易有系统环境和插件版本不兼容的问题。

2、建立 django 工程

进入你喜欢的目录,通过命令 python ‪C:\Python27\Scripts\django-admin.py startproject demo 创建一个 django 工程。这里 demo 是项目名,可以取任何你喜欢的名字。此时你会发现多了一个名为 demo 的目录,这样 django 工程就建立好了,目录结构如下:

C:\Users\Jun\Desktop\demo>tree /F
卷 win8.1 的文件夹 PATH 列表
卷序列号为 C0000100 7E66:869B
C:.
│  manage.py
│
└─demo
        settings.py
        settings.pyc
        urls.py
        urls.pyc
        wsgi.py
        wsgi.pyc
        __init__.py
        __init__.pyc


C:\Users\Jun\Desktop\demo>

3、设置 settings.py 文件

进入到 demo/demo (当然你可能设置了其他项目名,但我相信你能找到),打开 settings.py 文件(用文本编辑器或者 python IDE 打开,不要直接运行),在 INSTALL_APPS 列表里添加以下的 APP,这些 APP 都是 django-blog-zinnia 依赖运行的 APP,项目正常运行前我们要先进行一些设置 :

demo/demo/settings.py

INSTALLED_APPS = [
    # 工程建立时默认添加的app
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    # 项目新添加的app
    'django.contrib.sites',
    'django_comments',
    'mptt',
    'tagging',
    'zinnia_bootstrap',
    'zinnia',
]

在 TEMPLATES 列表的如下位置加入 zinnia.context_processors.version ,当然这一步是可选的,其作用只是在博客页面的底部显示一个django-blog-zinnia 的版本号:

demo/demo/settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        # 1、这里 True 改成 False
        'APP_DIRS': False,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                
                # 2、添加这句
                'zinnia.context_processors.version',  # Optional
            ],
            # 3、添加下面这几行
            'loaders': [
               'app_namespace.Loader',
               'django.template.loaders.filesystem.Loader',
               'django.template.loaders.app_directories.Loader',
            ],
        },
    },
]

在 ALLOWED_HOSTS = [] 的下面添加 SITE_ID = 1

demo/demo/settings.py

ALLOWED_HOSTS = []

# 新加2行
SITE_ID = 1
ZINNIA_MARKUP_LANGUAGE = 'markdown'

并修改语言和时区,获得更友善的语言和时间显示,注意 + 号表示添加的行,- 号表示删去的行:

demo/demo/settings.py

# + 号表示添加的行,- 号表示删去的行
- LANGUAGE_CODE = 'en-us'
+ LANGUAGE_CODE = 'zh-hans'

- TIME_ZONE = 'UTC'
+ TIME_ZONE = 'Asia/Shanghai'

整个文件源码如下,仅供参考:

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


SECRET_KEY = '#+u%&dk@p%yt526^)$o7#*4)w$d)u)s!sytfipfbtb#iohu6ph'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition


INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_comments',
    'django.contrib.sites',
    'mptt',
    'tagging',
    'zinnia_bootstrap',
    'zinnia',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)

ROOT_URLCONF = 'demo.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': False,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'zinnia.context_processors.version',  # Optional
            ],
            'loaders': [
               'app_namespace.Loader',
               'django.template.loaders.filesystem.Loader',
               'django.template.loaders.app_directories.Loader',
            ],
        },
    },
]

WSGI_APPLICATION = 'demo.wsgi.application'


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
SITE_ID = 1

USE_I18N = True

USE_L10N = True

USE_TZ = True


STATIC_URL = '/static/'

#ZINNIA_MARKUP_LANGUAGE = 'restructuredtext'
ZINNIA_MARKUP_LANGUAGE = 'markdown'
#ZINNIA_MARKDOWN_EXTENSIONS = ['markdown.extensions.extra', 'markdown.extensions.codehilite']

4、设置 urls.py 文件

打开相同目录下的 urls.py 文件,直接用下面的代码替换  demo/demo/urls.py 内容,整个 urls.py 如下:

demo/demo/urls.py

from django.conf.urls import include, url
from django.contrib import admin


urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^blog/', include('zinnia.urls', namespace='zinnia')),
    url(r'^weblog/', include('zinnia.urls', namespace='zinnia')),
    url(r'^comments/', include('django_comments.urls')),
]

5、同步数据库并创建后台管理员账户

在 manage.py 文件所在目录下输入 python manage.py migrate 建立相应的数据库表结构。此时会看到目录下多了一个 db.sqlite3 文件,这是存储博客数据的数据库文件,默认使用的 sqlite3。输入命令 python manage.py createsuperuser 创建后台管理员账户,命令行会提示你输入用户名、邮箱、密码。注意密码输入时不会有任何显示,只管输下去就行。

6、启动 web 服务器

在 manage.py 文件所在目录下输入 python manage.py runserver 启动服务器,在浏览器输入 127.0.0.1:8000/weblog 将看到博客的首页面。输入 127.0.0.1:8000/admin 会进入后台登录页面,输入刚才创建的管理员账户用户名和密码就可以登录到后台管理界面。在日志后面点击增加按钮尝试着添加一篇博客看看!再次进入 127.0.0.1:8000/weblog 就可以看到刚才发表的博客了,至此基本的博客已经搭建完毕。

7、查看数据库及表结构

C:\Users\Jun\Desktop\demo>sqlite3 db.sqlite3
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
sqlite> .tables
auth_group                  django_session
auth_group_permissions      django_site
auth_permission             tagging_tag
auth_user                   tagging_taggeditem
auth_user_groups            zinnia_category
auth_user_user_permissions  zinnia_entry
django_admin_log            zinnia_entry_authors
django_comment_flags        zinnia_entry_categories
django_comments             zinnia_entry_related
django_content_type         zinnia_entry_sites
django_migrations
sqlite>

另外,可以使用 .dump 或 .schema ,导出表结构和数据。

8、定制你的博客

比如你想修改标题,语法高亮、侧边栏的内容等等,就需要修改相应的模板了。

为了方便起见,我们新建一个 APP 来存放我的需要引入的 css 样式文件,在 demo/ 目录下(与 manage.py 同级)下输入 python manage.py startapp theme,这样我们就创建了一个名为 theme 的 app,可以看到 demo/ 多了一个 theme 的文件夹。

在 demo/ 目录下(与 manage.py 同级)建立如下的目录结构和文件:

demo/templates/zinnia/skeleton.html,把这里面的内容:skeleton 模板代码 ,复制到 skeleton.html中,并且在 skeleton.html 中做你想要的修改即可。

再在 zinnia_demo/ 下建立如下的目录结构和文件:

demo/theme/static/theme/css/github.css,把这里面的内容:github.css 样式代码 ,复制到 github.css 文件中。

打开 settings.py 文件,做如下修改:

demo/demo/settings.py

TEMPLATES = [
    {
        ...
        # 修改成下面的样子,作用是指明模板文件所在目录,即上面我们写的skeleton.html
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        ...
    }
]

将 theme app 注册到 INSTALLED_APPS 列表中:

demo/demo/settings.py

INSTALLED_APPS = [
    ...
    'theme',
    'zinnia_bootstrap',
    'zinnia',
]

启动web服务器,进入相应页面就可以看到修改后效果了。

Refer:

[1] Installation

http://docs.django-blog-zinnia.com/en/develop/getting-started/install.html

[2] 使用 django-blog-zinnia 搭建个人博客

https://segmentfault.com/a/1190000006839238

[3] 边做边学,Python&Django实战教程-02本地搭建Django博客

https://zhuanlan.zhihu.com/mazhifeng

[4] SQLite3查询表结构

http://blog.csdn.net/guanhuhousheng/article/details/6933209

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

直传文件到Azure Storage的Blob服务中

题记:为了庆祝获得微信公众号赞赏功能,忙里抽闲分享一下最近工作的一点心得:如何直接从浏览器中上传文件到Azure Storage的Blob服务中。 为什么 如果...

3617
来自专栏惨绿少年

awk巩固练习题

第1章 awk数组练习题 1.1 文件内容(仅第一行) [root@znix test]# head -1 secure-20161219 access.log...

2410
来自专栏晓晨的专栏

ASP.NET Core的身份认证框架IdentityServer4(7)- 使用客户端认证控制API访问

2024
来自专栏Linux 杂货铺

使用Apache Guacamole连接虚拟云桌面

Apache Guacamole是一款HTML5应用程序,可通过RDP,VNC和其他协议访问远程桌面。您可以创建一个虚拟云桌面,用户通过Web浏览器即可访问。本...

3.9K4
来自专栏Script Boy (CN-SIMO)

连接远程数据库ORACLE11g,错误百出!

首先,我已经提前在虚拟机上配置了windows2008+oracle11g,为什么用server2008呢?我没有别的,win10做虚拟机觉得不太好,win7镜...

1390
来自专栏依乐祝

Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)

上一篇文章中,给大家讲解了如何通过 Asp.Net Core Web Api实现图片上传的接口,具体的可以[点这里查看][https://www.cnblogs...

1371
来自专栏大魏分享(微信公众号:david-share)

用Ansible自动供应vmware虚拟机--构建数据中心一体化运维平台第二篇

1.1 简述 一直以来,打开邮箱被ticket糊一脸的事情时有发生。我一直在想,能不能以一种简单的方案(不花老板的钱)来供应(provisioning)虚拟机呢...

7122
来自专栏编程思想之路

Android四大组件完全解析(一)---Activity

本文参考\android\android\frameworks\base\core\java\android\app\Activity.java文件中的类注释,...

49410
来自专栏草根专栏

使用Identity Server 4建立Authorization Server (1)

本文内容基本完全来自于Identity Server 4官方文档: https://identityserver4.readthedocs.io/ 官方文档很详...

52310
来自专栏自然语言处理

Anaconda+Sublime搭建机器学习开发环境

1 安装Anaconda集成环境,Anaconda下载,安装下一步一路安装结束。(无需环境变量配置),配置完成后,查看是否成功。

1002

扫码关注云+社区

领取腾讯云代金券