发布于2019-12-14 16:29 阅读(1441) 评论(0) 点赞(24) 收藏(1)
Python编程从入门到实践:项目3 Web应用程序-Django入门(1)
学习背景
书籍名称:《Python编程从入门到实践》Eric Mattes著;编程软件:Pycharm;Python版本:3.7.4;操作系统:Win 10.
项目概述
这个项目的目的就是让学习者学习:网站创建环境和基本逻辑-网站账户管理-网站部署应用。编写出来的网站主页如下:
网站用户可以注册账户、登录网站、记录或修改学习笔记。
Django是用于开发交互式网站的工具,它的主要功能包括响应网页请求、管理网站数据库和管理用户。
操作流程如下:
1.建立虚拟环境,即向系统指定一个特定的文件夹,编写的文件、安装的Python库都放在里面。这样的好处有二:1)我们只安装需要的Python库,可以使整个项目小,不冗余。2)单独的文件夹方便我们移动、复制、推送到网站服务器,要实现网站的运营,我们需要将内容放置到服务器上,以实现快速、稳定、长效的网站服务。
操作如下:
1)Win+R组合键调出系统运行搜索窗口,输入cmd后打开命令提示符窗口;
2) 系统默认的地址是C盘,需要切换到你想要创建虚拟环境的文件夹目录,这里我是在D盘的某个文件夹,所以输入指令如下切换:
3)建立虚拟环境并激活
创建虚拟环境。在命令行输入:python -m venv
11_env(你的系统需要预先安装好Python),"11_env"指示的是虚拟环境名称。
激活虚拟环境。在命令行输入:11_env\Scripts\activate
需要注意的是,后续所有操作都需要11_env处于激活状态,如果关闭了命令行窗口,需要重新激活虚拟环境,操作方式与上述一致。
2.安装Django;输入指令pip install Django,系统会自动联网下载Django安装到虚拟环境中。安装成功后会提示:Successfully installed Django
3.创建项目;有了虚拟环境11_env,有了操作工具Django,我们就可以开始创建项目了,指令为 django-admin.py startproject learning_log .
该指令的意思是运行django-admin.py中的startproject功能,创建名为learning_log的项目。需要注意两点:
项目创建完成后,可以运行dir指令,该指令是用来列出文件夹中的文件目录的。运行dir指令后,可以看到目录中包含learning_log项目文件夹、11_env虚拟环境文件夹和manage.py文件,manage.py文件就是用来管理该项目的,后面会经常在命令行窗口用到它。
运行dir learning_log指令可以看到项目文件夹中的文件目录,包含__init__.py, settings.py, urls.py, wsgi.py. settings.py指定Django如何与操作系统交互以及如何管理项目;urls.py告诉Django应该创建哪些网页来响应浏览器请求,wsgi.py帮助Django提供它创建的文件,全称是web server gateway interface.
4.创建数据库;一个网站,因为它需要存储注册用户的账号密码,存储用户在网站的信息,所以需要一个数据库进行存储。创建数据库的指令是python manage.py migrate 数据库创建成功后会在虚拟环境目录中出现db.sqlite3文件,这个就是创建的数据库存储文件,你可以使用dir指令查看。
5.为了确认项目确实被正确的创建了,你可以运行指令python manage.py runserver 8000以启动服务器。如果如上步骤无误,你可以在浏览器输入URL: http://localhost:8000/访问到相关网页内容。需要注意的是,假如说你同时运行了好几个project(或者其它占用的情况),那么就可能导致关口8000被占用的情况,可以将指令中的8000改成8001之类的数字再进行相应网址的访问。
6.创建应用程序
因为再Django项目的编程过程中,我们需要不断的浏览建立的网页以确认项目的进展情况,因此,需要保持一个命令行窗口长期运行server,其它指令在另一个命令行窗口中进行。Django项目由一系列的应用程序构成,书籍中,就以一个app,名为learning_logs来作为示例。创建app指令如下:python manage.py startapp learning_logs(11_env需要处于激活状态). 此时会在项目目录下创建一个learning_logs文件夹。用指令dir learning_logs可以查看文件目录下的文件,包括admin.py, models.py, views.py等。
6.1 定义模型
在应用中,我们需要定义模型,因为我们需要创建一个网站,包含学习目录的topic(主题)和该主题下的笔记记录(Entry),我们需要定义它从而让系统指导模型有哪些属性,如下是定义topic的属性代码:
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
Topic类继承了models模块中的Model类的属性,属性定义中,我们定义了两个,一个是Topic的文本内容(text)和Topic添加时间。CharField指由字符或文本组成的数据,当我们需要存储少量文本时,如名称、标题或者城市,可以使用。参数max_length=200告诉了系统在数据库中为text预留的空间为200个字符。DateTimeField属性是用来记录Topic添加时候的,参数auto_now_add=True表示在自动将创建时的系统时间设置为新建Topic对象时的时间。方法__str__()表示在创建Topic类时,返回属性text的内容。
6.2 模型激活
应用learning_logs我们是创建好了,并定义了其中的一个模型,但是项目learning_log并不知道,所以需要在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',
#新增我的应用程序
'learning_logs',
]
同样的,我们创建了应用learning_logs,也需要通知数据库进行调整,为存储应用中的数据做好准备(从网站创建的topic和entry内容会存储在一个数据库中)。想象着你新开发了一个合作客户,除了向上级主管部门汇报登记之外,也需要让财务部门知晓,好对后续的合同、款项进行管理。
分为两步:
让Django知道数据库应该怎样修改:在命令行输入python manage.py makemigrations learning_logs
learning_logs 正式启动迁移 python manage.py migrate
(11_env) D:\Program Files\Python Projetcs>python manage.py makemigrations learning_logs
Migrations for 'learning_logs':
learning_logs\migrations\0001_initial.py
- Create model Topic
(11_env) D:\Program Files\Python Projetcs>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, learning_logs, sessions
Running migrations:
Applying learning_logs.0001_initial... OK
今后每在models.py创建一个新的模型,都需要进行makemigrations和migrate操作。
熟悉了模型定义、应用登记、数据库迁移后,接下来学习创建网站的超级用户。大家应该都有印象,很多网站我们都需要我们创建自己的账号和密码,但是我们都是普通用户,创建的也都是普通账号。网站的管理员,就不一样,他们会需要处理更深层次的问题,接触更多的信息,他们的账户等级就要比我么高很多
6.3 创建者管理网站
具备所有权限的用户叫做超级用户,注册这样的账号需要运行的指定如下:
python manage.py creatsuperuser
然后输入账户名、邮箱和密码。需要注意的是,输入密码时命令行窗口不会显示密码。
(11_env) D:\Program Files\Python Projetcs>python manage.py createsuperuser
Username (leave blank to use 'zijinping'): 11_admin
Email address: zijinping@hotmail.com
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: n
Password:
Password (again):
Superuser created successfully.
我们注册好超级账户之后,就能够登录网页对网页里的内容进行管理,打开网址http://localhost:8000/admin/ (server需要处于运行状态)
可以看到,系统已经默认存在了Groups和Users两个模型,但是我们创建的Topic模型并未存在,这是因为我们在models.py中创建的模型需要在learning_logs/admin.py中进行注册,这样才能在超级账户登陆后进行管理:
from django.contrib import admin
# Register your models here.
#添加需要管理的对象
from learning_logs.models import Topic
admin.site.register(Topic)
添加后刷新网站,即可以看到Topic被添加到了管理目录中:
接下来我们可以尝试在网站页面中添加Topic了。按照书籍的案例,分别添加了Chess和Rock Climbing两个主题:
接下来,继续在models.py中添加Entry模型,新添加的指令如下:
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]+'...'
使用models.ForeignKey()函数建立数据库中Entry与Topic之间连接。text=models.TextField(),这里并没有使用CharField,因为这里记录的正文内容会很多。Entry定义中我们还嵌套了Meta类,目的就是为了告诉系统,当需要显示多条Entry的时候,单词是Entries而不是Entrys,系统默认多条是在后面加‘s’. 方法__str__()返回的是text的前50个字符加上省略符号’…’,避免网站显示时一直显示全文。
同样的,我们需要对新建的模型在数据库进行迁移和在admin.py中进行登记,迁移指令不再赘述,admin.py注册代码为:
from django.contrib import admin
# Register your models here.
#添加需要管理的对象
from learning_logs.models import Topic,Entry
admin.site.register(Topic)
admin.site.register(Entry)
刷新网站,我们可以看到Entry的相关信息:
可以尝试在Entries中分别基于Chess和Rock Climbing主题输入相关内容做笔记。
6.4 Django shell
Django shell是一个用于命令行窗口查询数据库信息的工具。你可以查询有哪些主题,主题ID,主题内容,Entry内容,主题相关联的内容。
(11_env) D:\Program Files\Python Projetcs>python manage.py shell
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from learning_logs.models import Topic
>>> Topic.objects.all()
<QuerySet [<Topic: Chess>, <Topic: Rock Climbing>]>
>>> topics=Topic.objects.all()
>>> for topic in topics:
... print(topic.id, topic)
...
1 Chess
2 Rock Climbing
>>> t=Topic.objects.get(id=1)
>>> t.text
'Chess'
>>> t.date_added
datetime.datetime(2019, 12, 13, 2, 47, 29, 112410, tzinfo=<UTC>)
>>> t.entry_set.all()
<QuerySet [<Entry: 123...>]>
>>>
Django shell的退出方式时Ctrl+z+Enter
作者:dgfv
链接:https://www.pythonheidong.com/blog/article/176503/6bd4b07471ddba909aa5/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!