使用django搭建个人博客

Posted brafei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用django搭建个人博客相关的知识,希望对你有一定的参考价值。

第一章

创建一个blog应用

在这本书中,你将学习如何创建完整的Django项目,可以在生产环境中使用。假如你还没有安装Django,在本章的第一部分你将学习如何安装。本章会覆盖如何使用Django去创建一个简单的blog应用。本章的目的是使你对该框架的工作有个基本概念,了解不同的组件之间是如何产生交互,并且教你一些技能通过使用一些基本功能方便地创建Djang项目。你会被引导创建一个完整的项目但是不会对所有的细节都进行详细说明。不同的框架组件将在本书接下来的章节中进行介绍。
本章会覆盖以下几点:

  • 安装Django并创建你的第一个项目

  • 设计模型(models)并且生成模型(model)数据库迁移

  • 给你的模型(models)创建一个管理站点

  • 使用查询集(QuerySet)和管理器(managers)

  • 创建视图(views),模板(templates)和URLs

  • 给列表视图(views)添加页码

  • 使用Django内置的视图(views)

安装Django

如果你已经安装好了Django,你可以直接略过这部分跳到创建你的第一个项目。Django是一个Python包因此可以安装在任何的Python的环境中。如果你还没有安装Django,这里有一个快速的指南帮助你安装Django用来本地开发。

Django需要在Python2.7或者3版本上才能更好的工作。在本书的例子中,我们将使用Python 3。如果你使用Linux或者Max OSX,你可能已经有安装好的Python。如果你不确定你的计算机中是否安装了Python,你可以在终端中输入 python 来确定。如果你看到以下类似的提示,说明你的计算机中已经安装好了Python:

Python 3.5.0 (v3.5.0:374f501f4567, Sep 12 2015, 11:00:19)[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwinType "help", "copyright", "credits" or "license" for more information.
>>>

如果你计算机中安装的Python版本低于3,或者没有安装,下载并安装Python 3.5.0 从http://www.python.org/download/ (译者注:最新已经是3.6.0了,Django2.0将不再支持pytyon2.7,所以大家都从3版本以上开始学习吧)。

由于你使用的是Python3,所以你没必要再安装一个数据库。这个Python版本自带SQLite数据库。SQLLite是一个轻量级的数据库,你可以在Django中进行使用用来开发。如果你准备在生产环境中部署你的应用,你应该使用一个更高级的数据库,比如PostgreSQL,mysql或Oracle。你能获取到更多的信息关于数据库和Django的集成通过访问 https://docs.djangoproject.com/en/1.8/topics/install/#database-installation 。

创建一个独立的Python环境

强烈建议你使用virtualenv来创建独立的Python环境,这样你可以使用不同的包版本对应不同的项目,这比直接在真实系统中安装Python包更加的实用。另一个高级之处在于当你使用virtualenv你不需要任何管理员权限来安装Python包。在终端中运行以下命令来安装virtualenv:

pip install virtualenv

(译者注:如果你本地有多个python版本,注意Python3的pip命令可能是pip3)

当你安装好virtualenv之后,通过以下命令来创建一个独立的环境:

virtualenv my_env

以上命令会创建一个包含你的Python环境的my_env/目录。当你的virtualenv被激活的时候所有已经安装的Python库都会带入 my_env/lib/python3.5/site-packages 目录中。
如果你的系统自带Python2.X然后你又安装了Python3.X,你必须告诉virtualenv使用后者Python3.X。通过以下命令你可以定位Python3的安装路径然后使用该安装路径来创建virtualenv:

zenx\$ *which python3* 
/Library/Frameworks/Python.framework/Versions/3.5/bin/python3
zenx\$ *virtualenv my_env -p 
/Library/Frameworks/Python.framework/Versions/3.5/bin/python3*

通过以下命令来激活你的virtualenv:

source my_env/bin/activate

shell提示将会附上激活的virtualenv名,被包含在括号中,如下所示:

(my_evn)laptop:~ zenx$

你可以使用deactivate命令随时停用你的virtualenv。

你可以获取更多的信息关于virtualenv通过访问 https://virtualenv.pypa.io/en/latest/ 。

在virtualenv之上,你可以使用virtualenvwrapper工具。这个工具提供一些封装用来方便的创建和管理你的虚拟环境。你可以在 http://virtualenvwrapper.readthedocs.org/en/latest/ 下载该工具。

使用pip安装Django

(译者注:请注意以下的操作都在激活的虚拟环境中使用)

pip是安装Django的第一选择。Python3.5自带预安装的pip,你可以找到pip的安装指令通过访问 https://pip.pypa.io/en/stable/installing/ 。运行以下命令通过pip安装Django:

pip install Django==1.8.6

Django将会被安装在你的虚拟环境的Python的site-packages/目录下。

现在检查Django是否成功安装。在终端中运行python并且导入Django来检查它的版本:

>>> import django>>> django.VERSION
DjangoVERSION(1, 8, 5, 'final', 0)

如果你获得了以上输出,Django已经成功安装在你的机器中。

Django也可以使用其他方式来安装。你可以找到更多的信息通过访问 https://docs.djangoproject.com/en/1.8/topics/install/ 。

创建你的第一个项目

我们的第一个项目将会是一个完整的blog站点。Django提供了一个命令允许你方便的创建一个初始化的项目文件结构。在终端中运行以下命令:

django-admin startproject mysite

该命令将会创建一个名为mysite的项目。
让我们来看下生成的项目结构:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

让我们来了解一下这些文件:

  • manage.py:一个实用的命令行,用来与你的项目进行交互。它是一个对django-admin.py工具的简单封装。你不需要编辑这个文件。

  • mysite/:你的项目目录,由以下的文件组成:

    • init.py:一个空文件用来告诉Python这个mysite目录是一个Python模块。

    • settings.py:你的项目的设置和配置。里面包含一些初始化的设置。

    • urls.py:你的URL模式存放的地方。这里定义的每一个URL都映射一个视图(view)。

    • wsgi.py:配置你的项目运行如同一个WSGI应用。

默认生成的settings.py文件包含一个使用一个SQLite数据库的基础配置以及一个Django应用列表,这些应用会默认添加到你的项目中。我们需要为这些初始应用在数据库中创建表。

打开终端执行以下命令:

cd mysitepython manage.py migrate

你将会看到以下的类似输出:

Rendering model states... DONEApplying contenttypes.ooo1_initial... OKApplying auth.0001_initial... OKApplying admin.0001_initial... OKApplying contenttypes.0002_remove_content_type_name... OKApplying auth.0002_alter_permission_name_max_length... OKApplying auth.0003_alter_user_email_max_length...OKApplying auth.0004_alter_user_username_opts... OKApplying auth.0005_alter_user_last_login_null... OKApplying auth.0006_require_contenttypes_0002... OKApplying sessions.0001_initial... OK

这些初始应用表将会在数据库中创建。过一会儿你就会学习到一些关于migrate的管理命令。

运行开发服务器

Django自带一个轻量级的web服务器来快速运行你的代码,不需要花费额外的时间来配置一个生产服务器。当你运行Django的开发服务器,它会一直检查你的代码变化。当代码有改变,它会自动重启,将你从手动重启中解放出来。但是,它可能无法注意到一些操作,例如在项目中添加了一个新文件,所以你在某些场景下还是需要手动重启。

打开终端,在你的项目主目录下运行以下代码来开启开发服务器:

python manage.py runserver

你会看到以下类似的输出:

Performing system checks...
    
System check identified no issues (0 silenced).
November 5, 2015 - 19:10:54Django version 1.8.6, using settings 'mysite.settings'Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

现在,在浏览器中打开 http://127.0.0.1:8000/ ,你会看到一个告诉你项目成功运行的页面,如下图所示:

你可以指定Django在定制的host和端口上运行开发服务,或者告诉它你想要运行你的项目通过读取一个不同的配置文件。例如:你可以运行以下 manage.py命令:

python manage.py runserver 127.0.0.1:8001 \
--settings=mysite.settings

这个命令迟早会对处理需要不同设置的多套环境启到作用。记住,这个服务器只是单纯用来开发,不适合在生产环境中使用。为了在生产环境中部署Django,你需要使用真实的web服务让它运行成一个WSGI应用例如Apache,Gunicorn或者uWSGI(译者注:强烈推荐 nginx+uwsgi+Django)。你能够获取到更多关于如何在不同的web服务中部署Django的信息,访问 https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ 。

本书外额外的需要下载的章节第十三章,Going Live包含为你的Django项目设置一个生产环境。

项目设置

让我们打开settings.py文件来看看你的项目的配置。在该文件中有许多设置是Django内置的,但这些只是所有Django可用配置的一部分。你可以通过访问 https://docs.djangoproject.com/en/1.8/ref/settings/ 看到所有的设置和它们默认的值。

以下列出的设置非常值得一看:

  • DEBUG 一个布尔型用来开启或关闭项目的debug模式。如果设置为True,当你的应用抛出一个未被捕获的异常时Django将会显示一个详细的错误页面。当你准备部署项目到生产环境,请记住一定要关闭debug模式。永远不要在生产环境中部署一个打开debug模式的站点因为那会暴露你的项目中的敏感数据。

  • ALLOWED_HOSTS 当debug模式开启或者运行测试的时候不会起作用(译者注:最新的Django版本中,不管有没有开启debug模式该设置都会启作用)。一旦你准备部署你的项目到生产环境并且关闭了debug模式,为了允许访问你的Django项目你就必须添加你的域或host在这个设置中。

  • INSTALLED_APPS 这个设置你在所有的项目中都需要编辑。这个设置告诉Django有哪些应用会在这个项目中激活。默认的,Django包含以下应用:

  • django.contrib.admin:这是一个管理站点。

  • django.contrib.auth:这是一个权限框架。

  • django.contrib.contenttypes:这是一个内容类型的框架。

  • django.contrib.sessions:这是一个会话(session)框架。

  • django.contrib.messages:这是一个消息框架。

  • django.contrib.staticfiles:这是一个用来管理静态文件的框架

  • MIDDLEWARE_CLASSES 是一个包含可执行中间件的元组。

  • ROOT_URLCONF 指明你的应用定义的主URL模式存放在哪个Python模块中。

  • DATABASES 是一个包含了所有在项目中使用的数据库的设置的字典。里面一定有一个默认的数据库。默认的配置使用的是SQLite3数据库。

  • LANGUAGE_CODE 定义Django站点的默认语言编码。

不要担心你目前还看不懂这些设置的含义。你将会在之后的章节中熟悉这些设置。

项目和应用

贯穿全书,你会反复的读到项目和应用的地位。在Django中,一个项目被认为是一个安装了一些设置的Django;一个应用是一个包含模型(models),视图(views),模板(templates)以及URLs的组合。应用之间的交互通过Django框架提供的一些特定功能,并且应用可能被各种各样的项目重复使用。你可以认为项目就是你的网站,这个网站包含多个应用,例如blog,wiki或者论坛,这些应用都可以被其他的项目使用。(译者注:我去,我竟然漏翻了这一节- -|||,罪过罪过,阿米头发)

创建一个应用

现在让我们创建你的第一个Django应用。我们将要创建一个勉强凑合的blog应用。在你的项目主目录下,运行以下命令:

python manage.py startapp blog

这个命令会创建blog应用的基本目录结构,如下所示:

blog/
    __init__.py
    admin.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

这些文件的含义:

  • admin.py: 在这儿你可以注册你的模型(models)并将它们包含到Django的管理页面中。使用Django的管理页面是可选的。

  • migrations: 这个目录将会包含你的应用的数据库迁移。Migrations允许Django跟踪你的模型(model)变化并因此来同步数据库。

  • models.py: 你的应用的数据模型(models)。所有的Django应用都需要拥有一个models.py文件,但是这个文件可以是空的。

  • tests.py:在这儿你可以为你的应用创建测试。

  • views.py:你的应用逻辑将会放在这儿。每一个视图(view)都会接受一个HTTP请求,处理该请求,最后返回一个响应。

设计blog数据架构

我们将要开始为你的blog设计初始的数据模型(models)。一个模型(model)就是一个Python类,该类继承了django.db.models.model,在其中的每一个属性表示一个数据库字段。Django将会为models.py中的每一个定义的模型(model)创建一张表。当你创建好一个模型(model),Django会提供一个非常实用的API来方便的查询数据库。

首先,我们定义一个POST模型(model)。在blog应用下的models.py文件中添加以下内容:

from django.db import modelsfrom django.utils import timezonefrom django.contrib.auth.models import Userclass Post(models.Model):
    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published'),
    )
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250,
                            unique_for_date='publish')
    author = models.ForeignKey(User,
                                related_name='blog_posts')
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10,
                                choices=STATUS_CHOICES,
                                default='draft')                            
    class Meta:
        ordering = ('-publish',)        
    def __str__(self):
        return self.title

