从开发到部署,使用django创建一个简单可用的个人博客
本文参考于:
简书-Django搭建简易博客教程:http://www.jianshu.com/p/d15188a74104
自强学堂-Django基础教程:http://www.ziqiangxuetang.com/django/django-tutorial.html
Django官方文档中文翻译版:http://python.usyiyi.cn/django/index.html
本文主要是一步一步教大家如何使用Django构建一个自己的博客,基础的django不会讲的太详细,想要详细学习django的同学可以参考上面三个教程
本文的所有代码将托管于github:https://github.com/w392807287/django_blog_tutorial
本文开发环境:
- django 1.8.3
- ubuntu 16.04
- python 2.7.12
迈出第一步
首先,安装django,这里我们使用的是1.8.3版本
sudo pip install django==1.8.3
创建django项目并开始一个新的app,如果是使用pycharm的同学可跳过
django-admin startproject tutorial
cd tutorial
python manage.py startapp blog
在settings.py 中加入blog,然后
python manage.py migrate
python manage.py runserver
尝试访问http://127.0.0.1:8000/
访问成功!
为你的博客创建一个模型
迈出第一步之后,我们已经有一个可以访问的项目了,现在我们需要为其创建模型,模型是Django提供一个抽象层(Models)以构建和操作你的web应用中的数据。
打开blog/models.py文件
#coding:utf8
from __future__ import unicode_literals from django.db import models # Create your models here. class Article(models.Model):
title = models.CharField(u"博客标题",max_length = 100) #博客标题
category = models.CharField(u"博客标签",max_length = 50,blank = True) #博客标签
pub_date = models.DateTimeField(u"发布日期",auto_now_add = True,editable=True) #博客发布日期
update_time = models.DateTimeField(u'更新时间',auto_now=True,null=True)
content = models.TextField(blank=True, null=True) # 博客文章正文 def __unicode__(self):
return self.title class Meta: #按时间下降排序
ordering = ['-pub_date']
verbose_name = "文章"
verbose_name_plural = "文章"
这样我们就创建了第一个属于我们博客的模型——文章。
然后,然后我们就同步数据库咯
python manage.py makemigrations
python manage.py migrate
登陆管理后台
首先我们先创建一个超级用户,用来登陆后台管理
python manage.py createsuperuser
然后在blog/admin.py中加入代码:
#coding:utf8 from django.contrib import admin
from blog.models import Article
# Register your models here. class ArticleAdmin(admin.ModelAdmin):
list_display = ('title','pub_date') admin.site.register(Article,ArticleAdmin)
现在
python manage.py runserver
就能访问了,管理页面在http://127.0.0.1:8000/admin/
但是现在页面不是那么好看,而且界面是英文的,那么我们需要做一些修改
首先我们先安装一个bootstrap的插件
(sudo) pip install bootstrap-admin
然后在tutorial/settings.py中更改一些代码
INSTALLED_APPS = (
'bootstrap_admin',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
)
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
红色字样是修改后的,首先插入bootstrap的管理页面插件,然后语言设置为中文,时区更改为中国。
现在运行就能看到一个正常的界面了

然后可以尝试添加一篇博客

集成 DjangoUeditor 编辑器及静态文件的处理
以上,界面是好看了不少,但是这个文章是不是有点简陋啊,只能写文本性的东西。我们现在来给它加一点点东西。我们下面来集成百度的Ueditor 到我们的系统:
https://github.com/twz915/DjangoUeditor3
上面是DjangoUeditor 包,可以下载zip或者直接clone,将里面的额DjangoUeditor 直接放到项目根目录,
ls
blog db.sqlite3 DjangoUeditor manage.py README.md templates tutorial
然后在tutorial/settings.py中加入
INSTALLED_APPS = (
... 'blog',
'DjangoUeditor',
)
这是为了让django能识别这个模块
在tutorial/url.py中加入
from django.conf.urls import include, url
from django.contrib import admin
from DjangoUeditor import urls as djud_urls
from django.conf import settings urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^ueditor/',include(djud_urls)),
] if settings.DEBUG:
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL,document_root = settings.MEDIA_ROOT)
这是为了让django能访问编辑器模块
然后在tutorial/settings.py中加入
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'static') #公共的static文件
STATICFILES_DIRS = (
os.path.join(BASE_DIR,"common_static"),
os.path.join(BASE_DIR,"media"),
) #upload floder
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media') STATICFILES_FINDERS = ("django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder",)
这是静态文件的配置,很多初学django的同学会在这里碰到坑。下面一个一个解释一下
STATIC_URL 这个是放置静态文件的地方,django会默认在这个文件夹中寻找需要的静态文件,很多教程教大家上来就把静态文件塞这里面其实这并不是一个好的处理方法,因为在发布前需要统一收集静态文件的时候会从各个文件夹中收集静态文件放入这个文件夹中,期间有可能会覆盖掉原来的文件。
STATIC_ROOT 这个就是静态文件相对于系统的目录
MEDIA_URL 一般会将上传的文件放入这个文件夹
MEDIA_ROOT 同STATIC_ROOT
STATICFILES_DIRS 这一个元组,里面放置开发时静态文件自动搜寻的目录,我们在开发是先建一个common_static即公用的静态文件夹,在里面放我们自己的静态文件,等最后使用静态文件收集命令一并处理。
然后我们更改blog/models.py 中的模型
from DjangoUeditor.models import UEditorField content = UEditorField(u"文章正文",height=300,width=1000,default=u'',blank=True,imagePath="uploads/blog/images/",
toolbars='besttome',filePath='uploads/blog/files/')
跟新数据库
python manage.py makemigrations
python manage.py migrate
然后运行一下

