您的位置:首页 > 编程语言 > Python开发

Python练习Django项目——学习笔记

2018-03-20 22:35 387 查看
    学习如何使用Django(http://djangoproject.com/ )来开发一个名为“学习笔记”(Learning Log)的项目,这是一个在线日志系统,让你能够记录所学习的有关特定主题的知识。
    首先为这个项目制定规范,然后为应用程序使用的数据定义模型。我们将使用Django的管理系统来输入一些初始数据,再学习编写视图和模板,让Django能够为我们的网站创建网页。最后将改进“学习笔记”项目,再将其部署到活动的服务器,让你和你的朋友能够使用它。
    Django是一个Web框架 ——一套用于帮助开发交互式网站的工具。Django能够响应网页请求,还能让你更轻松地读写数据库、管理用户等。
建立项目
制定规范
    完整的规范详细说明了项目的目标,阐述了项目的功能,并讨论了项目的外观和用户界面。与任何良好的项目规划和商业计划书一样,规范应突出重点,帮助避免项目偏离轨道。这里不会制定完整的项目规划,而只列出一些明确的目标,以突出开发的重点。我们制定的规范如下:
    编写一个名为“学习笔记”的Web应用程序,让用户能够记录感兴趣的主题,并在学习每个主题的过程中添加日志条目。“学习笔记”的主页对这个网站进行描述,并邀请用户注册或登录。用户登录后,就可创建新主题、添加新条目以及阅读既有的条目。
建立虚拟环境
    要使用Django,首先需要建立一个虚拟工作环境。虚拟环境是系统的一个位置,你可以在其中安装包,并将其与其他Python包隔离。将项目的库与其他项目分离是有益的,且为了“学习笔记”部署到服务器,这也是必须的。为项目新建一个目录,将其命名为learning_log,再在终端中切换到这个目录,并创建一个虚拟环境。
Windows安装virtualenv:pip install virtualenv
conda install virtualenv    #有Anaconda的安装命令
切换到learning_log目录,创建虚拟环境:(ll_env)learning_log> virtualenv ll_env
New python executable in ll_env/bin/python
Installing setuptools, pip...done.激活虚拟环境:ll_env\Scripts\activate停止使用虚拟环境deactivate安装Django
(ll_env)learning_log> pip install Django
Installing collected packages: Django
Successfully installed Django
Cleaning up...
在Django中创建项目
在依然处于活动的虚拟环境的情况下(ll_env包含在括号内),执行如下命令来新建一个项目:
❶ (ll_env)learning_log> django-admin startproject learning_log .
❷ (ll_env)learning_log> dir
learning_log ll_env manage.py
❸ (ll_env)learning_log> dir learning_log
__init__.py settings.py urls.py wsgi.py    ❶处的命令让Django新建一个名为learning_log的项目。这个命令末尾的句点让新项目使用合适的目录结构,这样开发完成后可轻松地将应用程序部署到服务器。
    注意:千万别忘了这个句点,否则部署应用程序时将遭遇一些配置问题。如果忘记了这个句点,就将创建的文件和文件夹删除(ll_env除外),再重新运行这个命令。
    在❸处,运行了命令dir,结果表明Django新建了一个名为learning_log的目录。它还创建了一个名为manage.py的文件,这是一个简单的程序,它接受命令并将其交给Django的相关部分去运行。我们将使用这些命令来管理诸如使用数据库和运行服务器等任务。
   文件settings.py指定Django如何与你的系统交互以及如何管理项目。在开发项目的过程中,我们将修改其中一些设置,并添加一些设置。    文件urls.py告诉Django应创建哪些网页来响应浏览器请求。    文件wsgi.py帮助Django提供它创建的文件,这个文件名是web server gateway interface(Web服务器网关接口 )的首字母缩写。
创建数据库
    Django将大部分与项目相关的信息都存储在数据库中,因此我们需要创建一个供Django使用的数据库。为给项目“学习笔记”创建数据库,请在处于活动虚拟环境中的情况下执行下面的命令: (ll_env)learning_log> python manage.py migrate
❶ Operations to perform:
Synchronize unmigrated apps: messages, staticfiles
Apply all migrations: contenttypes, sessions, auth, admin
--snip--
Applying sessions.0001_initial... OK
❷ (ll_env)learning_log> dir
db.sqlite3 learning_log ll_env manage.py    我们将修改数据库称为迁移 数据库。首次执行命令migrate 时,将让Django确保数据库与项目的当前状态匹配。在使用SQLite的新项目中首次执行这个命令时,Django将新建一个数据库。在❶处,Django指出它将创建必要的数据库表,用于存储我们将在这个项目(Synchronize unmigrated apps,同步未迁移的应用程序 )中使用的信息,再确保数据库结构与当前代码(Apply all migrations,应用所有的迁移 )匹配。
    在❷处,我们运行了命令dir ,其输出表明Django又创建了一个文件——db.sqlite3。SQLite是一种使用单个文件的数据库,是编写简单应用程序的理想选择,因为它让你不用太关注数据库管理的问题。
查看项目
下面来核实Django是否正确地创建了项目。为此,可执行命令runserver ,如下所示:
(ll_env)learning_log$ python manage.py runserver
Performing system checks...

❶ System check identified no issues (0 silenced).
March 20, 2018 - 16:26:51
❷ Django version 2.0.3, using settings 'learning_log.settings'
❸ Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.    Django启动一个服务器,让你能够查看系统中的项目,了解它们的工作情况。当你在浏览器中输入URL以请求网页时,该Django服务器将进行响应:生成合适的网页,并将其发送给浏览器。
    在❶处,Django通过检查确认正确地创建了项目;在❷处,它指出了使用的Django版本以及当前使用的设置文件的名称;在❸处,它指出了项目的URL。URL http://127.0.0.1:8000/表明项目将在你的计算机(即localhost)的端口8000上侦听请求。localhost是一种只处理当前系统发出的请求,而不允许其他任何人查看你正在开发的网页的服务器。     现在打开一款Web浏览器,并输入URL:http://localhost:8000/;如果这不管用,请输入http://127.0.0.1:8000/。你将看到下图页面,这个页面是Django创建的,让你知道到目前为止一切正常。现在暂时不要关闭这个服务器。若要关闭这个服务器,按Ctrl + C即可。



创建应用程序
    Django项目 由一系列应用程序组成,它们协同工作,让项目成为一个整体。前面打开的终端窗口中应该还运行着runserver 。请再打开一个终端窗口,并切换到manage.py所在的目录。激活该虚拟环境,再执行命令startapp :learning_log> ll_env/Scripts/activate
(ll_env)learning_log> python manage.py startapp learning_logs
❶ (ll_env)learning_log> dir
db.sqlite3 learning_log learning_logs ll_env manage.py
❷ (ll_env)learning_log> dir learning_logs/
admin.py __init__.py migrations models.py tests.py views.py    命令startapp appname 让Django建立创建应用程序所需的基础设施。新增了一个文件夹learning_logs,其中最重要的文件是models.py、admin.py和views.py。我们将使用models.py来定义我们要在应用程序中管理的数据。
定义模型Topic
    可能涉及的数据:每位用户都需要在学习笔记中创建很多主题。用户输入的每个条目都与特定主题相关联,这些条目将以文本的方式显示。存储每个条目的时间戳,以便告诉用户各个条目都是什么时候创建的。
打开文件models.py,文件本身导入了模块models,还让我们创建自己的模型
from django.db import models

# Create your models here.模型告诉Django如何处理应用程序中存储的数据。在代码层面,模型就是一个类,就像前面讨论的每个类一样,包含属性和方法
from djan
f5e9
go.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
        #创建Topic类,继承Model——Django中一个定义了模型基本功能的类
#属性text是一个Charfield——由字符或文本组成的数据,存储少量文本时使用CharField,如标题、名称等,
        #定义CharField时必须告诉Django在数据库中预留多少空间,这里设置为200
        #属性date_added是一个DateTimeField——记录日期和时间的数据,实参auto_now_add=True,每当用户创建新主题时,都让Django将这个属性自动设置成当前日期和时间
      我们需要告诉Django,默认应使用哪个属性来显示有关主题的信息。Django调用方法__str__() 来显示模型的简单表示。在这里,我们编写了方法__str__() ,它返回存储在属性text 中的字符串.
注意  Python 2.7,应调用方法__unicode__() ,而不是__str__() ,但其中的代码相同。
激活模型
    要使用模型,必须让Django将应用程序包含到项目中。为此,打开settings.py(它位于目录learning_log/learning_log中),你将看到一个这样的片段,即告诉Django哪些应用程序安装在项目中:--snip--
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
--snip--    这是一个元组,告诉Django项目是由哪些应用程序组成的。请将INSTALLED_APPS 修改成下面这样,将前面的应用程序添加到这个元组中:--snip--
INSTALLED_APPS = (
--snip--
'django.contrib.staticfiles',

# My apps
'learning_logs',
)
--snip--    通过将应用程序编组,在项目不断增大,包含更多的应用程序时,有助于对应用程序进行跟踪。这里新建了一个名为My apps的片段,当前它只包含应用程序learning_logs。
    接下来,需要让Django修改数据库,使其能够存储与模型Topic 相关的信息。为此,在终端窗口中执行下面的命令:
(ll_env)learning_log> python manage.py makemigrations learning_logs
Migrations for 'learning_logs':
learning_logs\migrations\0001_initial.py:
- Create model Topic
    命令makemigrations 让Django确定该如何修改数据库,使其能够存储与我们定义的新模型相关联的数据。输出表明Django创建了一个名为0001_initial.py的迁移文件,这个文件将在数据库中为模型Topic 创建一个表。
下面来应用这种迁移,让Django替我们修改数据库:(ll_env)learning_log> python manage.py migrate
--snip--
Running migrations:
❶ Applying learning_logs.0001_initial... OK    检查的❶处的输出行,在这里,Django确认为learning_logs 应用迁移时一切正常(OK )。
    每当需要修改“学习笔记”管理的数据时,都采取如下三个步骤:修改models.py;对learning_logs 调用makemigrations ;让Django迁移项目.

Django管理网站
    为应用程序定义模型时,Django提供的管理网站(admin site)让你能够轻松地处理模型。网站的管理员可使用管理网站,但普通用户不能使用。在本节中,我们将建立管理网站,并通过它使用模型Topic来添加一些主题。
创建超级用户
    Django允许创建具备所有权限的用户——超级用户。权限决定了用户可执行的操作。最严格的权限设置只允许用户阅读网站的公开信息;注册了的用户通常可阅读自己的私有数据,还可查看一些只有会员才能查看的信息。为有效地管理Web应用程序,网站所有者通常需要访问网站存储的所有信息。优秀的管理员会小心对待用户的敏感信息,因为用户对其访问的应用程序有极大的信任。
(ll_env)learning_log>python manage.py createsuperuser
❶ Username (leave blank to use 'ehmatthes'): ll_admin
❷ Email address:
❸ Password:
Password (again):
Superuser created successfully.
注意
  可能会对网站管理员隐藏有些敏感信息。例如,Django并不存储你输入的密码,而存储从该密码派生出来的一个字符串——散列值。输入密码Django计算其散列值,并将结果与存储的散列值进行比较。如果相同,就通过身份验证。
向管理网站注册模型
    Django自动在管理网站中添加了一些模型,如User 和Group ,但对于我们创建的模型,必须手工进行注册。我们创建应用程序learning_logs 时,Django在models.py所在的目录中创建了一个名为admin.py的文件,:

admin.py
from django.contrib import admin

# 在这里注册你的模型    为向管理网站注册Topic ,请输入下面的代码:
from django.contrib import admin
❶ from learning_logs.models import Topic
❷ admin.site.register(Topic)
    这些代码导入我们要注册的模型Topic (见❶),再使用admin.site.register() (见❷)让Django通过管理网站管理我们的模型。
    现在,激活虚拟环境,并执行命令python manage.py runserver并运行服务器,使用超级用户账户访问管理网站:访问http://localhost:8000/admin/ ,并输入你刚创建的超级用户的用户名和密码,这个网页让你能够添加和修改用户和用户组,还可以管理与刚才定义的模型Topic 相关的数据。



添加主题
    向管理网站注册Topic后,添加第一个主题。单击Topics进入主题网页,单击Add,你将看到一个用于添加新主题的表单。在第一个方框中输入Chess ,再单击Save。再创建一个主题,以便有更多的数据可供使用。单击Add,并创建另一个主题Rock Climbing 。单击Save后,将重新回到主题管理页面,其中包含主题Chess和Rock Climbing。

定义模型Entry
    要记录学到的国际象棋和攀岩知识,需要为用户可在学习笔记中添加的条目定义模型。每个条目都与特定主题相关联,这种关系被称为多对一关系,即多个条目可关联到同一个主题。
from django.db import models

# Model是Django中一个定义了模型基本功能的类
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):
return self.text[:50]+"..." #属性topic 是一个ForeignKey 实例,外键是一个数据库术语,引用了数据库中的另一条记录; #这些代码将每个条目关联到特定的主题。每个主题创建时,都给它分配了一个键(或ID)。 需要在两项数据之间建立联系时,Django使用与每项信息相关联的键。Django2.0版本外键要求添加on_delete参数
        #属性text 是一个TextField 实例,不需要长度限制的文本数据

        #属性date_added按创建顺序呈现条目,并在每个条目旁边放置时间戳。

        #在Entry 类中嵌套了Meta 类。Meta 存储用于管理模型的额外信息,设置一个特殊属性,让Django需要时使用Entries表示多个条目,没有这个类将使用Entrys来表示多个条目

        #方法__str__() 告诉Django,呈现条目时应显示哪些信息