这就是我们给blog帖子使用的基础模型(model)。让我们来看下刚才在这个模型(model)中定义的各个字段含义:

  • title: 这个字段对应帖子的标题。它是CharField,在SQL数据库中会被转化成VARCHAR。

  • slug:这个字段将会在URLs中使用。slug就是一个短标签,该标签只包含字母,数字,下划线或连接线。我们将通过使用slug字段给我们的blog帖子构建漂亮的,友好的URLs。我们给该字段添加了unique_for_date参数,这样我们就可以使用日期和帖子的slug来为所有帖子构建URLs。在相同的日期中Django会阻止多篇帖子拥有相同的slug。

  • author:这是一个ForeignKey。这个字段定义了一个多对一(many-to-one)的关系。我们告诉Django一篇帖子只能由一名用户编写,一名用户能编写多篇帖子。根据这个字段,Django将会在数据库中通过有关联的模型(model)主键来创建一个外键。在这个场景中,我们关联上了Django权限系统的User模型(model)。我们通过related_name属性指定了从UserPost的反向关系名。我们将会在之后学习到更多关于这方面的内容。

  • body:这是帖子的主体。它是TextField,在SQL数据库中被转化成TEXT

  • publish:这个日期表明帖子什么时间发布。我们使用Djnago的timezonenow方法来设定默认值。This is just a timezone-aware datetime.now(译者注:这句该咋翻译好呢)。

  • created:这个日期表明帖子什么时间创建。因为我们在这儿使用了auto_now_add,当一个对象被创建的时候这个字段会自动保存当前日期。

  • updated:这个日期表明帖子什么时候更新。因为我们在这儿使用了auto_now,当我们更新保存一个对象的时候这个字段将会自动更新到当前日期。

  • status:这个字段表示当前帖子的展示状态。我们使用了一个choices参数,这样这个字段的值只能是给予的选择参数中的某一个值。(译者注:传入元组,比如(1,2),那么该字段只能选择1或者2,没有其他值可以选择)