好了,现在我们的编辑器就是一个能写文字能传图还能自动保存的“厉害编辑器”了,科科。
至此,自己用的算是告一段落,那么,作为一个博客,时需要给别人看的啊,所以下面写一些给别人看的东西。
views和urls
我们在blog/views.py中加入:
def Test(request):
return HttpResponse("just a test")
在blog中添加urls.py:
#coding:utf8
from django.conf.urls import url
from . import views urlpatterns = [
url(r'^test/',views.Test,name="blog_test"),
]
在tutorial的urls中引入blog的urls:
import blog.urls as blog_url urlpatterns = [
url(r'^blog/',include(blog_url)),
url(r'^admin/', include(admin.site.urls)),
url(r'^ueditor/',include(djud_urls)),
]
运行后可以正常访问,返回just a test。
我们尝试这通过视图views访问数据库,更改/blog/views.py:
from blog.models import Article def Test(request):
post = Article.objects.all()
return HttpResponse(post[0].content)
如果你刚在后台添加了文章那么就能看到它了!
使用Template来展示
在项目目录下有一个名叫templates的文件夹,如果没有你就建一个咯又花不了多大劲儿。
新建一个html文件templates/blog/test.html:
<!DOCTYPE html>
<html>
<head>
<title>Just test template</title>
<style>
body {
background-color: red;
}
em {
color: LightSeaGreen;
}
</style>
</head>
<body>
<h1>Hello World!</h1>
<strong>{{ current_time }}</strong>
</body>
</html>
修改views.py :
def Test(request) :
return render(request, 'blog/test.html', {'current_time': datetime.now()})
现在运行访问http://127.0.0.1:8000/blog/test就能看到hello world 和当前时间.
现在我们新建3个html文件
base.html:
<!doctype html>
<html lang="zh-hans">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="A layout example that shows off a blog page with a list of posts.">
<title>李琼羽的博客</title>
<link rel="stylesheet" href="http://yui.yahooapis.com/pure/0.5.0/pure-min.css">
<link rel="stylesheet" href="http://yui.yahooapis.com/pure/0.5.0/grids-responsive-min.css">
<link rel="stylesheet" href="http://picturebag.qiniudn.com/blog.css">
</head>
<body>
<div id="layout" class="pure-g">
<div class="sidebar pure-u-1 pure-u-md-1-4">
<div class="header">
<h1 class="brand-title"><a href="{% url 'blog_home' %}">Angelo Li Blog</a></h1>
<h2 class="brand-tagline">李琼羽 - Angelo Li</h2>
<nav class="nav">
<ul class="nav-list">
<li class="nav-item">
<a class="button-success pure-button" href="/">主页</a>
</li>
<li class="nav-item">
<a class="button-success pure-button" href="/">归档</a>
</li>
<li class="nav-item">
<a class="pure-button" href="/">Github</a>
</li>
<li class="nav-item">
<a class="button-error pure-button" href="/">微博</a>
</li>
<li class="nav-item">
<a class="button-success pure-button" href="/">专题</a>
</li>
<li class="nav-item">
<a class="button-success pure-button" href="/">About Me</a>
</li>
</ul>
</nav>
</div>
</div> <div class="content pure-u-1 pure-u-md-3-4">
<div>
{% block content %}
{% endblock %}
<div class="footer">
<div class="pure-menu pure-menu-horizontal pure-menu-open">
<ul>
<li><a href="/">About Me</a></li>
<li><a href="/">微博</a></li>
<li><a href="/">GitHub</a></li>
</ul>
</div>
</div>
</div>
</div>
</div> </body>
</html>
home.html
{% extends "blog/base.html" %}
{% block content %}
<div class="posts">
{% for post in post_list %}
<section class="post">
<header class="post-header">
<h2 class="post-title"><a href="{% url 'blog_detail' id=post.id %}">{{ post.title }}</a></h2>
<p class="post-meta">
Time: <a class="post-author" href="#">{{ post.date_time |date:'Y /m /d'}}</a> <a class="post-category post-category-js" href="#">{{ post.category }}</a>
</p>
</header>
<div class="post-description">
<p>
{{ post.content|safe }}
</p>
</div>
<a class="pure-button" href="{% url 'blog_detail' id=post.id %}">Read More >>> </a>
</section>
{% endfor %}
</div><!-- /.blog-post -->
{% endblock %}
post.html
{% extends "blog/base.html" %}
{% block content %}
<div class="posts">
<section class="post">
<header class="post-header">
<h2 class="post-title">{{ post.title }}</h2>
<p class="post-meta">
Time: <a class="post-author" href="#">{{ post.date_time|date:'Y /m /d'}}</a> <a class="post-category post-category-js" href="#">{{ post.category }}</a>
</p>
</header>
<div class="post-description">
<p>
{{ post.content|safe }}
</p>
</div>
</section>
</div><!-- /.blog-post -->
{% endblock %}
其中,home.html和post.html继承于base.html
更改blog/views.py
#coding:utf8 from django.shortcuts import render
from django.http import HttpResponse
from blog.models import Article
from datetime import datetime
from django.http import Http404
# Create your views here. def home(request):
post_list = Article.objects.all() # 获取全部的Article对象
return render(request, 'blog/home.html', {'post_list': post_list}) def Test(request):
return render(request,'blog/test.html',{'current_time': datetime.now()}) def Detail(request,id):
try:
post = Article.objects.get(id=str(id))
except Article.DoesNotExist:
raise Http404
return render(request,'blog/post.html',{'post':post})
blog/urls.py
#coding:utf8
from django.conf.urls import url
from . import views urlpatterns = [
url(r'^post/(?P<id>\d+)/$',views.Detail,name="blog_detail"),
url(r'^home/',views.home,name="blog_home"),
url(r'^test/',views.Test,name="blog_test"),
]
tutorial/urls.py
from django.conf.urls import include, url
from django.contrib import admin
import blog.urls as blog_url
from DjangoUeditor import urls as djud_urls
from django.conf import settings urlpatterns = [
url(r'^blog/',include(blog_url)),
url(r'^admin/', include(admin.site.urls)),
url(r'^ueditor/',include(djud_urls)),
] if settings.DEBUG:
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL,document_root = settings.MEDIA_ROOT)
运行访问http://127.0.0.1:8000/blog/home/

