Django学习笔记part1

写作目的

本文章是对Django搭建简易博客教程的学习总结,并记录我在做此项目中遇到的一些问题,希望通过它加深自己对Django以及Python的理解。

运行环境

  • Mac OS X Yosemite 10.10.2
  • iTerm + zsh + oh-my-zsh
  • Sublime Text 3
  • Python 2.7.9
  • Django 1.8
  • bootstrap-admin 0.3.5
  • Markdown 2.6.1
  • pip 6.0.8
  • setuptools 12.0.5
  • virtualenv 12.0.7

知识总结

  • 立项:django-admin.py startproject mysite
  • 建库:python manage.py migrate
  • 运行:python manage.py runserver
  • app:python manage.py startapp items
  • 改模:在models.py中加app。
  • 改库:python manage.py makemigrations
  • 更新:python manage.py migrate

具体步骤

1. 创建一个项目(startproject)

首先新建一个DjangoProjects文件夹用来存放以后做的Django项目,因为如果当你已经做好了一个项目,想把它移动到别的文件夹时,会报unable to open database file的错误,解决起来好麻烦。

然后在这个文件夹中运行:

➜  DjangoProjects  django-admin.py startproject mysite

Mac下与Linux不同,是不自带tree命令的,因此为了便于查看目录结构,安装创建树形结构命令

$ brew install tree

tree一下mysite目录得到以下结构

➜  DjangoProjects  tree mysite
mysite
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files
  • manage.py

    manage.py是Python脚本文件,与Django的命令行工具django-admin.py配合,可以对建立的工程进行管理配置,比如startapp,runserver。

  • __init__.py

    文件__init__.py是个空文件,它可以向Python编译器表明当前文件夹下的内容是Python工程模块,此文件每个包的目录下都有一个,想调用文件?必须有它。

  • settings.py

    这是Django工程的配置文件,与工程相关的工程模块和数据库全局配置信息都在settings.py中设置。

  • urls.py

    文件urls.py负责配置URL的地址映射以及管理URL的地址格式。

  • wsgi.py

    服务器网关接口(Web Server Gateway Interface)缩写为WSGI,用来连接你的项目和相关Web服务器,可以与apache交互使用。

2. 数据库安装(migrate)

配置setting.py

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

作为一个初学者,我选择了配置里默认使用SQLite数据库。

ENGINE选择了默认的sqlite3。

NAME是这个文件的绝对路径,包括文件名。默认的值os.path.join(BASE_DIR, ‘db.sqlite3’)将在你的项目目录上储存这个数据库文件。如果你不使用SQLite作为你的数据库,必须添加USER,PASSWORD,HOST等额外的设置。

运行migrate命令创建一个与数据库对应的表

➜  mysite  python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying sessions.0001_initial... OK

这样在我们的文件夹中就多了一个db.sqlite3的文件

migrate命令会查询mysite/settings.py文件里INSTALLED_APPS设置的内容,并根据INSTALLED_APPS的设置创建必要的数据库表。它还会侦测应用中模型的变化并在数据库中进行相应的数据迁移

3. 运行开发服务器(runserver)

来验证一下Django项目的工作情况

➜  mysite  python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
April 07, 2015 - 15:47:36
Django version 1.8, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

OK,浏览器里输入http://127.0.0.1:8000/

如果提示:Error: That port is already in use.
那么就要更改端口

默认地,runserver命令会在内部IP的8000端口启动开发服务器。

如果你想改变服务器的端口,把要使用的端口作为一个命令行参数就行。例如,这个命令会在8080端口上启动服务器:

$ python manage.py runserver 8080

  如果你想改变服务器的IP地址,把IP地址和端口号放到一起就行。比如你想监听所有的外网IP(如果你想在另外一台电脑上炫耀你的工作。),使用:

$ python manage.py runserver 0.0.0.0:8000

把你的ip地址加上8000端口号就可以在别的电脑上访问了,例如:192.168.1.101:8000

4. 创建一个应用(startapp)

现在,一个“项目”已经建立起来,下面确保在和manage.py相同的目录下,创建你的items应用:

➜  mysite  python manage.py startapp items

看下目录结构:

.
├── items
│   ├── __init__.py
│   ├── admin.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

我们的items应用将基于这个目录结构。

创建模型

在items应用中,创建一个模型:Article(文章)。它有四个字段:博客的题目,标签,日期,正文。

这些内容都是由简单的Python类来表现的。编辑items/models.py文件,并让它看起来像这样:

from django.db import models

# Create your models here.
class Article(models.Model) :
    title = models.CharField(max_length = 100)  #博客题目
    category = models.CharField(max_length = 50, blank = True)  #博客标签
    date_time = models.DateTimeField(auto_now_add = True)  #博客日期
    content = models.TextField(blank = True, null = True)  #博客文章正文

    def __unicode__(self) :
        return self.title

    class Meta:  #按时间下降排序
        ordering = ['-date_time']

这里面的逻辑是这样的:
models

激活模型

上面的那点模型代码给Django提供了大量的信息。有了这些代码,Django就能够:

  • 为这个应用创建数据库表结构(CREATE TABLE语句)。
  • 为Article对象创建一组用于访问数据库的Python API。
  • 方便以后我们快速的在后台发布文章,给我们搭好了一个发布文章的框架。

现在编辑一下配置文件mysite/setting.py,主要是在INSTALLED_APPS设置中加入字符串’items’,其中我摘录的下面几个是比较常用的配置。

INSTALLED_APPS = (
    'django.contrib.admin', #管理界面
    'django.contrib.auth', #身份认证系统
    'django.contrib.contenttypes', #内容类型框架
    'django.contrib.sessions', #会话框架
    'django.contrib.messages', #消息框架
    'django.contrib.staticfiles', #用来管理静态文件的框架
    'items', #添加一个app,与刚刚创建的items联系
)



TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [], #告知以后创建项目文件夹的位置,用于以后创建html模板使用
        'APP_DIRS': True,
        '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',
            ],
        },
    },
]



TIME_ZONE = 'Asia/Shanghai' #时区设置,这里默认是UTC世界标准时间,我们把时区改成Asia/Shanghai

运行makemigrations命令,对模型做了一些更改,并将这些更改存储为迁移文件。

➜  mysite  python manage.py makemigrations items
Migrations for 'items':
  0001_initial.py:
    - Create model Article

如果出现错误:

SyntaxError: Non-ASCII character

说明没有在models.py开头加入#coding: utf-8,它本身不支持中文输入。

运行migrate命令,使你的数据库表和你改动后的模型进行同步。

➜  mysite  python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, items, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying items.0001_initial... OK

玩转API

首先进入Python的交互式命令行,玩转这些Django提供给你的API。

➜  mysite  python manage.py shell
Python 2.7.9 (default, Apr  2 2015, 01:07:27)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

接着给数据库添加条目

>>> from items.models import Article
>>> Article.objects.create(title = 'Hello World', category = 'Python', content = '我们来做一个简单的数据库增加操作')

<Article: Hello World>

>>> Article.objects.all() #查看全部对象, 返回一个列表, 无对象返回空list

[<Article: Hello World>]

>>> Article.objects.get(id = 1) #返回符合条件的对象

<Article: Hello World>

觉得麻烦也没关系,其实这添加的条目都可以在Django自动生成的管理界面上进行查看添加及修改。