程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(4)

Python编程从入门到实践:项目3 Web应用程序-Django入门(1)

发布于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盘的某个文件夹,所以输入指令如下切换:

  • d:(该指令切换到D盘);
  • cd D:\Program Files\Python Projects(这是我要创建项目的文件夹目录)

3)建立虚拟环境并激活

  • 创建虚拟环境。在命令行输入:python -m venv
    11_env(你的系统需要预先安装好Python),"11_env"指示的是虚拟环境名称。

  • 激活虚拟环境。在命令行输入:11_env\Scripts\activate
    激活成功会显示(11_env)标识
    需要注意的是,后续所有操作都需要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的项目。需要注意两点:

  • Python文件(后缀为.py)的默认打开方式是python,而不是Python代码编写软件,例如Pycharm等;
  • 最后的句号不可省略。书中要求必不可少,具体原因我也尚未清楚,欢迎指正。

项目创建完成后,可以运行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 定义模型
  • 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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Topic类继承了models模块中的Model类的属性,属性定义中,我们定义了两个,一个是Topic的文本内容(text)和Topic添加时间。CharField指由字符或文本组成的数据,当我们需要存储少量文本时,如名称、标题或者城市,可以使用。参数max_length=200告诉了系统在数据库中为text预留的空间为200个字符。DateTimeField属性是用来记录Topic添加时候的,参数auto_now_add=True表示在自动将创建时的系统时间设置为新建Topic对象时的时间。方法__str__()表示在创建Topic类时,返回属性text的内容。

6.2 模型激活
  • 1

应用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',
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

同样的,我们创建了应用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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

今后每在models.py创建一个新的模型,都需要进行makemigrations和migrate操作。

熟悉了模型定义、应用登记、数据库迁移后,接下来学习创建网站的超级用户。大家应该都有印象,很多网站我们都需要我们创建自己的账号和密码,但是我们都是普通用户,创建的也都是普通账号。网站的管理员,就不一样,他们会需要处理更深层次的问题,接触更多的信息,他们的账户等级就要比我么高很多

6.3 创建者管理网站
  • 1

具备所有权限的用户叫做超级用户,注册这样的账号需要运行的指定如下:
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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

我们注册好超级账户之后,就能够登录网页对网页里的内容进行管理,打开网址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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

添加后刷新网站,即可以看到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]+'...'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

使用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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

刷新网站,我们可以看到Entry的相关信息:
在这里插入图片描述
可以尝试在Entries中分别基于Chess和Rock Climbing主题输入相关内容做笔记。

6.4 Django shell
  • 1

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>]>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
>>> topics=Topic.objects.all()
>>> for topic in topics:
...     print(topic.id, topic)
...
1 Chess
2 Rock Climbing
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
>>> 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...>]>
>>>          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Django shell的退出方式时Ctrl+z+Enter

发布了1 篇原创文章 · 获赞 0 · 访问量 2


所属网站分类: 技术文章 > 博客

作者:dgfv

链接:https://www.pythonheidong.com/blog/article/176503/6bd4b07471ddba909aa5/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

24 0
收藏该文
已收藏

评论内容:(最多支持255个字符)