自己部署的网站,还是小有成就感的,毕竟踩过很多坑,实战技能也有些许进步。
网站(后期会自定义):https://murmuring-escarpment-91471.herokuapp.com/
建立虚拟环境
要使用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。
创建应用程序
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模式。
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