以上,开发过程已经完成,当然你可以自己加入需要的东西,比如评论什么的。
使用uWSGI+nginx部署Django项目
详细步骤见http://www.cnblogs.com/Liqiongyu/articles/5893780.html
这里只讲主要的步骤
首先安装:
sudo apt-get install nginx
sudo pip install uwsgi
更改nginx配置文件
sudo vim /etc/nginx/sites-available/default
如下
upstream django {
server unix:///home/ubuntu/blogsite/mysite.sock; # for a file socket
}
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
# Make site accessible from http://localhost/
server_name localhost;
charset utf-8;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
client_max_body_size 75M;
location /media {
alias /home/ubuntu/blogsite/media;
}
location /static {
alias /home/ubuntu/blogsite/static;
}
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
#try_files $uri $uri/ =404;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
uwsgi_pass django;
include /etc/nginx/uwsgi_params;
}
}
上面的/home/ubuntu/blogsite是我的项目目录,全部改成你自己的就OK
然后执行命令:
python manage.py collectstatic
这是用来收集静态文件的,上面有提到
然后在项目根目录添加mysite_uwsgi.ini文件:
[uwsgi] # Django-related settings
# the base directory (full path)
chdir = /home/ubuntu/blogsite
# Django's wsgi file
module = blogsite.wsgi
# the virtualenv (full path)
# home = /path/to/virtualenv # process-related settings
# master
master = true
# maximum number of worker processes
processes = 2
# the socket (use the full path to be safe
socket = /home/ubuntu/blogsite/mysite.sock
# ... with appropriate permissions - may be needed
chmod-socket = 666
# clear environment on exit
vacuum = true
然后修改tutorial/settings.py :
DEBUG = False ALLOWED_HOSTS = ['*']
解除debug模式,allowed_hosts中添加你的域名,这里为方便填*
然后重启nginx,运行uwsgi
sudo service nginx restart
uwsgi --ini mysite_uwsgi.ini
访问http://youdomain.com/blog/home
代码更改了url后可以直接访问youdomain.com
以上,网站就能正常访问。有问题欢迎微信留言
代码地址:https://github.com/w392807287/django_blog_tutorial
欢迎多来访问博客:http://liqiongyu.com/blog
微信公众号:
从开发到部署,使用django创建一个简单可用的个人博客的更多相关文章
- 用django创建一个简单的sns
用django创建一个简单的sns 1.首先创建一个工程newsns django-admin.py startproject newsns 在工程目录下新建一个文件夹templates,在该文件夹下 ...
- django创建一个简单的web站点
一.新建project 使用Pycharm,File->New Project…,选择Django,给project命名 (project不能用test命名) 新建的project目录如下: ...
- IntelliJ IDEA 15 部署Tomcat及创建一个简单的Web工程
一.部署Tomcat 二.创建一个简单的Web工程 2.1创建一个新工程 创建一个新工程 设置JDK及选择Web Application (创建的是Web工程) 点击Next,选择工作空间,起个工程名 ...
- 用mkdocs在gitee码云上建立一个简单的文档博客
利用mkdocs建立简单的文档博客 一.概述 MkDocs 是一个用于创建项目文档的 快速, 简单 , 完美华丽 的静态站点生成器. 文档源码使用 Markdown 来撰写, 用一个 YAML 文件作 ...
- Django创建一个简单的blog
1. 使用django-admin.py 创建mysite项目 sunny@sunny-ThinkPad-T450:~/PycharmProjects$ django-admin.py startpr ...
- 一个简单的hexo搭建博客网站的故事
首先安装hexo mkdir hexo #创建一个文件夹 cd hexo #切换到hexo目录下面 npm install -g hexo-cli npm install hexo --save 然后 ...
- 利用django创建一个投票网站(三)
创建你的第一个 Django 项目, 第三部分 这一篇从第二部分(zh)结尾的地方继续讲起.我们将继续编写投票应用,并且聚焦于如何创建公用界面--也被称为"视图". 设计哲学 Dj ...
- Unity 2D游戏开发高速入门第1章创建一个简单的2D游戏
Unity 2D游戏开发高速入门第1章创建一个简单的2D游戏 即使是如今,非常多初学游戏开发的同学.在谈到Unity的时候.依旧会觉得Unity仅仅能用于制作3D游戏的. 实际上.Unity在2013 ...
- 一个先进的App框架:使用Ionic创建一个简单的APP
原文 http://www.w3cplus.com/mobile/building-simple-app-using-ionic-advanced-html5-mobile-app-framewor ...
随机推荐
- 转: html5 history api详解~很好的文章
从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残按到了F5.然后,页面刷新了,评论又回到了第一页 ...
- android方向键被锁定的问题
当虚拟机启动的时候,很多情况是旁边的方向键不能点击,处于一种被锁定的状态,解决办法如下: 找到 C:\Users\Administrator(你的用户名)\.android\avd\mm.adv( ...
- BlueTooth的EDR是什么
EDR 即Enhanced data rate,是蓝牙技术中增强速率的缩写,其特色是大大提高了蓝牙技术的数据传输速率,达到了2.1Mbps ,是目前蓝牙技术的三倍.因此除了可获得更稳定的音频流传送的更 ...
- SSD的优势
谈过SSD的发展历史后,现在我们来讲解下SSD相比传统HDD(机械硬盘)的优势. 相信很多读者只要有听说过SSD,必定都会听到对SSD优点的一个字总结:快! 但这一个字要如何去理解呢?很多人可能还不太 ...
- BootStrap 智能表单系列 十一 级联下拉的支持
像省市县选择的这种,但凡是个人肯定都见过,实现方式有很多种 1.有在第一级选择的时候去加载或者从本地对象中拿第一级对应的数据源显示到列表中,第二级以此类推 2.也有将所有的项都加载到select中,然 ...
- 判断两个XML文件结构与内容是否相同
1. 引入 目前公司的这款软件导入导出数据库信息的方法是:组织数据的内容和结构 利用MS com的sax解析 储存数据为XML格式 优点是可以选择部分导出 缺点是速度慢文件导出的文件庞大,若客户出现 ...
- Objective-c (多输入参数的方法)
一个方法可能具有多个输入参数.在头文件中,可以定义带有多个输入参数的方法: - (void)setIntX:(int)n andSetIntY:(int)d 下面通过一个例子来说明它的具体用法: #i ...
- 解压版本 Tomcat配置--转
http://qsfwy.iteye.com/blog/429973 一 配置JDK 1.下载jdk下载后,解压,假设为D:\Program Files\Java\jdk1.5.0_08,要确保bin ...
- AOP annotation
1.xml文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http ...
- 笔记 postgresql oid同步
以前学习postgresql的笔记 create table 消耗 OID 如create table my_test_table, 他本身会消耗一个 会在pg_type中插入两条记录_my_test ...