python基础学习[python编程从入门到实践读书笔记(连载三)]:django学习笔记web项目

2021/4/15 20:26:58

本文主要是介绍python基础学习[python编程从入门到实践读书笔记(连载三)]:django学习笔记web项目,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

      • Django项目:学习笔记web网页
      • 项目部署
      • 参考

自己部署的网站,还是小有成就感的,毕竟踩过很多坑,实战技能也有些许进步。

网站(后期会自定义):https://murmuring-escarpment-91471.herokuapp.com/
在这里插入图片描述

在这里插入图片描述

Django项目:学习笔记web网页

建立虚拟环境

要使用Django,首先需要建立一个虚拟工作环境。虚拟环境是系统的一个位置,可在其中安装包,并将之与其他Python包隔离。

为项目新建一个目录,将其命名为learning_log,再在终端中切换到这个目录,并执行如下命令创建一个虚拟环境

 python -m venv ll_env

这里运行了模块venv,并使用它创建了一个名为ll_env的虚拟环境。

激活虚拟环境

如果你使用的是Windows系统,请使用命令

ll_env\Scripts\activate

要停止使用虚拟环境,可执行命令

deactivate

安装Django

激活虚拟环境后,执行如下命令安装Django:

 pip install django

在Django中新建项目

在虚拟环境依然处于活动状态的情况下(ll_env包含在圆括号内),执行如下命令新建一个项目

django-admin startproject learning_log .

注意:千万别忘了这个句点,否则部署应用程序时将遭遇一些配置问题。如果忘记了这个句点,要删除已创建的文件和文件夹(ll_env除外),再重新运行这个命令。

目录learning_log包含4个文件,最重要的是settings.py、urls.py和wsgi.py。

在这里插入图片描述

  • 文件settings.py指定Django如何与系统交互以及如何管理项目。在开发项目的过程中,我们将修改其中一些设置,并添加一些设置。
  • 文件urls.py告诉Django,应创建哪些页面来响应浏览器请求。
  • 文件wsgi.py帮助Django提供它创建的文件,这个文件名是Web服务器网关接口(Web server gatewayinterface)的首字母缩写。

创建应用程序

Django项目由一系列应用程序组成,它们协同工作让项目成为一个整体。

命令startapp appname让Django搭建创建应用程序所需的基础设施。

比如

 (ll_env)learning_log$ python manage.py startapp learning_logs

定义模型

模型告诉Django如何处理应用程序中存储的数据。在代码层面,模型就是一个类,就像前面讨论的每个类一样,包含属性和方法。

激活模型

要使用这些模型,必须让Django将前述应用程序包含到项目中。为此,打开settings.py(它位于目录learning_log/learning_log中),其中有个片段告诉Django哪些应用程序被安装到了项目中并将协同工作。

当需要修改“学习笔记”管理的数据时,都采取如下三个步骤:修改models.py,对learning_logs调用makemigrations,以及让Django迁移项目。

创建页面
使用Django创建页面的过程分三个阶段:定义URL,编写视图和编写模板。按什么顺序完成这三个阶段无关紧要,但在本项目中,总是先定义URL模式。

  • URL模式描述了URL是如何设计的,让Django知道如何将浏览器请求与网站URL匹配,以确定返回哪个页面。
  • 每个URL都被映射到特定的视图——视图函数获取并处理页面所需的数据。
  • 视图函数通常使用模板来渲染页面,而模板定义页面的总体结构。

urls.py

"""定义learning_logs的URL模式"""
from django.urls import path
from . import views

app_name = 'learning_logs'
urlpatterns = [
	# 主页
	path('', views.index, name='index'), 
]

为指出当前位于哪个urls.py文件中,在该文件开头添加一个文档字符串。接下来,导入了函数path,因为需要使用它将URL映射到视图。我们还导入了模块views,其中的句点让Python从当前urls.py模块所在的文件夹导入views.py。变量app_name让Django能够将这个urls.py文件同项目内其他应用程序中的同名文件区分开来。在这个模块中,变量urlpatterns是一个列表,包含可在应用程序learning_logs中请求的页面。

