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



    往期回顾

    学习Django编写“学习笔记”程序

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

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

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

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

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


    部署学习笔记

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

    建立 Heroku账户

    Heroku官网链接

    注册会出现一个问题,根其原因是国外网站的访问限制,还有就是邮箱限制,
    解决如下:

    无法注册请点击链接

    Herkou Toolbelt

    注册好了账号之后,我们还需要下载一个项目部署到服务器的管理工具.

    这里是下载链接

    然后下述是官方对于该工具的说明:

    在这里插入图片描述
    我只放了这一张图,因为于我而言,我只想知道它是什么,然后将焦点聚集在这玩意怎么用。

    安装好之后打开命令行窗口测试一下:

    heroku version
    
    • 1

    在这里插入图片描述

    安装必要的包

    heroku安装好了之后,用命令安装一些必要的包,这是因为便于在服务器上支持 Django项目提供的服务。

    # !一定要安装在项目的虚拟环境中
    pip install dj-database-url # 帮助Django与heroku使用的数据进行通信
    
    pip install dj-static # 帮助Django正确的管理静态文件
    
    pip install static3 # 帮助Django正确的管理静态文件
    
    pip install gunicorn # 服务器软件,在 在线环境中支持应用程序提供的服务
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    我的四个命令安装全部报错了,
    这可能源于windows系统,但,重要的是在 heroku部署时安装上即可。

    所以,继续往下 ↓

    创建包含列表的文件 requirements.txt

    让 heroku知道我们的项目依赖哪些包。用pip生成一个文件

    打开项目的命令行窗口
    进入虚拟状态 ll_env\Scripts\activate
    
    用pip freeze 将项目中安装的各个包及版本信息创建写入到文件 requirements.text
    pip freeze > requirements.txt
    
    # 查看内容
    requirements.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    我们的项目共依赖于六个特定版本的包,在部署时,Heroku将安装 requirements.text 列出的所有包,从而创建一个环境。
    接下来,我们在包中添加一个 psycopg2 ,它用于帮助Heroku管理活动数据库。

    psycopg2>=2.6.1
    
    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    不要管你在系统中安装的是哪些包。

    指定 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'),
        )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    创建启动进程的 Procfile

    Procfile 告诉 Heroku 启动哪些进程便于正确的为项目提供服务。这个文件只包含一行,将其命名为 Procfile,不指定扩展名,保存到 manage.py 同级下。

    Procfile 内容如下:

    web: funicorn learning_log.wsig --log-file -
    
    • 1

    这行代码让 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())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    注: 如果你像我一样用的是 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/.
    
    • 1
    • 2

    其作用只是指出在项目中添加这个文件的原因。


    使用 Git 跟踪项目文件

    虚拟环境中安装 git

    # 检查当前装有git的版本信息
    git --version
    
    • 1
    • 2

    如果你安装了git,会正确显示出版本信息:
    在这里插入图片描述
    反之,命令行窗口会提示不是系统命令。

    那你还需要自己手动去下载 git

    git 下载链接

    如果有小伙伴对 git了解的粗微甚少,为了文章内容更加友好这里插上一些关于git的更多内容

    git 是什么

    Git 是一个版本控制系统,用于跟踪文件和文件夹的更改。它能够记录每个版本的更改,并允许用户比较不同版本之间的差异。Git是开源的,具有分布式特性和本地单机操作的能力。它适用于本地文件和代码版本管理,可以通过客户端工具如TortoiseGit连接到安装的Git版本控制系统进行操作。

    git 安装完成后的简单配置

    # git 需要知道你的用户名和电子邮箱地址,因为在操作项目时,
    # 哪怕只是我们自己一个人,也需要知道是谁谁进行了操作
    
    git config --global user.name "设置用户名"
    git config --global user.email "设置电子邮箱地址@"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建项目

    我们在系统中随意创建一个名为git_practice的文件夹,并创建一个输出 hello Git world! 的程序,给其命名为 hello_world.py 存储于刚才创建的 git_practice 文件夹内。

    print("hello Git world!")
    
    • 1

    接下来,我们就用这个创建好的简易程序对git进行探索。

    忽略文件

    扩展名为 .pyc 的文件是根据 .py 文件自动生成的,我们需要让 Git跟踪它们。这些文件存储在 __pycache__中。为了让 Git 忽略这个目录,创建一个名为.gitignore的特殊文件,这个文件名以句点开头,且没有扩展名。

    # 并在这个文件中添加下行代码
    __pycache__/
    
    • 1
    • 2

    在这里插入图片描述

    Git忽略目录__pycache__中的所有文件。.gitignore可避免项目混乱。
    
    • 1

    初始化仓库

    直接打开该路径的终端窗口

    录入命令:

    git init
    
    • 1

    在这里插入图片描述

    输出表名:
    Git 在git_practice中初始化了一个空仓库。仓库是程序中被 GIt主动跟踪的一组文件。Git用来管理仓库的文件都存储在隐藏的 .git/中.

    检查状态

    想要执行其它操作之前,我们先对项目状态进行检查

    git status
    
    • 1

    在这里插入图片描述

    在Git中,分支是项目的一个版本,从这里的输出可知,我们位于master分支上,
    每次查看项目的状态时,输出都将指出位于 master上。
    
    • 1
    • 2

    将文件加入到仓库中

    下面我们将这两个文件加入到仓库中,并再次检查其状态

    # 将项目中未被跟踪的所有文件加入到仓库中。
    # 它不提交这些文件,只是让Git开始关注它们。
    git add .
    
    # 检查状态
    git status
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    执行提交

    我们来执行第一次的提交操作。

    git commit -m "Started project."
    
    • 1

    在这里插入图片描述

    命令 git commit -m "message" 以拍摄项目的快照。
    标志 -m 让 Git接下来的消息 "Started project." 记录到项目的历史记录中。
    
    • 1
    • 2

    查看提交历史

    git log
    
    • 1

    在这里插入图片描述

    git log 查阅历史时,将上一步操作的人员信息都显示出来了,如果你不想显示这些,
    只是想打印提交历史条目的更简单版本可这样做:
    
    • 1
    • 2
    git log --pretty=oneline
    
    • 1

    在这里插入图片描述

    第二次提交

    为体现Git版本控制的强大能力,我们对项目进行修改,并提交所做的修改。

    # 在 hello_world.py中在添加一条输出
    print("兔C的下一专栏是针对Java的")
    
    • 1
    • 2

    然后查看仓库状态

    git status
    
    • 1

    在这里插入图片描述

    输出指出,我们当前所在的分支被修改了内容的文件,还指出了尚未进行提交。

    # 执行提交
    git commit -am "Extended greeting"
    # 查看仓库状态
    git status
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    撤销修改

    放弃当前修改,恢复到前一个可行状态

    # 在 hello_world.py中添加新代码
    print("Oh no,I broke the priject!")
    
    • 1
    • 2

    查看仓库状态

    git status
    
    • 1

    在这里插入图片描述

    输出表名 hello_world.py中做了新的修改,但这次我们不对其进行提交,而是恢复到最后一个提交

    # git checkout 用于放弃自最后一次提交后所做的修改。
    # 将项目恢复到最后一次的提交状态
    git checkout .
    
    # 查看状态
    git status
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    检查以前的提交

    你可以检查出提交历史中的任何提交,而不仅仅是最后一次提交,为此可在命令 git check 末尾指定该提交的引用 ID的前6个字符。
    检查出以前的提交,可对其进行审核,然后返回到最后一次提交,或者放弃最近所做的工作,并选择以前的提交。

    git log --pretty==oneline
    
    git checkout "6位ID"
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    检查出以前的提交后,我们将离开master分支,并进入Git分离头指针状态。HEAD 表示项目的当前状态,之所以说我们处于分离状态,是因为们离开了一个命名分支,即master

    要回到 master,可以对其进行检测:

    git checkout master
    
    • 1

    在这里插入图片描述

    当前,我们成功回到 master分支。除非你要使用Git的高级功能,否则在检出以前的提交后,最好不要对项目做任何修改。当然,目前各种demo中只有我们自己一个人,所以随心所欲…

    恢复指定提交的命令

    git reset --hard id
    
    • 1

    删除仓库

    # 查看状态
    git status
    
    # windows 系统下的删除命令
    rmdir /s .git
    
    #删除命令
    rm -rf .git
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述


    熟知Git部分,可直接跳至之里,继续关注项目部署部分

    I’m so sorry,拐了这么大一圈,其实这样太跑偏了,跨度有点大,本来焦点在项目的部署上,直接就跳到了 git各种的命令上绕了一圈,不过我出于知识的积累上。如果你熟知那些可以跳到这里,继续讲焦点放在项目的部署上…

    现在 git安装好了,用户名和 email 也设置好了。

    还要设置一下忽略文件:

    像之前的设置一样。在 manage.py 同级目录下创建一个名为 .gitignore的文件

    其内容如下:

    ll_env/
    __pycache__/
    *.sqlite3
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    我们让 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记录一条日志消息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    推送到Heroku

    在虚拟环境中执行下述命令:

    # 启动虚拟环境
    ll_env\Scripts\activate
    #登录 heroku
    heroku login
    # 运行此命令后,终端会给出提示消息,告诉你按任意键打开浏览器
    # 跳转至heroku登录界面,这时你需要提前打开代理。
    # 然后在登录中提前打开准备好移动端的Authenticator令牌,
    # 录入令牌验证码到heroku登录界面。
    # 登录完成后,终端界面如下:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    ...继续终端的操作
    
    • 1
    # 让 heroku 创建一个空项目
    heroku create
    
    # 让 git 将项目的分支 master推送到 heroku刚才创建的仓库中
    git push heroku master
    # heroku 随后使用这些文件在其服务器上创建项目
    
    #上述命令执行完成后,项目部署完成
    # 启动服务器
    heroku ps
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    这里没有放上效果图,因为heroku账户信息需要绑定xin用卡,国内的绑不了。
    我在某宝斥资60大洋买了虚拟卡.....正在等待结果,如果绑定成功,就能摆上效果图了。
    
    • 1
    • 2

    …好了 排雷了,虚拟卡也绑定不了。纯代码摆文章吧

    # 在浏览器中打开部署的应用程序
    heroku open
    
    • 1
    • 2

    在 Heroku 上建立数据库

    对Heroku项目执行Django和Python命令,可使用命令:heroku run

    # 对Heroku部署执行命令 migrate
    heroku run python manage.py migrate
    # 该命令会让Heroku创建一个终端会话来执行命令 migrate,
    # Django默认迁移以及我们在开发学习笔记期间生成的迁移
    
    • 1
    • 2
    • 3
    • 4

    改进 Heroku 部署

    通过超级用户来改进部署,将 DEBUG设置成False,让用户在错误信息中看不到额外的信息。

    创建超级用户

    # 通过 run 执行一次性命令
    # run bash 打开Bash终端会话,Bash是众多Linux终端运行的语言。
    heroku run bash
    
    # 创建超级用户
    python manage.py createsuperuser
    
    #退出
    exit
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    创建对用户的友好 URL

    heroku apps:rename learning-log
    
    • 1

    给应用程序命名时,可使用字母、数字、连字符。

    确保项目的安全

    当前部署的项目存在一个严重问题,settings.py 包含设置 DUBUG=True,它在发生错误显示调试信息。

    # settings.py
    
    # 只允许Heroku托管这个项目
    ALLOWED_HOSTS = ['learning-log.herokuapp.com']
    
    DEBUG = False
    
    # 修改ALLOWED_HOSTS 只允许Heroku托管这个项目。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    提交推送修改

    将上述修改提交至仓库

    git commit -am "Set DEBUG=Faslue for Heroku."
    
    # 将修改后的内容推送到服务器
    git push heroku master
    
    • 1
    • 2
    • 3
    • 4

    为确保错误页面

    当前项目在用户请求不属于他的主题或条目时返回 404 错误

    创建自定义错误模板

    # 404.html
    
    {% extends "learning_logs/base.html" %}
    
    {% block header %}
    	<h2>The item you requested is not availabel. (404)</h2>
    {% endblock header %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    # 500.html
    {% extends "learning_logs/base.html" %}
    
    {% block header %}
    	<h2>There has been an internal error. (500)</h2>
    {% endblock header %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    # 修改 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',
                ],
            },
        },
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    将修改推送到 Heroku

    git add .
    git commit -am "Add custom 404 and 500 error pages."
    git push heroku master
    
    • 1
    • 2
    • 3

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    最后一个内容

    设置 SECRET_KEY,通过该值可实现大量的安全协议。
    在这个项目中,我们提交到仓库的设置文件包含设置SECRET_KEY。对于一个练习项目来说,足够安全,但对于生产网站,应该更细致的处理设置SECRET_KEY。

  • 相关阅读:
    线上验证真的就是点点点吗?
    低代码助力软件开发
    量子密钥分配实际安全性思考
    Mybatis - 一对多/多对一映射
    数据结构实战开发教程(一)数据的艺术、理解程序的本质、算法的时间复杂度
    Convai:让虚拟游戏角色更智能的对话AI人工智能平台
    【C# 调试】.net中的 .pdb文件是什么,有什么用
    基于深度学习网络的蔬菜水果种类识别算法matlab仿真
    针对《VPP实现策略路由》的修正
    Insert 1, Insert 2, Insert 3, ...
  • 原文地址:https://blog.csdn.net/tianlei_/article/details/136565122