迁移模型Entry
    添加一个模型,就迁移一次数据库。过程:修改models.py,执行命令python manage.py makemigrations app_name ,再执行命令python manage.py migrate 。(ll_env)learning_log> python manage.py makemigrations learning_logs
Migrations for 'learning_logs':
learning_logs\migrations\0002_entry.py:
- Create model Entry
(ll_env)learning_log> python manage.py migrate
Operations to perform:
--snip--
Running migrations:
Applying learning_logs.0002_entry... OK    生成了一个新的迁移文件——0002_entry.py,它告诉Django如何修改数据库,使其能够存储与模型Entry 相关的信息。执行命令migrate ,Django应用了这种迁移且一切顺利。
向管理网站注册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,并添加一个条目。
        国际象棋的第一个阶段是开局,大致是前10步左右。在开局阶段,最好做三件事情:将象和马调出来;努力控制棋盘的中间区域;用车将王护住。当然,这些只是指导原则。学习什么情况下遵守这些原则、什么情况下不用遵守很重要。

    单击Save时,将返回到主条目管理页面。使用text[:50] 作为条目的字符串表示的好处:管理界面中,只显示了条目的开头部分而不是其所有文本,这使得管理多个条目容易得多。
    再来创建一个国际象棋条目,并创建一个攀岩条目,以提供一些初始数据。

        在国际象棋的开局阶段,将象和马调出来很重要。这些棋子威力大,机动性强,在开局阶段扮演着重要角色。

         最重要的攀岩概念之一是尽可能让双脚承受体重。有谬误认为攀岩者能依靠手臂的力量坚持一整天。实际上,优秀的攀岩者都经过专门训练,能够尽可能让双脚承受体重。

