专栏名称: VPointer
软件开发
目录
相关文章推荐
四川日报  ·  担心被查,四川一医院副院长患上抑郁症 ·  昨天  
自贡网  ·  最新进展!自贡又一条高速公路—— ·  昨天  
四川日报  ·  四川一女子坠江失联 ·  2 天前  
51好读  ›  专栏  ›  VPointer

Python学习之路17-Django入门

VPointer  · 掘金  ·  · 2018-06-10 13:22

正文

Python学习之路17-Django入门

《Python编程:从入门到实践》笔记。

从本篇开始将是该书的最后一个项目,将用3篇文章来介绍Django的基础。完成一个“学习笔记”的小网站。

1. 前言

在本篇中,我们将:

  • 用Django来开发一个名为“学习笔记”(Learning Log)的项目;
  • 为这个项目制定规范,然后为应用程序使用的数据定义模型;
  • 使用Django的管理系统来输入一些初试数据,再学习编写视图和模板,让Django能够为我们的网站创建网页。

不过在开始之前,请先新建一个 虚拟环境 并安装Django。如果没有虚拟环境,通过 pip 安装的所有库都会保存到python的 site-packages 目录下。开发多个项目时,都会用同一个python,而某些项目并不需要其中的所有第三方库,但如果将这些不需要库的删除,又会影响到其他项目。而且,如果A项目需要Django2.0.4,B项目需要Django2.0.0,这该怎么办?此时就需要虚拟环境。它其实就相当于一个新的文件夹,将新项目与其他项目隔离,本项目的库不与其他项目的库相关联,类似于操作系统的多用户概念。

如果使用的是Python 3,可以使用命令:

python -m venv ll_env

如果该命令不成功,可能是没有安装 virtualenv 模块:

pip install virtualenv

然后创建并激活虚拟环境:

virtualenv ll_env

# linux:
source ll_env/bin/activate
# windows:
ll_env\Scripts\activate

# 停用:
deactivate

管理虚拟环境的库还有很多,有兴趣的话可以到网上搜一搜。

如果你使用的是新版的PyCharm,那么它在新建项目的时候默认就会创建新的虚拟环境。

激活虚拟环境后就可以安装Django了:

pip install django

2. 建立项目

2.1 在Django中创建项目

2.1.1 生成项目

在虚拟环境中执行如下命令:

# 主要最后有个实心句号!
# 这个句点让新项目使用合适的目录结构,这样开发完成后可以轻松地将应用程序部署到服务器
django-admin startproject learning_log .

执行上述命令后,将多出一个 manage.py 文件和一个 learning_log 文件夹,当然还有本身的一个 ll_env 文件夹。

而在 learning_log 文件夹中,又有四个文件: __init__.py settings.py urls.py wsgi.py

  • manage.py 是一个简单的程序,它接收命令并将其交给Django的相关部分去运行;
  • settings.py 指定Django如何与你的系统交互以及如何管理项目,其实就是配置文件;
  • urls.py 告诉Django应创建哪些网页来响应浏览器请求;
  • wsgi.py 是web server gateway interface(Web服务器网关接口)的缩写,帮助Django提供它创建的文件。

至于 __init__.py ,它是个空文件,Python的每个模块下必须要有这个文件。

2.1.2 创建数据库

Django将大部分与项目相关的信息都存储在数据库中,所有还需要创建一个供Django使用的数据库。依然是在虚拟环境下执行如下命令:

python manage.py migrate

在PyCharm中的话,可以通过点击工具栏Tools中的Run manage.py Task(Ctrl+Alt+R),在弹出的命令行中直接输入原命令中 manage.py 后面的部分,后面的命令也可以这样执行( [appname] 是自动提示)。

"migrate"这个单词其实是迁移的意思,并不是“创建(create)”。之所以使用这个词,是因为一般将修改数据库的过程称为迁移数据库(笔者数据库学得渣,这段解释直接从书里照搬的,希望哪位大神在留言区解释一波)。如果是刚创建的项目,并且第一次执行,将会得到如下输出:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  -- snip --
  Applying sessions.0001_initial... OK

从第2行结果可以看出,Django将创建和修改数据库看做是对数据库的迁移,Apply all migrations确保数据库结构与当前代码匹配(比如你修改了类的结构,添加了属性,这就相当于修改了数据表)。

执行命令后,项目的根目录下会多出一个名为 db.sqlite3 的数据库文件。SQLite是一种使用单个文件的轻量级数据库,常用于开发简单应用程序,它让你不用太关注数据库管理的问题。

2.1.3 运行项目

依然在项目的虚拟环境下输入如下命令:

python manage.py runserver

得到如下输出:

Performing system checks...

System check identified no issues (0 silenced).
April 21, 2018 - 20:46:48
Django version 2.0.4, using settings 'learning_log.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

现在在浏览器中地址栏输入 localhost:8000 (或者 127.0.0.1:8000 ),将得到如下页面:

这是最新版的Django的默认启动界面。

2.2 创建应用程序(APP)

2.2.1 创建模型

Django项目由一系列应用程序组成,它们协同工作,让项目成为一个整体。我们在项目根目录下执行如下命令,创建一个名为learning_logs的应用程序:

python manage.py startapp learning_logs

执行命令后,根目录下会多出一个名为 learning_logs 的文件夹(笔者第一次接触Django的时候发现这玩意儿居然叫做APP,和平时用的手机上的各种APP相差也太大了,很不适应),它的结构如下:

重要的是其中的 models.py admin.py views.py 文件,我们将使用 models.py 来定义我们要在应用程序中管理的数据。另外两个文件稍后再介绍。

打开 models.py 文件,发现其中自带两行代码:

from django.db import models

# Create your models here.

在代码层面,模型就是一个类,和之前的文章中的类一样,包含属性和方法。下面创建一个“主题”类:

from django.db import models

class Topic(models.Model):
    """用户学习的主题"""
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        """返回模型的字符串表示"""
        return self.text

Model 类是Django中的一个定义了模型基本功能的类。 Topic 类只有两个属性 text date_added 。模型中如 CharField DateTimeField 这些字段还有很多,Django自动根据数据库的不同调用不同的SQL语句创建数据表,即屏蔽底层数据库的差异。

同时还重写了 __str__() 方法,之所以说“重写”是因为每个类都有这个方法,当直接将一个类 A 放入 print() 之类的语句中时,就会调用 A __str__() 方法。如果没有重写这个方法,一般会输出这个对象的内存地址之类的,大家可以苏随便写个类试一试。

2.2.2 激活模型

使用模型前,必须将APP包含到项目中,打开 settings.py 文件,将APP添加到 INSTALLED_APPS 中:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 添加你的app,上面的都是自带的
    "learning_logs.apps.LearningLogsConfig",
]

这里有个需要注意的地方,由于这本书的2016年出版的,当时Django还没有到达2.0版本,所以在书中,注册APP是这样写的:

INSTALLED_APPS = [
    -- snip --
    # 添加你的app,上面的都是自带的
    "learning_logs",
]

现在官方文档中是按照第一种方式注册APP,并且,最新版的Django在新建APP后,在APP的目录下还多了一个 apps.py 文件,该文件默认有一个根据APP名称创建的类,此处为 LearningLogsConfig ,内容如下:

from django.apps import AppConfig

class LearningLogsConfig(AppConfig):
    name = 'learning_logs'

回到主线,在终端中输入:

python manage.py makemigrations learning_logs

# 输出
Migrations for 'learning_logs':
  learning_logs\migrations\0001_initial.py
    - Create model Topic

makemigrations Django 确定该如何修改数据库,使其能够存储与我们定义的新模型相关联的数据。从输出可以看出,在APP目录下的 migrations 文件夹中创建了一个名为 0001_initial.py 的迁移文件,该文件将在数据库中为模型 Topic 创建一个表。

最后,在命令行中输入:

python manage.py migrate

# 输出:
Running migrations:
  Applying learning_logs.0001_initial... OK

总结: 每当需要修改模型时,都采取如下三个步骤:修改 models.py ,对你的APP调用 makemigrations ,让Django迁移项目 migrate

2.2.3 Django管理网站

Django自带管理后台。首先为网站创建一个 超级用户 。在中断输入:

python manage.py createsuperuser

随后按提示输入用户名和密码即可,邮箱地址可以留空(直接回车)。

Django自动在管理网站中添加一些模型,如 User Group ,但对于我们创建的模型,必须手工注册。

注意前面提到的和 models.py 在同一目录的 admin.py 文件,这就是注册自行编写的模型的地方,在该文件中加入后两行代码:

# 第一行代码是自带的
from django.contrib import admin
from learning_logs.models import Topic

admin.site.register(Topic)

现在登录Django自带的网站管理页面 http://localhost:8000/admin/ 登录刚才创建的超级用户和密码后将出现如下界面:

在这里你可以管理用户和组,以及和模型Topic相关的数据。

现在先手动添加两个主题:点击 Add 创建 Chess Rock Climbing

2.2.4 定义模型Entry

为使能在每个主题下添加条目,需要定义 Entry 模型, Entry Topic 的关系是多对一。同样是在 models.py 中添加模型:

from django.db import models

class Topic(models.Model):
    -- snip --
    
class Entry(models.Model):
    """学到的有关某个主题的具体知识"""
    # 由于和“主题”是多对一的关系,所以“主题”是“条目”的外键
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    text = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = "entries"

    def __str__(self):
        """返回模型的字符串表示"""
        # 由于条目包含的文本可能很长,只显示前50个字符
        return self.text[:50] + "..."

注意其中嵌套了一个 Meta 类,它用于管理模型的额外信息。它让我们能够设置一个特殊属性,让Django在需要时使用 Entries 来表示多个条目。如果没有这个类,Django将使用 Entrys 来表示多个条目(保证英语语法正确......不得不说,本书作者还是很细心的)。

添加了新模型,所以需要再次迁移数据库,过程就是前面讲的三个步骤中的后两步。然后在 admin.py 中注册 Entry

为了让这个网站有一些初试数据,添加三个条目:两个 Chess 的,一个 Rock Climbing 的。在管理页面中点击 Entries Add 按钮,你将看到一个下拉列表,用于选择 Topic ,还有个文本框,用于输入内容。随便输入一点内容就可以,具体内容不再详细列出。

2.2.5 Django shell

输入一些数据后,可通过交互式终端会话以编程方式查看这些数据。这种交互式环境称为Django shell,常用语测试项目和排除故障。以下是在shell中的一些操作:

(ll_env)learning_log$ python manage.py shell   # 启动shell
>>> from learning_logs.models import Topic
>>> Topic.objects.all()   # 获得模型Topic的所有实例
<QuerySet [<Topic: Chess>, <Topic: Rock Climbing>]>  # 返回了一个查询集QuerySet

>>> topics = Topic.objects.all()  # 查询每个Topic对象






请到「今天看啥」查看全文