文章目录
- 往期回顾
- 部署学习笔记
- 建立 Heroku账户
- Herkou Toolbelt
- 安装必要的包
- 创建包含列表的文件 requirements.txt
- 指定 Python 版本
- 修改 settings.py
- 创建启动进程的 Procfile
- 为部署 Heroku 修改 wsgi.py
- 创建用于存储静态文件的目录
- 使用 Git 跟踪项目文件
- 虚拟环境中安装 git
- git 是什么
- git 安装完成后的简单配置
- 创建项目
- 忽略文件
- 初始化仓库
- 检查状态
- 将文件加入到仓库中
- 执行提交
- 查看提交历史
- 第二次提交
- 撤销修改
- 检查以前的提交
- 恢复指定提交的命令
- 删除仓库
- 熟知Git部分,可直接跳至之里,继续关注项目部署部分
- 推送到Heroku
- 在 Heroku 上建立数据库
- 改进 Heroku 部署
- 创建超级用户
- 创建对用户的友好 URL
- 确保项目的安全
- 提交推送修改
- 为确保错误页面
- 创建自定义错误模板
- 将修改推送到 Heroku
- get_boject_or_404()
- 最后一个内容
往期回顾
用Django 写学习笔记程序第二章.1 让用户能够输入数据
用Django 写学习笔记程序第二章.3让用户拥有自己的数据
更多内容移步至个人主页(python专栏)查看
部署学习笔记
这篇内容针对将学习笔记程序部署到服务器,以便任何有网络的地方都能对其进行访问。将会使用到的知识点:Heeroku(一个基于Web的平台,让我们能够管理Web应用程序的部署)
建立 Heroku账户
注册会出现一个问题,根其原因是国外网站的访问限制,还有就是邮箱限制,
解决如下:
Herkou Toolbelt
注册好了账号之后,我们还需要下载一个项目部署到服务器的管理工具.
然后下述是官方对于该工具的说明:
我只放了这一张图,因为于我而言,我只想知道它是什么,然后将焦点聚集在这玩意怎么用。
安装好之后打开命令行窗口测试一下:
heroku version
安装必要的包
heroku安装好了之后,用命令安装一些必要的包,这是因为便于在服务器上支持 Django项目提供的服务。
# !一定要安装在项目的虚拟环境中
pip install dj-database-url # 帮助Django与heroku使用的数据进行通信
pip install dj-static # 帮助Django正确的管理静态文件
pip install static3 # 帮助Django正确的管理静态文件
pip install gunicorn # 服务器软件,在 在线环境中支持应用程序提供的服务
我的四个命令安装全部报错了,
这可能源于windows系统,但,重要的是在 heroku部署时安装上即可。
所以,继续往下 ↓
创建包含列表的文件 requirements.txt
让 heroku知道我们的项目依赖哪些包。用pip生成一个文件
打开项目的命令行窗口
进入虚拟状态 ll_env\Scripts\activate
用pip freeze 将项目中安装的各个包及版本信息创建写入到文件 requirements.text
pip freeze > requirements.txt
# 查看内容
requirements.txt
我们的项目共依赖于六个特定版本的包,在部署时,Heroku将安装 requirements.text 列出的所有包,从而创建一个环境。
接下来,我们在包中添加一个 psycopg2 ,它用于帮助Heroku管理活动数据库。
psycopg2>=2.6.1
哦!对,还有一点,因为我们是windows系统,之前安装包的时候会安装失败,
在 requirements.txt 中的内容要修改成如下:
Django==4.2.10
dj-database-url==0.3.0
dj-static==0.0.6
django-bootstrap3==23.6
gunicorn==19.3.0
static3==0.6.1
psycopg2>=2.6.1
不要管你在系统中安装的是哪些包。
指定 Python 版本
查看一下在项目环境中用的 python版本
然后在 manage.py 所在的文件中新建一个名为 runtime.txt 的文件然后将版本信息添加其中:
修改 settings.py
为了将项目部署到 heroku,我们需要修改一下 settings.py,在其末尾处添加一个片段,为其指定一些 heroku的环境设置:
# Heroku 环境设置
cwd = os.getcwd()
if cwd == '\app' or cwd[:4] == '\tmp':
import dj_database_url
DATABASES = {
'default': dj_database_url.config(default='postgres://localhost')
}
# 让request.is_secure() 承认-Forwarded-Proto头
SECURE_PROXY_HEADER = ('HTTP_X_FORWARDED_PROTO','https')
# 支持所有的主机头(host header)
ALLOWED_HOSTS =['*']
# 静态资产配置
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATICFILES_DIRS =(
os.path.join(BASE_DIR,'static'),
)
创建启动进程的 Procfile
Procfile 告诉 Heroku 启动哪些进程便于正确的为项目提供服务。这个文件只包含一行,将其命名为 Procfile,不指定扩展名,保存到 manage.py 同级下。
Procfile 内容如下:
web: funicorn learning_log.wsig --log-file -
这行代码让 Heroku 将 gunicorn 用作服务器,并使用 learning_log/wsgi.py 中的设置来启动应用程序。
标志 log-file 告诉Heroku应将哪些类型的事件写入日志。
为部署 Heroku 修改 wsgi.py
更改好的 wsgi.py 内容如下:
"""
WSGI config for learning_log project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
from dj_static import Cling
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'learning_log.settings')
application = Cling(get_wsgi_application())
注: 如果你像我一样用的是 pygame,在导这个我们没有的包时,它会提示下载安装的。
恩,还记得吗,windows 系统下 命令下载不了的几个包,然后我们强制写到了requirements.txt中。
对,就是提示下载那几个包。
创建用于存储静态文件的目录
在 Heroku中,Django搜集所有的静态文件,便于管理而放在一个地方存储,我们需要创建一个用于存储它们的目录。
路径:
learning_log/learning_log/static/
创建完成后,还需在 static中创建一个名为 placeholder.txt 的占位文件。
其内容如下
This file ensures that learning_log/static/ will be added to the project.
Django will collect static files and place them in learning_log/static/.
其作用只是指出在项目中添加这个文件的原因。
使用 Git 跟踪项目文件
虚拟环境中安装 git
# 检查当前装有git的版本信息
git --version
如果你安装了git,会正确显示出版本信息:
反之,命令行窗口会提示不是系统命令。
那你还需要自己手动去下载 git
如果有小伙伴对 git了解的粗微甚少,为了文章内容更加友好这里插上一些关于git的更多内容
git 是什么
Git 是一个版本控制系统,用于跟踪文件和文件夹的更改。它能够记录每个版本的更改,并允许用户比较不同版本之间的差异。Git是开源的,具有分布式特性和本地单机操作的能力。它适用于本地文件和代码版本管理,可以通过客户端工具如TortoiseGit连接到安装的Git版本控制系统进行操作。
git 安装完成后的简单配置
# git 需要知道你的用户名和电子邮箱地址,因为在操作项目时,
# 哪怕只是我们自己一个人,也需要知道是谁谁进行了操作
git config --global user.name "设置用户名"
git config --global user.email "设置电子邮箱地址@"
创建项目
我们在系统中随意创建一个名为git_practice的文件夹,并创建一个输出 hello Git world! 的程序,给其命名为 hello_world.py 存储于刚才创建的 git_practice 文件夹内。
print("hello Git world!")
接下来,我们就用这个创建好的简易程序对git进行探索。
忽略文件
扩展名为 .pyc 的文件是根据 .py 文件自动生成的,我们需要让 Git跟踪它们。这些文件存储在 __pycache__中。为了让 Git 忽略这个目录,创建一个名为.gitignore的特殊文件,这个文件名以句点开头,且没有扩展名。
# 并在这个文件中添加下行代码
__pycache__/
Git忽略目录__pycache__中的所有文件。.gitignore可避免项目混乱。
初始化仓库
直接打开该路径的终端窗口
录入命令:
git init
输出表名:
Git 在git_practice中初始化了一个空仓库。仓库是程序中被 GIt主动跟踪的一组文件。Git用来管理仓库的文件都存储在隐藏的 .git/中.
检查状态
想要执行其它操作之前,我们先对项目状态进行检查
git status
在Git中,分支是项目的一个版本,从这里的输出可知,我们位于master分支上,
每次查看项目的状态时,输出都将指出位于 master上。
将文件加入到仓库中
下面我们将这两个文件加入到仓库中,并再次检查其状态
# 将项目中未被跟踪的所有文件加入到仓库中。
# 它不提交这些文件,只是让Git开始关注它们。
git add .
# 检查状态
git status
执行提交
我们来执行第一次的提交操作。
git commit -m "Started project."
命令 git commit -m "message" 以拍摄项目的快照。
标志 -m 让 Git接下来的消息 "Started project." 记录到项目的历史记录中。
查看提交历史
git log
git log 查阅历史时,将上一步操作的人员信息都显示出来了,如果你不想显示这些,
只是想打印提交历史条目的更简单版本可这样做:
git log --pretty=oneline
第二次提交
为体现Git版本控制的强大能力,我们对项目进行修改,并提交所做的修改。
# 在 hello_world.py中在添加一条输出
print("兔C的下一专栏是针对Java的")
然后查看仓库状态
git status
输出指出,我们当前所在的分支被修改了内容的文件,还指出了尚未进行提交。
# 执行提交
git commit -am "Extended greeting"
# 查看仓库状态
git status
撤销修改
放弃当前修改,恢复到前一个可行状态
# 在 hello_world.py中添加新代码
print("Oh no,I broke the priject!")
查看仓库状态
git status
输出表名 hello_world.py中做了新的修改,但这次我们不对其进行提交,而是恢复到最后一个提交
# git checkout 用于放弃自最后一次提交后所做的修改。
# 将项目恢复到最后一次的提交状态
git checkout .
# 查看状态
git status
检查以前的提交
你可以检查出提交历史中的任何提交,而不仅仅是最后一次提交,为此可在命令 git check 末尾指定该提交的引用 ID的前6个字符。
检查出以前的提交,可对其进行审核,然后返回到最后一次提交,或者放弃最近所做的工作,并选择以前的提交。
git log --pretty==oneline
git checkout "6位ID"
检查出以前的提交后,我们将离开master分支,并进入Git分离头指针状态。HEAD 表示项目的当前状态,之所以说我们处于分离状态,是因为们离开了一个命名分支,即master
要回到 master,可以对其进行检测:
git checkout master
当前,我们成功回到 master分支。除非你要使用Git的高级功能,否则在检出以前的提交后,最好不要对项目做任何修改。当然,目前各种demo中只有我们自己一个人,所以随心所欲…
恢复指定提交的命令
git reset --hard id
删除仓库
# 查看状态
git status
# windows 系统下的删除命令
rmdir /s .git
#删除命令
rm -rf .git
熟知Git部分,可直接跳至之里,继续关注项目部署部分
I’m so sorry,拐了这么大一圈,其实这样太跑偏了,跨度有点大,本来焦点在项目的部署上,直接就跳到了 git各种的命令上绕了一圈,不过我出于知识的积累上。如果你熟知那些可以跳到这里,继续讲焦点放在项目的部署上…
现在 git安装好了,用户名和 email 也设置好了。
还要设置一下忽略文件:
像之前的设置一样。在 manage.py 同级目录下创建一个名为 .gitignore的文件
其内容如下:
ll_env/
__pycache__/
*.sqlite3
我们让 git忽略了 ll_env,因为我们可以随时自动重新创建它。
指定不跟踪__pycache__,这个目录包含Django运行.py文件时自动创建的.pyc文件。
不跟踪本地数据库的修改,为防止在服务器上使用的是SQLite,发生覆盖情况。
提交项目:
我们为 学习笔记程序 初始化一个 git仓库。
# 初始化仓库
git init
# 将文件加入到仓库
git add .
# 执行提交
git commit -am "Ready for deployment to heroku."
# -a 表示让git在这个提交中包含所有修改过的文件
# -m 表示让git记录一条日志消息
推送到Heroku
在虚拟环境中执行下述命令:
# 启动虚拟环境
ll_env\Scripts\activate
#登录 heroku
heroku login
# 运行此命令后,终端会给出提示消息,告诉你按任意键打开浏览器
# 跳转至heroku登录界面,这时你需要提前打开代理。
# 然后在登录中提前打开准备好移动端的Authenticator令牌,
# 录入令牌验证码到heroku登录界面。
# 登录完成后,终端界面如下:
...继续终端的操作
# 让 heroku 创建一个空项目
heroku create
# 让 git 将项目的分支 master推送到 heroku刚才创建的仓库中
git push heroku master
# heroku 随后使用这些文件在其服务器上创建项目
#上述命令执行完成后,项目部署完成
# 启动服务器
heroku ps
这里没有放上效果图,因为heroku账户信息需要绑定xin用卡,国内的绑不了。
我在某宝斥资60大洋买了虚拟卡.....正在等待结果,如果绑定成功,就能摆上效果图了。
…好了 排雷了,虚拟卡也绑定不了。纯代码摆文章吧
# 在浏览器中打开部署的应用程序
heroku open
在 Heroku 上建立数据库
对Heroku项目执行Django和Python命令,可使用命令:heroku run
# 对Heroku部署执行命令 migrate
heroku run python manage.py migrate
# 该命令会让Heroku创建一个终端会话来执行命令 migrate,
# Django默认迁移以及我们在开发学习笔记期间生成的迁移
改进 Heroku 部署
通过超级用户来改进部署,将 DEBUG设置成False,让用户在错误信息中看不到额外的信息。
创建超级用户
# 通过 run 执行一次性命令
# run bash 打开Bash终端会话,Bash是众多Linux终端运行的语言。
heroku run bash
# 创建超级用户
python manage.py createsuperuser
#退出
exit
创建对用户的友好 URL
heroku apps:rename learning-log
给应用程序命名时,可使用字母、数字、连字符。
确保项目的安全
当前部署的项目存在一个严重问题,settings.py 包含设置 DUBUG=True,它在发生错误显示调试信息。
# settings.py
# 只允许Heroku托管这个项目
ALLOWED_HOSTS = ['learning-log.herokuapp.com']
DEBUG = False
# 修改ALLOWED_HOSTS 只允许Heroku托管这个项目。
提交推送修改
将上述修改提交至仓库
git commit -am "Set DEBUG=Faslue for Heroku."
# 将修改后的内容推送到服务器
git push heroku master
为确保错误页面
当前项目在用户请求不属于他的主题或条目时返回 404 错误
创建自定义错误模板
# 404.html
{% extends "learning_logs/base.html" %}
{% block header %}
<h2>The item you requested is not availabel. (404)</h2>
{% endblock header %}
# 500.html
{% extends "learning_logs/base.html" %}
{% block header %}
<h2>There has been an internal error. (500)</h2>
{% endblock header %}
# 修改 settings.py
DEBUG = False
# debug为false时必须指定主机
ALLOWED_HOSTS = ['localhost']
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'learning_log/template')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
将修改推送到 Heroku
git add .
git commit -am "Add custom 404 and 500 error pages."
git push heroku master
get_boject_or_404()
该函数尝试从数据库获取请求对象,对象不存在引发404,
from django.shortcuts import render, get_object_or_404
@login_required()
def topic(request, topic_id):
topic = get_object_or_404(Topic, id=topic_id)
# 确认请求的主题属于当前用户
if topic.owner != request.user:
raise Http404
entries = topic.entry_set.order_by('-date_added')
content = {'topic': topic, 'entries': entries}
return render(request,'learning_logs/topic.html', content)
最后一个内容
设置 SECRET_KEY,通过该值可实现大量的安全协议。
在这个项目中,我们提交到仓库的设置文件包含设置SECRET_KEY。对于一个练习项目来说,足够安全,但对于生产网站,应该更细致的处理设置SECRET_KEY。