python编程从入门到实践读书笔记-《Python编程:从入门到实践》项目部分读书笔记(二)...

鸽了一个暑假没有更新,现在趁着还没开学更一下。e3e04023fb1e7ecd42086859bad7eb78f8c1d170.jpg咕咕咕

4adb9255ada5b97061e610b682b8636764fe50ed.png

上期作业:

请创建一个Django项目,命名为Blog,建不建立虚拟环境随便你,最后本地跑成了就行。

步骤:

①在需要创建工程的文件夹下打开cmd;44f0de580b882415833557b83bd29b6e3fbbb0fd.png打开cmd

②创建Blog项目。在命令行输入:

django-admin startproject Blog

运行成功后出现名为"Blog”的文件夹;294a0d2f9c300ac446af48d4bfe92c63449a5c38.png创建app

③创建数据库。输入指令:

python manage.py migrate

在一大串OK之后,文件夹下多了一个sqlite3文件;d48b448b5f3dafd141b57d91d2e876e8ba57e5d2.png创建数据库

④查看项目:切换路径至Blog文件夹:

cd Blog

运行manage.py文件:

python manage.py runserver

显示如果端口被占用还需要补别的。399ae8f296455a489bc68765c5576ccf0962ee0b.png访问拒绝

07c2b4d66d433c91b92a0c0db46404988a6b92d2.png成功

现在打开浏览器,输入url检验,结果为The install worked successfully,说明已经成功了。50d363911f04b2b719d171c5f6850ea7fd0afb76.png成功

4adb9255ada5b97061e610b682b8636764fe50ed.png

18.2 创建应用程序

让我们回到"Learning Log”这个项目中来。当我们仅仅创建一个项目之后,得到的网站没有任何功能。要为Django项目添加功能,需要创建一系列的应用程序,这一系列的应用程序协同工作才能让项目成为一个整体。现在我们暂时先创建一个应用程序,它将实现"学习笔记”的大部分功能。为了方便之后每做一步都能观察到效果,不妨先激活服务器:在Learning_Log文件夹下打开cmd,运行runserver指令。然后再另外开一个cmd窗口,如果之前为项目创建了虚拟环境,别忘了在新窗口也激活虚拟环境!

①创建应用程序。执行命令:

python manage.py startapp learning_logs

可以看到项目中多了一个名为"learning_logs”的文件夹。文件夹中有1个名为"migration”的文件夹,和6个python文件,其中最重要的是admin.py、models.py和views.py。admin.py用来向管理网站注册模型(model),models.py用来定义要在应用程序中管理的数据,views.py用来管理不同模型对应的网页视图。

拿bilibili举个例子,bilibili整个是一个项目,"分区”是其中的一个app,在这个app中有"音乐”、"番剧”、"游戏”、"科技”等model,每个model有着自己独特的网页视图(views),然后管理员可以在网站的后台管理分区中所有的视频数据(admin),差不多是这么个意思。

②定义模型Topic。我们首先需要想一想在"learning_logs”这个应用程序中涉及了哪些数据:每位用户都需要在学习笔记中创建不同的"主题”(Topic),每个主题下"关联”着一系列的"条目”(Entry),这些"条目”将以"文本”的方式显示。此外,每条文本还有自己对应的"创建时间”,以便告诉用户各个条目都是什么时候创建的。

首先打开models.py。文件中一开始就有"from django.db import models”,外加一条注释"# Create your models here.”。在代码层面,一个model就是一个类(class),和其他的类一样,model也包含"属性”和"方法”(即"成员变量”和"成员函数”)。接下来我们创建第一个model:Topic。代码如下:

class Topic(models.Model):

"""用户的学习主题"""

text=models.CharField(max_length=200)

date_added=models.DateTimeField(auto_now_add=True)

def __str__(self):

"""返回模型的字符串表示"""

return self.text

Topic中包含两个属性,text和date_added:

属性text是一个CharField,即"由字符或文本组成的数据”,可以用于储存少量的文本信息。括号中的max_length决定了数据库的预留空间,在这里我们将其设置为200,对于大多数主题来说都足够了。

属性date_added是一个DateTimeField,即"记录日期和时间的数据”,它将成为文本的时间戳,括号中的auto_now_added=True,表明该属性在新主题创建时,将自动设置成当前的日期和时间,并且能按创建顺序呈现各个主题。

Topic中还包含一个方法,__str__():

以双下划线开始和结束的方法是类的特殊的内置方法,这些内置方法将在某些时候自动调用。在这里,Django调用该方法来显示模型的简单表示,该方法返回的是储存在text中的字符串。

③激活模型Topic。要使用已经定义的模型,必须先让Django将应用程序包含在项目中。打开Learning_Log/Learning_Log文件夹中的settings.py,你可以找到以下片段:

INSTALLED_APPS = [

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

]

这是一个list,告诉Django项目是由哪些应用程序组成的。下面将前面的应用程序添加进去:

INSTALLED_APPS = [

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

# My Apps

'learning_logs',

]

(请注意其中的格式,在每一项后面都保留了逗号,这样方便后续的添加。)

通过这种将应用程序编组的方法,当项目不断增大、应用程序不断增多的时候,我们可以很方便地对各个应用程序进行追踪。现在,My Apps中只有一个应用程序:"learning_logs”,之后我们创建其他应用程序后也是如此操作。

④修改数据库。创建Topic的model之后,我们接下来需要让Django修改数据库,使其能够储存与Topic相关的信息。

执行命令:

python manage.py makemigrations learning_logs

(请注意makemigrations是复数的形式,不要漏了"s’!)d6b70fd92a5f620976546bad15979c2f22d6d51a.pngmakemigrations

终端将会显示我们成功创建了model Topic,此外Django创建了一个名为"0001__initial.py”的迁移文件,该文件存在于learning_logs/migrations文件夹中,并且会在数据库中为Topic创建一个表。

接下来应用这种迁移,让Django替我们修改数据库,执行命令:

python manage.py migrate

将会显示0001_initial文件迁移时一切正常。daf5a5f6058b27401835305f238fd928a1d71821.png迁移数据库

以上我们可以看出,之后我们每当需要修改管理的数据时,都采取这三个步骤:修改models.py,对应用程序调用makemigrations指令,对项目调用migrate指令。

⑤Django管理网站。大多数网站用户都只具备部分权限,这些权限决定了用户可执行的操作。最严格的设置权限只允许用户阅读网站公开信息;而注册用户一般可以阅读自己的私有数据和一些只有注册用户才能阅读的数据;网站还可能有VIP权限;而具有网站所有权限的用户叫做"超级用户”(super user),可以管理整个网站的所有数据。网站都需要这样的管理员来管理后台数据,Django提供的admin site能够轻松的管理网站,处理模型数据。

我们首先需要为项目创建一个super user,执行指令:

python manage.py createsuperuser

然后根据提示依次输入用户名(Username)、邮件地址(Email address,可不填)、密码(Password)、确认密码(Password(again)),创建完成后将会显示Superuser已经成功创建。请注意几点情况:输入密码时终端不会有显示,但是键盘的确读入了,所以输密码时没有任何反应是正常情况;如果密码和用户名相差不大,则会出于安全考虑问你是否忽略这一点继续创建,这里为了方便我直接yes了。60884ee6ed76548c300c400b3a4e0d4a20805c99.png创建超级用户

接下来需要向网站注册模型。打开:

http://localhost:8001/admin/

("网站的基础url’+"/admin’)

用刚才创建的账号登陆,可以看到Django原本就有一些模型:Users和Groups。a4b4522f8dbe234fb1d3b48834cacf08bd0607e8.png初始模型

而我们刚才创建的Topic模型并不在其中,我们需要进行手动注册。

打开admin.py文件,可以看到非常亲切的注册提醒。我们先导入Topic这个模型,再使用admin.site.register()进行注册,代码如下:

from learning_logs.models import Topic

admin.site.register(Topic)

现在刷新网页,可以看到下面多出了Topic的模型,表明Topic在网站上注册成功。8148c2c1d9e02dedd357b767a4b95bc5e5967b75.png注册Topic

我们还可以添加、修改主题。当前我们没有任何主题,所以不妨先添加几个主题。点击Topic旁边的Add,在文本框中输入"崩坏3rd”,点击save,可以看到第一个主题以及创建成功。请用同样的方法再创建一个"明日方舟”的主题。b20fe0cb5151a49c4eebf2683985f1b2e9b90d46.png添加主题

⑥创建模型Entry。Entry和Topic差不多,也有文本(text)属性和时间戳(date_added)属性,不同的是每一个entry都和某一个主题相关联,因此Entry还应该有主题(topic)属性。代码如下:

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):

"""返回模型的字符串表示"""

return self.text[:50] + "..."

topic属性是一个"外键”(ForeignKey),"外键”是一个数据库术语,简单地说就是表与表之间的某种约定的关系,感兴趣可以看看附录给的链接。括号中的on_delete参数设置为models.CASCADE,这表示数据库的"级联删除”,简单地说就是当Topic被删除时,和该Topic关联的Entry都会被删除。这一条代码可以实现将每一个条目都关联到特定的主题。

text属性是一个TextField,这种文本不需要长度的限制,因为我们想让条目要写多长就写多长。

date_added属性和__str__()方法跟上面Topic的一样。当然,为了方便显示,我们设置了文本显示的长度为前50个字符,然后末尾添加了一个省略号表示文本未完。不过这样有一个不足之处,当文本长度少于50的时候,表示未完的省略号也会出现,请将代码适当改写,使得只有当文本长度大于50的时候才显示省略号!(作业之一)

我们还注意到Entry类中还嵌套了一个Meta类,Meta储存用于管理模型的额外信息,verbose_name_plural指定了该模型的复数名称为"Entries”,若不设置该属性,则当需要显示多个条目时,Django将默认使用"Entrys”进行表示。关于Meta类以及可以设置的属性,可以参考附录给出的链接。

定义完Entry之后,请模仿之前对Topic的操作进行迁移模型和注册模型。

现在,让我们刷新管理网站,可以看到LEARNING_LOGS下面多出了Entry,下面我们点击Add,创建几个条目。由于每个Entry在创建时都必须要和外键Topic关联,所以先选择之前已经创建的主题"崩坏3rd”,然后在文本框中输入:

众所周知崩坏三是一款国际知名的手机休闲游戏,玩家界有句话叫做"养肝护肝崩坏三”,可见其休闲性不亚于QQ农场。

然后点击save and add another,我们再创建一条:

"啊,这蓝真天,白真云。”Hanser开口了,我朋友说他好了。

再用同样的方法创建一个"明日方舟”的条目:

从"awsl(啊我是驴)”可以看出,阿米娅属实是一只驴。

"阿米娅,现在还不能休息哦,你还没有证明完自己不是驴呢。”

点击save保存。8e757b419afc3219b00f37270090f5b3ec93be77.png添加条目

此后如果要修改条目,只需要点进相关条目即可直接修改。之后对于非超级用户,我们将会为主题和条目设置权限,使得每个普通用户只能修改自己创建的条目和主题,而其他用户只能进行阅读。

⑦Django Shell。和python的Shell一样,Django也有自己的Shell,一种交互式环境。在终端输入指令:

python manage.py shell

即可打开Django Shell。在Shell中,你可以非常方便地测试项目和排除故障。例如,现在要查看目前数据库中创建的所有Topic的实例,我们输入以下指令:

from learning_logs.models import Topic

Topic.objects.all()f0d9129a5486b479011409f0554a3ba3adc1bc85.png查看Topic

结果如图所示。终端中返回了一个列表,该列表称为"查询集”(queryset)。请注意,objects是复数,不要漏了"s’。我们还可以像对待普通列表一样操作,查看分配给每个主题的ID:

topics = Topic.objects.all()

for topic in topics:

print(topic.id, topic)9c737f874b92dd2e291f81d120dc3147fc6c6512.png查看ID

结果如图所示。得到了各个主题的ID之后,可以用get(id=)的方法,查看某个特定的对象:

t1 = Topic.objects.get(id=1)

t1.text

t1.date_addede6ab24137d2b209aef261fe0e20e6ddc879d1729.png查看某Topic属性数据

结果如图所示。请注意:date_added中有一项tzinfo=,这一项显示的是时区信息。想要了解相关信息的请自行搜索(因为我也不知道)。我们还可以查看t1下面关联的条目信息:

t1.entry_set.all()6be05059a1ba3f528fe957df9696b31e708349cf.png查看Topic下关联的Entry

结果如图所示。通过外键获取数据,可以使用相关模型的"小写名称”+"_set”。

请注意,每次修改模型之后,想要在shell中看到修改的效果,必须要重启shell。如果要退出shell,Windows系统按Ctrl+Z再回车即可。

db75225feabec8d8b64ee7d3c7165cd639554cbc.png

乱七八糟的附录:

1)请时刻记住激活虚拟环境(如果创建了的话)。

2)如果你使用的是python2.7,则不应该调用方法__str__(),而是应该调用方法__unicode__(),但其中代码不变。

3)创建账户时,Django并不直接储存输入的密码,而是根据密码派生出来一个字符串:"散列值”(Hash)。每当用户输入密码时,都将计算其散列值,再与储存的散列值相比较,散列值相同才能通过验证。在网站配置正确的情况下,几乎无法从散列值反推出密码,因此安全性得以大大提升。

4)关于外键,可以查阅下面这篇文章,文中使用一个实例说明外键的约束效果,不算太长且便于理解:

https://www.jianshu.com/p/6f6779b1d9fd

5)关于内嵌的Meta类,想了解可以编辑的模型额外信息,可查阅下面这篇文章,讲的还比较详细:

https://www.iteye.com/blog/lishiguang-1328982

db75225feabec8d8b64ee7d3c7165cd639554cbc.png

请为Blog项目创建一个应用程序,命名为"blogs”。

为你的Blog创建一个超级用户,并成功登陆管理网站。

在"blogs”中创建模型:"Theme”和"Article”,并将Article与特定的Theme关联起来。

请通过管理网站为Theme和Article分别添加内容,并通过shell查看相关数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值