2017/8/31 18:27:59
為了以后參考的方便,在這里總結一下django搭建博客網站的主要步驟。以下大部分的內容,參考自Django中文文檔 - 看雲。
需要強調的是,這里使用的django版本是1.8。這是因為,不同版本之間的django之間存在一定的差異。
1.安裝django
在命令行中使用如下命令安裝django
pip install django==1.8
安裝結束后,在命令行中輸入python,進入python命令行。然后嘗試導入django
>>> import django
>>> django.get_version()
'1.8'
這說明,django安裝成功了。
2.創建項目mysite
在命令行中,使用cd命令進入你想存儲代碼的目錄,然后運行如下命令
python django-admin.py startproject mysite
於是,當前目錄下建立了一個mysite目錄,結構如下
mysite/
manage.py
mysite/
__init__.py
setting.py
urls.py
wsgi.py
從外層的mysite目錄切換進去,通過如下命令,我們就能運行服務器
python manage.py runserver
在http://127.0.0.1:8000/,我們將看到如下頁面

3.編輯setting.py
在mysite/settings.py中保存着django項目的配置。通過編輯它,可以修改項目的配置。
設置語言版本
LANGUAGE_CODE = 'zh-cn'
注:在1.9及以后的版本中,需要使用'zh-hans'
更改時區
TIME_ZONE = 'Asia/Shanghai'
在這里還可以修改數據庫設置,這里不做修改,使用默認sqlites數據庫。
修改完畢后,在命令行中運行如下命令,進行數據庫的同步
python manage.py syncdb
運行此命令后,命令行會詢問是否創建管理員賬戶。選擇是,因為這將會很有用。
重新運行服務器,訪問http://127.0.0.1:8000/admin/,你將看到如下頁面

輸入剛剛設置的用戶名和密碼就可以登錄到網站的管理界面了。開不開心?當然,現在還沒有多少功能。
4.創建應用及后台設置
使用如下命令,創建應用
python manage.py startapp blog
這將創建一個blog目錄,如下
blog/
__init__.py
admin.py
models.py
tests.py
views.py
為了激活這個應用,我們編輯mysite/setting.py文件,在INSTALLED_APPS中加入‘blog’,如下
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
)
在blog/models.py中添加如下內容
from django.db import models
from django.contrib import admin
class BlogsPost(models.Model):
title = models.CharField(max_length = 150)
body = models.TextField()
timestamp = models.DateTimeField()
admin.site.register(BlogsPost)
其中,最后一行是為了在管理界面添加BlogsPsot,以便管理。
運行如下命令,進行數據庫同步
python manage.py makemigrations
python manage.py migrate
啟動服務器,並登錄到網站的管理界面,你將看到

點擊Blogs posts后面的增加按鈕,創建文章。輸入標題,正文和日期時間,並保存你的文章。

接下來設置管理界面中blogs post顯示。在blog/models.py中添加如下內容
class BlogPostAdmin(admin.ModelAdmin):
list_display = ('title','timestamp')
admin.site.register(BlogPostAdmin)
刷新之前的頁面,你將看到

到這里,我們完成了一個簡單的博客后台。
5.使用markdown顯示你的博客
我們寫前端部分,使得我們可以查看之前寫的博客。
首先,我們在blog目錄下創建templates目錄,並添加模板文件index.html。現在我們的blog目錄如下
blog/
__pycache__/ ...
migrations/ ...
templates/
index.html
__init__.py
admin.py
models.py
tests.py
views.py
在index.html中添加如下內容
{% for post in blog_list %}
<h2>{{post.title}}</h2>
<p> {{post.timestamp}}</p>
<p> {{post.body}}</p>
{% endfor %}
接下來,我們創建視圖函數,將數據庫中blogspost渲染到這個模板文件中。在blog/views.py中添加如下內容
from django.shortcuts import render_to_response
from blog.models import BlogsPost
def index(request):
blog_list = BlogsPost.objects.all()
return render_to_response('templates/index.html',{'blog_list':blog_list})
index函數將從數據庫中的BlogsPost對象查詢出來,渲染到index.html中,並返回index.html。我們現在的任務是將這個函數綁定一個URL。
修改mysite/urls.py,如下
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^index/$','blog.views.index'),
]
現在運行服務器,訪問http://127.0.0.1:8000/index/,你將看到如下的頁面

接下來,對博文添加markdown支持。在blog/views.py修改index函數
from markdown import markdown
def index(request):
blog_list = BlogsPost.objects.all()
for post in blog_list:
post.body=markdown(post.body,extensions=['table'])
return render_to_response('index.html',{'blog_list':blog_list})
修改blog/templates/index.html為
{% for post in blog_list %}
<h2>{{post.title}}</h2>
<p> {{post.timestamp}}</p>
{% autoescape off %}
{{post.body}}
{% endautoescape %}
{% endfor %}
參考[4]介紹了{% autoescape off %}的含義
off的意思是關閉對html的轉義,而將off替換成on就表示進行html轉義,默認進行html轉義。
參考[7]介紹了如何在使得包markdown支持渲染表格。
重新編輯博文,訪問http://127.0.0.1:8000/index,我們將看到

6.網站的部署
下載Apache2.4,下載地址
https://www.apachehaus.com/cgi-bin/download.plx#APACHE24VC09
解壓之后,修改Apache24/conf/httpd.conf中的以下內容(配合ctrl+f)
Define SRVROOT "D:/Apache24"
ServerRoot "${SRVROOT}"
Listen 0.0.0.0:8000
啟動Apache24/bin/httpd.exe程序,訪問http://127.0.0.1:8000,會在瀏覽器上看到Apache的歡迎界面。
下載mod_wsgi,下載地址
http://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi
使用pip安裝下載的whl。安裝成功后,在命令行中運行如下命令
mod_wsgi-express module-config
拷貝輸出的三行結果,復制到Apache24/conf/httpd.conf的末尾。
將如下內容拷貝到Apache24/conf/httpd.conf的末尾。請將[~]替換為你項目的地址。
#指定myweb項目的wsgi.py配置文件路徑
WSGIScriptAlias / [~]/wsgi.py
#指定項目路徑
WSGIPythonPath [~]
<Directory [~]/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Alias /static [~]/static
<Directory [~]/static>
AllowOverride None
Options None
Require all granted
</Directory>
然后在mysite/setting.py中添加或修改以下內容
DEBUG = False
TEMPLATE_DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']
完成這些之后,我們還必須收集關於admin的靜態文件。
在mysite/setting.py中將以下內容
STATIC_URL = '/static/'
#STATIC_ROOT = os.path.join(BASE_DIR, "static")
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, "templates"),
)
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
修改為
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static")
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, "templates"),
)
STATICFILES_DIRS = (
#os.path.join(BASE_DIR, "static"),
)
在manage.py的目錄下運行如下命令
python manage.py collectstatic
運行完畢之后,將上一步mysite/setting.py的設置還原。
按照同樣的方法在雲服務器上部署,效果如圖

基本的框架搭建好了,接下來就可以修改網站的邏輯和樣式了,對網站進行進一步的完善了。
參考
[1] 看雲-django中文文檔1.8
[2] 蟲師-django快速搭建blog
[3] 一介碼農-在django中使用markdown
[4] 追夢者的部落格-django輸出html內容
[5] 蝸牛工作站-Django1.7+Apache2.4部署
[6] 小二走刀口-whl文件中找不到mod_wsgi.so文件解決辦法
[7] sggmentfault-django如何渲染markdown的表格