用Django 写学习笔记程序第三章.2Heroku部署程序

本文详细指导如何将使用Django编写的学习笔记应用部署到Heroku,包括建立Heroku账户、安装必要的包、配置设置、创建静态文件目录、使用Git管理项目,以及确保项目的安全性,如设置SECRET_KEY和自定义错误页面。
摘要由CSDN通过智能技术生成

文章目录

  • 往期回顾
  • 部署学习笔记
    • 建立 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编写“学习笔记”程序

用Django 写学习笔记程序第二章.1 让用户能够输入数据

用Django 写学习笔记程序第二章.2 创建用户账户

用Django 写学习笔记程序第二章.3让用户拥有自己的数据

用Django 写学习笔记程序第三章.1设置项目样式

更多内容移步至个人主页(python专栏)查看


部署学习笔记

这篇内容针对将学习笔记程序部署到服务器,以便任何有网络的地方都能对其进行访问。将会使用到的知识点:Heeroku(一个基于Web的平台,让我们能够管理Web应用程序的部署)

建立 Heroku账户

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 是一个版本控制系统,用于跟踪文件和文件夹的更改。它能够记录每个版本的更改,并允许用户比较不同版本之间的差异。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。

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兔C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值