Django shell
    输入一些数据后,就可通过交互式终端会话以编程方式查看这些数据了。这种交互式环境称为Django shell,是测试项目和排除其故障的理想之地。下面是一个交互式shell会话示例:
(ll_env)learning_log> python manage.py shell
>>> from learning_logs.models import Topic
>>> Topic.objects.all()
[<Topic: Chess>, <Topic: Rock Climbing>]    在活动的虚拟环境中执行时,命令python manage.py shell 启动一个Python解释器,可使用它来探索存储在项目数据库中的数据。在这里,我们导入了模块learning_logs.models 中的模型Topic ,然后使用方法Topic.objects.all() 来获取模型Topic 的所有实例;它返回的是一个列表,称为查询集(queryset)。
    查看分配给每个主题对象的ID:
>>> topics = Topic.objects.all()
>>> for topic in topics:
... print(topic.id, topic)
...
1 Chess
2 Rock Climbing    知道对象的ID后,就可获取该对象并查看其任何属性。
t = Topic.objects.get(id=1)
>>> t.text
'Chess'
>>> t.date_added
datetime.datetime(2018, 3, 21, 6, 29, 14, 111938, tzinfo=<UTC>)
查看与主题相关联的条目.属性topic 是一个ForeignKey ,将条目与主题关联起来。利用这种关联,Django能够获取与特定主题相关联的所有条目,
>>> t.entry_set.all()
[<Entry: The opening is the first part of the game, roughly...>, <Entry: In the opening phase of the game, it's important t...>]
    为通过外键关系获取数据,可使用相关模型的小写名称、下划线和单词set.例如,假设你有模型Pizza 和Topping ,而Topping通过一个外键关联到Pizza ;如果你有一个名为my_pizza 的对象,表示一张比萨,就可使用代码my_pizza.topping_set.all() 来获取这张比萨的所有配料。

    编写用户可请求的网页时,我们将使用这种语法。确认代码能获取所需的数据时,shell很有帮助。如果代码在shell中的行为符合预期,那么它们在项目文件中也能正确地工作。如果代码引发了错误或获取的数据不符合预期,那么在简单的shell环境中排除故障要比在生成网页的文件中排除故障容易得多。

注意
  每次修改模型后,你都需要重启shell,这样才能看到修改的效果。要退出shell会话,可按Ctr + D;如果你使用的是Windows系统,应按Ctr + Z,再按回车键。
创建网页:学习笔记主页
    使用Django创建网页的过程通常分三个阶段:定义URL、编写视图和编写模板。首先,你必须定义URL模式。URL模式描述了URL是如何设计的,让Django知道如何将浏览器请求与网站URL匹配,以确定返回哪个网页。

    每个URL都被映射到特定的视图 ——视图函数获取并处理网页所需的数据。视图函数通常调用一个模板,后者生成浏览器能够理解的网页。定义学习笔记主页的URL、编写其视图函数并创建一个简单的模板。

映射URL
    用户通过在浏览器中输入URL以及单击链接来请求网页,因此我们需要确定项目需要哪些URL。主页的URL最重要,它是用户用来访问项目的基础URL。当前,基础URL(http://localhost:8000/)返回默认的Django网站,让我们知道正确地建立了项目。我们将修改这一点,将这个基础URL映射到“学习笔记”的主页。
打开项目主文件夹learning_log中的文件urls.py,你将看到如下代码:"""learning_log URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.0/topics/http/urls/ Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

#变量urlpatterns包含项目中的应用程序的URL
urlpatterns = [
#模块admin.site.urls定义了可在管理网站中请求的所有URL
path('admin/', admin.site.urls),
]

添加了一行代码来包含模块learning_logs.urls:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
#模块admin.site.urls定义了可在管理网站中请求的所有URL
path('admin/', admin.site.urls),
#实参namespace将learning_logs的URL同项目中的其他URL区分开来
path('', include('learning_logs.urls',namespace='learning_logs')),
]
#实参namespace将learning_logs的URL同项目中的其他URL区分开来,默认的urls.py包含在文件夹learning_log中,现在我们需要在文件夹learning_logs中创建另一个urls.py文件:
urls.py
"""定义learning_logs的URL模式"""
from django.urls import path
#从当前的urls.py模块所在的文件夹中导入视图
from . import views
#变量urlpatterns是一个列表,包含可在应用程序learning_logs中请求的网页
app_name = 'learning_logs'
urlpatterns = [
#主页
#第一个是正则表达式,r让Python将接下来的字符串视为原始字符串,引号正则表达式始于和终于何处
#第二个实参指定了要调用的视图函数
#第三个实参将这个URL模式的名称指定为index
path(r'',views.index,name='index'),
]
编写视图
视图函数接受请求中的信息,准备好生成网页所需的数据,再将这些数据发送给浏览器——这通常是使用定义了网页是什么样的模板实现的。
learning_logs中的文件views.py是你执行命令python manage.py startapp 时自动生成的,当前其内容如下:
views.pyfrom django.shortcuts import render#根据视图提供的数据渲染响应

# 在这里创建视图为主页编写视图
from django.shortcuts import render

# Create your views here.
def index(request):
"""学习笔记的主页"""
return render(request,'learning_logs/index.html')
URL请求与我们刚才定义的模式匹配时,Django将在文件views.py中查找函数index() ,再将请求对象传递给这个视图函数函数,这里,我们不需要处理任何数据,因此这个函数只包含调用render() 的代码,render() 提供了两个实参:原始请求对象以及一个可用于创建网页的模板。
编写模板
    模板定义了网页的结构。模板指定了网页是什么样的,而每当网页被请求时,Django将填入相关的数据。模板让你能够访问视图提供的任何数据。我们的主页视图没有提供任何数据,因此相应的模板非常简单。
    在文件夹learning_logs中新建一个templates文件夹。在文件夹templates中,再新建一个文件夹learning_logs文件夹。建立了Django能够明确解读的结构,即便项目很大,包含很多应用程序亦如此。在最里面的文件夹learning_logs中,新建一个文件,并将其命名为index.html,再在这个文件中编写如下代码:
<p>Learning Log</p>

<p>Learning Log helps you keep track of your learning, for any topic you're
learning about.</p>


创建其他网页
创建两个显示数据的网页,其中一个列出所有的主题,另一个显示特定主题的所有条目。对于每个网页,我们都将指定URL模式,编写一个视图函数,并编写一个模板。

模板继承
编写一个包含通用元素的父模板,并让每个网页都继承这个模板。

父模板
创建一个名为base.html的模板,并将其存储在index.html所在的目录中

未完!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: