文章目录
自己部署的网站,还是小有成就感的,毕竟踩过很多坑,实战技能也有些许进步。
网站(后期会自定义):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