就像你所看到的的,Django内置了许多不同的字段类型给你使用,这样你就能够定义你自己的模型(models)。通过访问 https://docs.djangoproject.com/en/1.8/ref/models/fields/ 你可以找到所有的字段类型。

在模型(model)中的类Meta包含元数据。我们告诉Django查询数据库的时候默认返回的是根据publish字段进行降序排列过的结果。我们使用负号来指定进行降序排列。

str()方法是当前对象默认的可读表现。Django将会在很多地方用到它例如管理站点中。

如果你之前使用过Python2.X,请注意在Python3中所有的strings都使用unicode,因此我们只使用str()方法。unicode()方法已经废弃。(译者注:Python3大法好,Python2别再学了,直接学Python3吧)

在我们处理日期之前,我们需要下载pytz模块。这个模块给Python提供时区的定义并且SQLite也需要它来对日期进行操作。在终端中输入以下命令来安装pytz

pip install pytz

Django内置对时区日期处理的支持。你可以在你的项目中的settings.py文件中通过USE_TZ来设置激活或停用对时区的支持。当你通过startproject命令来创建一个新项目的时候这个设置默认为True

激活你的应用

为了让Django能保持跟踪你的应用并且根据你的应用中的模型(models)来创建数据库表,我们必须激活你的应用。因此,编辑settings.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',
 )