实际的URL模式是对函数path()的调用,这个函数接受三个实参。第一个是一个字符串,帮助Django正确地路由(route)请求。收到请求的URL后,Django力图将请求路由给一个视图。为此,它搜索所有的URL模式,找到与当前请求匹配的那个。Django忽略项目的基础URL(http://localhost:8000/),因此空字符串(’’)与基础URL匹配。其他URL都与这个模式不匹配。如果请求的URL与任何既有的URL模式都不匹配,Django将返回一个错误页面。

path()的第二个实参指定了要调用view.py中的哪个函数。请求的URL与前述正则表达式匹配时,Django将调用view.py中的函数index()。第三个实参将这个URL模式的名称指定为index,让我们能够在代码的其他地方引用它。每当需要提供到这个主页的链接时,都将使用这个名称,而不编写URL。

第19章的部分成果

在这里插入图片描述

让用户拥有自己的数据

使用@login_required限制访问

Django提供了装饰器@login_required,让你能够轻松地只允许已登录用户访问某些页面。装饰器(decorator)是放在函数定义前面的指令,Python在函数运行前根据它来修改函数代码的行为。

将数据关联到用户

需将最高层的数据关联到用户,更低层的数据就会自动关联到用户。例如,在项目“学习笔记”中,应用程序的最高层数据是主题,而所有条目都与特定主题相关联。只要每个主题都归属于特定用户,就能确定数据库中每个条目的所有者。

部分成果:
在这里插入图片描述

第20章开始

项目部署

这里用的是《python编程从入门到实践(第二版)》

requirements.txt内容:

asgiref==3.3.4
beautifulsoup4==4.9.3
Django==3.2
django-bootstrap4==3.0.0
django-heroku==0.3.1
gunicorn==20.1.0
psycopg2>=2.6.1
pytz==2021.1
soupsieve==2.2.1
sqlparse==0.4.1

注意:笔者刚开始git push heroku master的时候,老是报错,原来是因为某个文件中heroku写成了herocu,举例如下:

remote:          File "/tmp/build_b999a8c2/learning_log/settings.py", line 142, in <module>
remote:            django_herocu.settings(locals())
remote:        NameError: name 'django_herocu' is not defined
remote:
remote:  !     Error while running '$ python manage.py collectstatic --noinput'.
remote:        See traceback above for details.
remote:
remote:        You may need to update application code to resolve this error.
remote:        Or, you can disable collectstatic for this application:
remote:
remote:           $ heroku config:set DISABLE_COLLECTSTATIC=1
remote:
remote:        https://devcenter.heroku.com/articles/django-assets
remote:  !     Push rejected, failed to compile Python app.
remote:
remote:  !     Push failed
remote: Verifying deploy...
remote:
remote: !       Push rejected to vast-oasis-96898.
remote:
To https://git.heroku.com/vast-oasis-96898.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/vast-oasis-96898.git'

修改之后,使用命令git commit -am "一段话"重新commit。
然后执行git push heroku master,项目就部署好了。

remote: -----> $ python manage.py collectstatic --noinput
remote:        128 static files copied to '/tmp/build_c3a2293e/staticfiles', 406 post-processed.
remote:
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 73.9M
remote: -----> Launching...
remote:        Released v5
remote:        https://vast-oasis-96898.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/vast-oasis-96898.git
 * [new branch]      master -> master

核实正确地启动了服务器进程,请执行命令heroku ps:

(ll_env) PS D:\user\文档\python\python_work\learning_log> heroku ps
【1】Free dyno hours quota remaining this month: 550h 0m (100%)
Free dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

【2】=== web (Free): gunicorn learning_logs.wsgi --log-file - (1)
web.1: crashed 2021/04/15 16:54:59 +0800 (~ 5m ago)

输出指出了在接下来的一个月内,项目还可在多长时间内处于活动状态【1】。编写本书时,Heroku允许免费部署在一个月内最多有550小时处于活动状态。项目的活动时间超过这个限制后,将显示标准的服务器错误页面,我们稍后将定制这个错误页面。在【2】处,我们发现启动了Procfile指定的进程。

heroku login 出现 Ip mismatch 怎么办? ,先Ctrl+C终止,然后输出

heroku login -i

然后会提示你输入heroku 的邮箱和密码,然后就登录进来。

然后输入 heroku open,结果出现Application error

在这里插入图片描述

解决方法:
输入heroku logs --tail
然后找到错误:显示找不到learning_logs.wsgi,果然,这是笔者的错误,正确的应该是learning_log.wsgi,多写了s,修改完Procfile文件,然后重新提交。
在这里插入图片描述

修改后:
在这里插入图片描述

然后重新提交

(ll_env) PS D:\user\文档\python\python_work\learning_log> git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   Procfile

no changes added to commit (use "git add" and/or "git commit -a")
(ll_env) PS D:\user\文档\python\python_work\learning_log> git commit -am "Procfile, modify learning_logs.wsgi into learning_log.wsgi"
warning: LF will be replaced by CRLF in Procfile.
The file will have its original line endings in your working directory
[master f5db365] Procfile, modify learning_logs.wsgi into learning_log.wsgi
 1 file changed, 1 insertion(+), 1 deletion(-)
(ll_env) PS D:\user\文档\python\python_work\learning_log> git status
On branch master
nothing to commit, working tree clean
(ll_env) PS D:\user\文档\python\python_work\learning_log>

然后重新部署到heroku

git push heroku master

然后继续执行:heroku open

大功告成
在这里插入图片描述
在Heroku上建立数据库

heroku run python manage.py migrat

果访问这个部署的应用程序,将能够像在本地系统上一样使用它,但看不到在本地部署中输入的任何数据(包括超级用户账户),因为它们还没有被复制到在线服务器。通常,不将本地数据复制到在线部署中,因为本地数据通常是测试数据。

你可分享“学习笔记”的Heroku URL,让任何人都可使用它。

目前自己搭建的网页的url地址为 :https://murmuring-escarpment-91471.herokuapp.com/
然后注册了用户,写了自己的Learning Log。
在这里插入图片描述

参考

[1]埃里克·马瑟斯.Python编程-从入门到实践[M].北京:人民邮电出版社,2016



这篇关于python基础学习[python编程从入门到实践读书笔记(连载三)]:django学习笔记web项目的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程