Python 项目实践三(Web应用程序)第一篇
一 Djangao入门
当今的网站实际上都是富应用程序(rich application),就像成熟的桌面应用程序一样。Python提供了一组开发Web应用程序的卓越工具。在本章中,你将学习如何使用Django(http://djangoproject.com/)来开发一个名为“学习笔记”(Learning Log)的项目,这是一个在线日志系统,让你能够记录所学习的有关特定主题的知识。我们将为这个项目制定规范,然后为应用程序使用的数据定义模型。我们将使用Django的管理系统来输入一些初始数据,再学习编写视图和模板,让Django能够为我们的网站创建网页。
Django是一个Web框架——一套用于帮助开发交互式网站的工具。Django能够响应网页请求,还能让你更轻松地读写数据库、管理用户等。
1 准备工作
1.1 建立虚拟环境
要使用Django,首先需要建立一个虚拟工作环境。虚拟环境是系统的一个位置,你可以在其中安装包,并将其与其他Python包隔离。将项目的库与其他项目分离是有益的,且为了以后将“学习笔记”部署到服务器,这也是必须的。
为项目新建一个目录,将其命名为learning_log,再在终端中切换到这个目录,并创建一个虚拟环境。如果你使用的是Python 3,可使用如下命令来创建虚拟环境:
learning_log$ python -m venv ll_env
1.2 激活虚拟环境
建立虚拟环境后,需要使用下面的命令激活它:
命令ll_env\Scripts\activate
1.3 安装Django
(ll_env)learning_log$ pip install Django
以上三个步骤在我电脑操作为下图:
1.4 在Django中创建项目
在依然处于活动的虚拟环境的情况下(ll_env包含在括号内),执行如下命令来新建一个项目:
(ll_env)learning_log$ django-admin.py startproject learning_log .
(ll_env)learning_log$ ls
learning_log ll_env manage.py
(ll_env)learning_log$ ls learning_log
__init__.py settings.py urls.py wsgi.py
django-admin.py startproject learning_log .让Django新建一个名为learning_log的项目。这个命令末尾的句点让新项目使用合适的目录结构,这样开发完成后可轻松地将应用程序部署到服务器。
运行了命令ls(在Windows系统上应为dir),结果表明Django新建了一个名为learning_log的目录。它还创建了一个名为manage.py的文件,这是一个简单的程序,它接受命令并将其交给Django的相关部分去运行。我们将使用这些命令来管理诸如使用数据库和运行服务器等任务。
目录learning_log包含4个文件,其中最重要的是settings.py、urls.py和wsgi.py。文件settings.py指定Django如何与你的系统交互以及如何管理项目。在开发项目的过程中,我们将修改其中一些设置,并添加一些设置。文件urls.py告诉Django应创建哪些网页来响应浏览器请求。文件wsgi.py帮助Django提供它创建的文件,这个文件名是web server gateway interface(Web服务器网关接口)的首字母缩写。如下图:
1.5 创建数据库
Django将大部分与项目相关的信息都存储在数据库中,因此我们需要创建一个供Django使用的数据库。为给项目“学习笔记”创建数据库,请在处于活动虚拟环境中的情况下执行下面的命令:
(11_env) D:\study\python\code\learning_log> python manage.py migrate
如下图:
我们将修改数据库称为迁移数据库。首次执行命令migrate时,将让Django确保数据库与项目的当前状态匹配。在使用SQLite(后面将更详细地介绍)的新项目中首次执行这个命令时,Django将新建一个数据库。Django指出它将创建必要的数据库表,用于存储我们将在这个项目(Synchronize unmigrated apps,同步未迁移的应用程序)中使用的信息,再确保数据库结构与当前代码(Apply all migrations,应用所有的迁移)匹配。Django又创建了一个文件——db.sqlite3。SQLite是一种使用单个文件的数据库,是编写简单应用程序的理想选择,因为它让你不用太关注数据库管理的问题。
1.6 检查项目
下面来核实Django是否正确地创建了项目。为此,可执行命令runserver,如下所示:
Django启动一个服务器,让你能够查看系统中的项目,了解它们的工作情况。当你在浏览器中输入URL以请求网页时,该Django服务器将进行响应:生成合适的网页,并将其发送给浏览器。
现在打开一款Web浏览器,并输入URL:http://localhost:8000/;如果这不管用,请输入http://127.0.0.1:8000/。如下图:
2 创建应用程序
Django项目由一系列应用程序组成,它们协同工作,让项目成为一个整体。我们暂时只创建一个应用程序,它将完成项目的大部分工作。在后面,我们将再添加一个管理用户账户的应用程序。
当前,在前面打开的终端窗口中应该还运行着runserver。请再打开一个终端窗口(或标签页),并切换到manage.py所在的目录。激活该虚拟环境,再执行命令startapp:
D:\study\python\code\learning_log>D:\study\python\code\learning_log\11_env\Scripts\activate (11_env) D:\study\python\code\learning_log>dir Volume in drive D is New Volume Volume Serial Number is 98C0-1AEA Directory of D:\study\python\code\learning_log 01/02/2018 04:11 PM <DIR> . 01/02/2018 04:11 PM <DIR> .. 01/02/2018 03:56 PM <DIR> 11_env 01/02/2018 04:11 PM 131,072 db.sqlite3 01/02/2018 04:11 PM <DIR> learning_log 01/02/2018 04:02 PM 559 manage.py 2 File(s) 131,631 bytes 4 Dir(s) 955,714,387,968 bytes free (11_env) D:\study\python\code\learning_log>python manage.py startapp learning_logs (11_env) D:\study\python\code\learning_log>dir Volume in drive D is New Volume Volume Serial Number is 98C0-1AEA Directory of D:\study\python\code\learning_log 01/02/2018 04:31 PM <DIR> . 01/02/2018 04:31 PM <DIR> .. 01/02/2018 03:56 PM <DIR> 11_env 01/02/2018 04:11 PM 131,072 db.sqlite3 01/02/2018 04:11 PM <DIR> learning_log 01/02/2018 04:31 PM <DIR> learning_logs 01/02/2018 04:02 PM 559 manage.py 2 File(s) 131,631 bytes 5 Dir(s) 955,714,383,872 bytes free (11_env) D:\study\python\code\learning_log>dir learning_logs Volume in drive D is New Volume Volume Serial Number is 98C0-1AEA Directory of D:\study\python\code\learning_log\learning_logs 01/02/2018 04:31 PM <DIR> . 01/02/2018 04:31 PM <DIR> .. 01/02/2018 04:31 PM 66 admin.py 01/02/2018 04:31 PM 105 apps.py 01/02/2018 04:31 PM <DIR> migrations 01/02/2018 04:31 PM 60 models.py 01/02/2018 04:31 PM 63 tests.py 01/02/2018 04:31 PM 66 views.py 01/02/2018 04:31 PM 0 __init__.py 6 File(s) 360 bytes 3 Dir(s) 955,714,383,872 bytes free (11_env) D:\study\python\code\learning_log>
命令startapp appname让Django建立创建应用程序所需的基础设施。如果现在查看项目目录,将看到其中新增了一个文件夹learning_logs。打开这个文件夹,看看Django都创建了什么。其中最重要的文件是models.py、admin.py和views.py。我们将使用models.py来定义我们要在应用程序中管理的数据。admin.py和views.py将在稍后介绍。
2.1 定义模型
我们来想想涉及的数据。每位用户都需要在学习笔记中创建很多主题。用户输入的每个条目都与特定主题相关联,这些条目将以文本的方式显示。我们还需要存储每个条目的时间戳,以便能够告诉用户各个条目都是什么时候创建的。
from django.db import models # Create your models here. class Topic(models.Model): '''用户学习的主题''' text = models.CharField(max_length=200) date_added = models.DateTimeField(auto_now_add=True) def __str__(self): '''返回模型的字符串表示''' return self.text
(1)导入了模块models,还让我们创建自己的模型。模型告诉Django如何处理应用程序中存储的数据。在代码层面,模型就是一个类,就像前面讨论的每个类一样,包含属性和方法。
(2)Topic类,它继承了Model——Django中一个定义了模型基本功能的类。Topic类只有两个属性:text和date_added。
2.2 激活模型
要使用模型,必须让Django将应用程序包含到项目中。为此,打开settings.py(它位于目录learning_log/learning_log中),你将看到一个这样的片段,即告诉Django哪些应用程序安装在项目中:
# Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', #我的应用程序 'learning_logs' ]
这是一个元组,告诉Django项目是由哪些应用程序组成的。请在INSTALLED_APPS中添加:
#我的应用程序 'learning_logs'
接下来,需要让Django修改数据库,使其能够存储与模型Topic相关的信息。为此,在终端窗口中执行下面的命令:
(11_env) D:\study\python\code\learning_log>python manage.py makemigrations learning_logs Migrations for 'learning_logs': learning_logs\migrations\0001_initial.py - Create model Topic (11_env) D:\study\python\code\learning_log>
命令makemigrations让Django确定该如何修改数据库,使其能够存储与我们定义的新模型相关联的数据。输出表明Django创建了一个名为0001_initial.py的迁移文件,这个文件将在数据库中为模型Topic创建一个表。下面来应用这种迁移,让Django替我们修改数据库:
这个命令的大部分输出都与我们首次执行命令migrate的输出相同。我们需要检查的是最后的输出行,在这里,Django确认为learning_logs应用迁移时一切正常(OK),每当需要修改“学习笔记”管理的数据时,都采取如下三个步骤:修改models.py;对learning_logs调用makemigrations;让Django迁移项目。
2.3 Django管理网站
为应用程序定义模型时,Django提供的管理网站(admin site)让你能够轻松地处理模型。网站的管理员可使用管理网站,但普通用户不能使用。在本节中,我们将建立管理网站,并通过它使用模型Topic来添加一些主题。
2.3.1 创建超级用户
Django允许你创建具备所有权限的用户——超级用户。权限决定了用户可执行的操作。为在Django中创建超级用户,请执行下面的命令并按提示做:
密码为:admin123456
2.3.2 向网站注册模型
Django自动在管理网站中添加了一些模型,如User和Group,但对于我们创建的模型,必须手工进行注册。我们创建应用程序learning_logs时,Django在models.py所在的目录中创建了一个名为admin.py的文件,为向管理网站注册Topic,请输入下面的代码:
from django.contrib import admin # Register your models here. from learning_logs.models import Topic admin.site.register(Topic)
这些代码导入我们要注册的模型Topic,再使用admin.site.register()让Django通过管理网站管理我们的模型。现在,使用超级用户账户访问管理网站:访问http://localhost:8000/admin/,并输入你刚创建的超级用户的用户名和密码,这个网页让你能够添加和修改用户和用户组,还可以管理与刚才定义的模型Topic相关的数据.如下
2.3.3 添加主题
单击Topics进入主题网页,它几乎是空的,这是因为我们还没有添加任何主题。单击Add,你将看到一个用于添加新主题的表单。在第一个方框中输入Chess,再单击Save,这将返回到主题管理页面,其中包含刚创建的主题。下面再创建一个主题,以便有更多的数据可供使用。再次单击Add,并创建另一个主题RockClimbing。当你单击Save时,将重新回到主题管理页面,其中包含主题Chess和Rock Climbing。如下图:
2.4 定义模型Entry
要记录学到的国际象棋和攀岩知识,需要为用户可在学习笔记中添加的条目定义模型。每个条目都与特定主题相关联,这种关系被称为多对一关系,即多个条目可关联到同一个主题。下面是模型Entry的代码:
from django.db import models # Create your models here. class Topic(models.Model): '''用户学习的主题''' text = models.CharField(max_length=200) date_added = models.DateTimeField(auto_now_add=True) def __str__(self): '''返回模型的字符串表示''' return self.text 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] + "..."
书中这句date_added = models.DateTimeField(auto_now_add=True)会报错,改成上面的即可。
2.5迁移模型
由于我们添加了一个新模型,因此需要再次迁移数据库。你将慢慢地对这个过程了如指掌:修改models.py , 执行命令python manage.py makemigrations app_name , 再执行命令pythonmanage.py migrate。
2.6 向管理网站注册Entry
我们还需要注册模型Entry。为此,需要将admin.py修改成类似于下面这样:
from django.contrib import admin from learning_logs.models import Topic, Entry admin.site.register(Topic) admin.site.register(Entry)
返回到http://localhost/admin/,你将看到learning_logs下列出了Entries。单击Entries的Add链接,或者单击Entries再选择Add entry。你将看到一个下拉列表,让你能够选择要为哪个主题创建条目,还有一个用于输入条目的文本框。从下拉列表中选择Chess,并添加一个条目。下面是我添加的第一个条目。
再来创建一个国际象棋条目,并创建一个攀岩条目,以提供一些初始数据。下面是第二个国际象棋条目。继续往下开发“学习笔记”时,这三个条目可为我们提供使用的数据。
2.7 Django shell
输入一些数据后,就可通过交互式终端会话以编程方式查看这些数据了。这种交互式环境称为Django shell,是测试项目和排除其故障的理想之地。下面是一个交互式shell会话示例:
在活动的虚拟环境中执行时,命令python manage.py shell启动一个Python解释器,可使用它来探索存储在项目数据库中的数据。
今天就先写到这里吧,有空继续学习!
Python 项目实践三(Web应用程序)第一篇的更多相关文章
- Python 项目实践一(外星人入侵)第一篇
python断断续续的学了一段实践,基础课程终于看完了,现在跟着做三个小项目,第一个是外星人入侵的小游戏: 一 Pygame pygame 是一组功能强大而有趣的模块,可用于管理图形,动画乃至声音,让 ...
- Python 项目实践三(Web应用程序)第三篇
接着上节的继续学习,现在要显示所有主题的页面 有了高效的网页创建方法,就能专注于另外两个网页了:显示全部主题的网页以及显示特定主题中条目的网页.所有主题页面显示用户创建的所有主题,它是第一个需要使用数 ...
- Python 项目实践三(Web应用程序) 第三篇
接着上节的继续学习,现在要显示所有主题的页面 有了高效的网页创建方法,就能专注于另外两个网页了:显示全部主题的网页以及显示特定主题中条目的网页.所有主题页面显示用户创建的所有主题,它是第一个需要使用数 ...
- Python 项目实践三(Web应用程序)第二篇
接着上节的继续学习,使用Django创建网页的过程通常分三个阶段:定义URL.编写视图和编写模板.首先,你必须定义URL模式,每个URL都被映射到特定的视图--视图函数获取并处理网页所需的数据.视图函 ...
- Python 项目实践三(Web应用程序)第四篇
接着上节继续学习,本章将建立用户账户 Web应用程序的核心是让任何用户都能够注册账户并能够使用它,不管用户身处何方.在本章中,你将创建一些表单,让用户能够添加主题和条目,以及编辑既有的条目.你还将学习 ...
- Python 项目实践三(Web应用程序)第五篇
接着上节继续学习,在这一节,我们将建立一个用户注册和身份验证系统,让用户能够注册账户,进而登录和注销.我们将创建一个新的应用程序,其中包含与处理用户账户相关的所有功能.我们还将对模型Topic稍做修改 ...
- Python 项目实践一(外星人入侵)第二篇
接着上次的继续学习. 一 创建一个设置类 每次给游戏添加新功能时,通常也将引入一些新设置.下面来编写一个名为settings的模块,其中包含一个名为Settings的类,用于将所有设置存储在一个地方, ...
- Python全栈开发之路 【第一篇】:Python 介绍
本节内容 一.Python介绍 python的创始人为荷兰人——吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本 ...
- GNU大型项目构建和覆盖率生成(第一篇)
目录 0. 序言 1. 项目描述 2. 项目构建 2.1 编译规则 2.2 构建过程 3. 覆盖率分析 0. 序言 在开始正文之前,请允许我先说明一下本文的目的和写作的动机,好让读者不惑. 我们知道, ...
随机推荐
- 神奇的 routing mesh - 每天5分钟玩转 Docker 容器技术(100)
接上一节案例,当我们访问任何节点的 8080 端口时,swarm 内部的 load balancer 会将请求转发给 web_server 其中的一个副本. 这就是 routing mesh 的作用. ...
- ShoneSharp语言(S#)的设计和使用介绍—数值Double
ShoneSharp语言(S#)的设计和使用介绍 系列(5)- 数值Double 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSh ...
- 用vue2.x注册一个全局的弹窗alert组件
一.在实际的开发当中,弹窗是少不了的,默认系统的弹窗样式太丑,难以满足项目的实际需求,所以需要自己定义弹窗组件,把弹窗组价定义为全局的,这样减少每次使用的时候引入麻烦,节省开发时间.本文将分享如何定义 ...
- Spring Cloud Ribbon 整合 Hystrix
在前面随笔 Spring Cloud 之 Ribbon 的ribbon工程基础上进行改造 1.pom.xml 加入依赖 <dependency> <groupId>org.sp ...
- PHPstorm 函数时间注释的修改
正常的PHPstorm里面函数方法的注释是没有动态时间设置的,但是看了PHP file里面有时间日期的注释,而PHP Function Doc Comment 却没有,让很多PHPer很头疼,今天在搜 ...
- 【NOIP2014提高组】寻找道路
https://www.luogu.org/problem/show?pid=2296 满足条件的路径:路径上的所有点的出边所指向的点都与终点连通.反过来,不满足条件的路径:路径上至少一点的出边所指向 ...
- 【luogu P1613】跑路
https://www.luogu.org/problem/show?pid=1613 看到2k就能想到倍增.用一个数组avai[i][j][k]表示点i与点j是否存在长2k的路径,则可以递推出ava ...
- WPF依赖对象(DependencyObject) 实现源码,理解WPF原理必读
/// DependencyObject encompasses all property engine services. It's primary function /// is providin ...
- JaveScript变量的简介及其变量的简单使用(JS知识点归纳一)
变量简介 "变量是一个容器" 为什么要有变量? 程序的执行过程中,会使用到许多的数据(用户输入的内容,动态效果的运动数据等),当这些数据需要重复在多个地方使用的时候,就需要一个容器 ...
- poj Minimum( CutStoer Wagner算法)
Minimum Cut 题目: 给出一张图.要求你删除最小割权和图. 算法分析: //////////////////// 转载 --- ylfdrib ///////////////// ...