(译者注:该设置中应用的排列顺序也会对项目的某些方面产生影响,具体情况后几章会有介绍,这里提醒下)

现在Django已经知道在项目中的我们的应用是激活状态并且将会对其中的模型(models)进行自审。

创建和进行数据库迁移

让我们为我们的模型(model)在数据库中创建一张数据表格。Django自带一个数据库迁移(migration)系统来跟踪你对模型(models)的修改,然后会同步到数据库。migrate命令会应用到所有在INSTALLED_APPS中的应用,它会根据当前的模型(models)和数据库迁移(migrations)来同步数据库。

首先,我们需要为我们刚才创建的新模型(model)创建一个数据库迁移(migration)。在你的项目主目录下,执行以下命令:

python manage.py makemigrations blog

你会看到以下输出:

Migrations for 'blog':    0001_initial.py;
        - Create model Post

Django在blog应用下的migrations目录中创建了一个0001——initial.py文件。你可以打开这个文件来看下一个数据库迁移的内容。

让我们来看下Django根据我们的模型(model)将会为在数据库中创建的表而执行的SQL代码。sqlmigrate命令带上数据库迁移(migration)的名字将会返回它们的SQL,但不会立即去执行。运行以下命令来看下输出:

python manage.py sqlmigrate blog 0001

输出类似如下:

BEGIN;CREATE TABLE "blog_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(250) NOT NULL, "slug" varchar(250) NOT NULL, "body" text NOT NULL, "publish" datetime NOT NULL, "created" datetime NOT NULL, "updated" datetime NOT NULL, "status" varchar(10) NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id"));CREATE INDEX "blog_post_2dbcba41" ON "blog_post" ("slug");CREATE INDEX "blog_post_4f331e2f" ON "blog_post" ("author_id");COMMIT;

Django会根据你正在使用的数据库进行以上精准的输出。以上SQL语句是为SQLite数据库准备的。如你所见,Django生成的表名前缀为应用名之后跟上模型(model)的小写(blog_post),但是你也可以通过在模型(models)的Meta类中使用db_table属性来指定表名。Django会自动为每个模型(model)创建一个主键,但是你也可以通过在模型(model)中的某个字段上设置primarry_key=True来指定主键。

让我们根据新模型(model)来同步数据库。运行以下的命令来应用已存在的数据迁移(migrations):

python manage.py migrate

你应该会看到以下行跟在输出的末尾:

Applying blog.0001_initial... OK

我们刚刚为INSTALLED_APPS中所有的应用进行了数据库迁移(migrations),包括我们的blog应用。在进行了数据库迁移(migrations)之后,数据库会反映我们模型的当前状态。

如果为了添加,删除,或是改变了存在的模型(models)中字段,或者你添加了新的模型(models)而编辑了models.py文件,你都需要通过使用makemigrations命令做一次新的数据库迁移(migration)。数据库迁移(migration)允许Django来保持对模型(model)改变的跟踪。之后你必须通过migrate命令来保持数据库与我们的模型(models)同步。



以上是关于使用django搭建个人博客的主要内容,如果未能解决你的问题,请参考以下文章

使用django搭建个人博客

Django搭建个人博客平台3---博客表结构设计和markdown编辑器

Django搭建个人博客平台3---博客表结构设计和markdown编辑器

Django搭建个人博客平台4---后台admin优化simpleui和导入导出

Django搭建个人博客平台4---后台admin优化simpleui和导入导出

django搭建个人博客