赵走x博客
网站访问量:151510
首页
书籍
软件
工具
古诗词
搜索
登录
17、部署 Django 项目
16、自动化测试
14、jQuery 和 Django
13、Webhose 搜索
12、集成 Bootstrap
11、使用 Django-Registration-Redux
10、cookie 和会话
9、用户身份验证
8、模板进阶
7、表单
6、模型、模板和视图
5、模型与数据库
4、模板和媒体文件
3、Django 基础
2、前期准备工作
1、导言
17、部署 Django 项目
资源编号:76324
Tango with Django
Python Web
热度:101
本章带领你一步一步部署 Django 应用。我们将把应用部署到 PythonAnywhere 上,这是一个在线 IDE 和托管服务,在浏览器中就能访问服务器端的 Python 和 Bash 命令行界面。因此,在你的电 脑中就能通过终端操作 PythonAnywhere 的服务器。PythonAnywhere 的免费账户提供了一定量的 存储空间和 CPU 时间,足够运行 Django 应用。
本章带领你一步一步部署 Django 应用。我们将把应用部署到 [PythonAnywhere](https://www.pythonanywhere.com/?affiliate_id=000116e3 "PythonAnywhere") 上,这是一个在线 IDE 和托管服务,在浏览器中就能访问服务器端的 Python 和 Bash 命令行界面。因此,在你的电 脑中就能通过终端操作 PythonAnywhere 的服务器。PythonAnywhere 的免费账户提供了一定量的 存储空间和 CPU 时间,足够运行 Django 应用。 # 18.1 注册 PythonAnywhere 账户 首先,注册一个 PythonAnywhere 入门账户。如果你的应用发展形式好,深受欢迎,随时可以升级 套餐,获得更多的存储空间和 CPU 时间,以及其他好处,例如自定义域名和 SSH。 注册账户后,PythonAnywhere 会为你分配一个网址,格式为 http://
.pythonanywhere.com,其中 `
` 是你的 PythonAnywhere 用户名。你的应用就通过这个 URL 访问。 # 18.2 PythonAnywhere 的 Web 界面 PythonAnywhere 的 Web 界面有个控制面板,用于管理你的应用,如图 18-1 所示。 ❏ Consoles 组件:创建并与 Python 和 Bash 控制台交互。 ❏ Files 组件:上传和管理文件。 ❏ Web Apps 组件:配置托管的 Web 应用。 此外还有 Notebooks 等组件,但是我们现在用不到。本章主要使用 Consoles 和 Web Apps 组件。 如果想了解其他组件的用法,请阅读 [PythonAnywhere 维基](https://www.pythonanywhere.com/wiki/ "PythonAnywhere 维基")中的详细说明。  图 18-1:PythonAnywhere 的控制面板,显示着可用的主要组件 # 18.3 搭建虚拟环境 PythonAnywhere 的默认 Bash 环境自带 Python 2.7.6 和一些包(包括 Django 1.3.7 和 Django-Registration 0.8)。这与我们所需的环境不同,因此我们要创建一个虚拟环境。 首先,打开 Bash 控制台。在 PythonAnywhere 的控制面板中点击 Consoles 组件下方的“$ Bash”按 钮。此时会出现一个黑色界面,初始化终端。终端初始化完成后(看到时间),输入下述命令: ``` $ mkvirtualenv --python=
rango ``` 如果你在阅读本书的过程中使用的是 Python 3.x,把 `
` 替换为 python3.4、 python3.5 或 python3.6(在你的电脑中执行 python --version 命令,确认版本号)。如果你使用 的是 Python 2.7.x,把 `
` 替换为 python2.7。上述命令使用你指定的 Python 版本创 建一个虚拟环境,名为 rango。下面是笔者创建 Python 3.6 虚拟环境得到的输出: ``` 11:45 ~ $ mkvirtualenv --python=python3.6 rango Running virtualenv with interpreter /usr/bin/python3.6 New python executable in /home/rangodemo2018/.virtualenvs/rango/bin/python3.6 Also creating executable in /home/rangodemo2018/.virtualenvs/rango/bin/python Installing setuptools, pip, wheel...done. virtualenvwrapper creating /home/rangodemo2018/.virtualenvs/.../predeactivate virtualenvwrapper creating /home/rangodemo2018/.virtualenvs/.../postdeactivate virtualenvwrapper creating /home/rangodemo2018/.virtualenvs/.../preactivate virtualenvwrapper creating /home/rangodemo2018/.virtualenvs/.../postactivate virtualenvwrapper creating /home/rangodemo2018/.virtualenvs/.../get_env_details ``` 注意,这段输出中的 PythonAnywhere 用户名是 rangodemo2018。你看到的将是你自己的用户名。 创建虚拟环境要花一点时间,创建完毕后你会看到一个稍微不同的提示符: ``` (rango) 11:45 ~ $ ``` 注意,与之前相比,现在多了 (rango)。这表示 rango 虚拟环境已激活,所有包都将安装在这个虚 拟环境中,不会影响系统全局。现在执行 ls -la 命令,你会看到有个 .virtualenvs 目录。虚拟环 境和相关的包都存储在这里。为了确认一切正常,执行 which pip 命令。这个命令打印当前激活 的 pip 二进制文件的位置,我们希望它在 rango 虚拟环境中。 ``` /home/
/.virtualenvs/test/bin/pip ``` 若想查看安装了哪些包,执行 pip list 命令。接下来我们要定制虚拟环境,安装 Rango 应用所需 的包。执行下述命令: ``` $ pip install -U django==1.9.10 $ pip install pillow $ pip install django-registration-redux $ pip install django-bootstrap-toolkit ``` 切记把 Django 的版本替换为你在开发过程中使用的版本。如若不然,很有可能遇到各种奇怪的问 题,让你百思不解。你也可以在自己的电脑中执行 pip freeze > requirements.txt 命令,保存当 前开发环境,然后在 PythonAnywhere 中执行 pip install -r requirements.txt 命令,一次安装 全部包。 安装好之后,执行 which django-admin.py 命令检查 Django 有没有安装。正常情况下应该看到类 似下面的输出: ``` /home/
/.virtualenvs/rango/bin/django-admin.py ``` ### 切换虚拟环境 在虚拟环境之间切换十分容易。PythonAnywhere 能为你代劳。下面简要说明如何切换虚拟环境。 若想进入某个虚拟环境,在终端执行 workon 命令。例如,下述命令进入 rango 环境: ``` 16:48 ~ $ workon rango ``` 请把 rango 换成你想使用的虚拟环境名称。执行这个命令之后,提示符会改变,指明你在一个虚 拟环境中。例如下方的 (rango)。 ``` (rango) 16:49 ~ $ ``` 如果想离开虚拟环境,执行 deactivate 命令。离开后,提示符中的 (rango) 会消失不见,如下所 示: ``` (rango) 16:49 ~ $ deactivate 16:51 ~ $ ``` ### 克隆 Git 仓库 搭建好虚拟环境之后,克隆 Git 仓库,获取项目文件。执行下述命令克隆仓库: ``` $ git clone https://
:
@github.com/
/
.git ``` 请把 `
`替换为你的 GitHub 用户名,把 `
` 替换为你的 GitHub 账户密码,把`
` 替换为仓库拥有者的用户名,把 `
` 替换为仓库的名称。 ### 设置数据库 源码克隆好之后,接下来要准备数据库。我们将使用本书前面创建的 populate_rango.py 模块填充 数据库,为此,确保你在 rango 虚拟环境中(即提示符前有 (rango))。如果不在这个虚拟环境中,执行 workon rango 命令。从家目录进入 tango_with_django_19 目录,再进入 code 目录。tango_with_django_19 目录应该跟你的 Git 仓库同名,如果你的仓库名为 twd,那这个目录的名称就 是 twd。如果你的仓库结构与这里不同,你要进入 manage.py 脚本所在的目录。然后执行下述命 令: ``` (rango) 16:55 ~/tango_with_django $ python manage.py makemigrations rango (rango) 16:55 ~/tango_with_django $ python manage.py migrate (rango) 16:56 ~/tango_with_django $ python populate_rango.py (rango) 16:57 ~/tango_with_django $ python manage.py createsuperuser ``` 第一个命令为 Rango 应用创建迁移,migrate 命令创建 SQLite3 数据库。创建好数据库之后,填 充数据,再创建一个超级用户。 # 18.4 设置 Web 应用 接下来要配置 PythonAnywhere 的 Nginx Web 服务器,伺服我们的应用。在 PythonAnywhere 的控 制面板中点击“Open Web tab”按钮。在打开的页面中,点击“Add a new web app”。 此时会弹出一个对话框。按照页面中的说明填写信息,随后点击“manual configuration”(手动配 置),然后关闭向导。注意,选择的 Python 版本要与创建虚拟环境时指定的一致。 在 Web 浏览器中打开一个新标签页或窗口,访问 PythonAnywhere 为你分配的二级域名, `http://
.pythonanywhere.com `。现在你应该看到默认的“Hello, World!”页面,如图 18-2 所 示。这是因为现在伺服网页的是 WSGI 脚本,而不是你的 Django 应用。下面我们就要改过来。  图 18-2:PythonAnywhere 默认的“Hello, World!”页面 ### 配置虚拟环境 在 PythonAnywhere 界面中的“Web”标签页,向下滚动,直到看到“Virtualenv”标题。 输入虚拟环境的路径。假设你的虚拟环境名为 rango,那么输入的路径是: ``` /home/
/.virtualenvs/rango ``` 你可以打开控制台,确认一下。 然后找到“Code”部分,设定 Web 应用源码的路径: ``` /home/
/
/tango_with_django_project/ ``` 注意,这个路径应该指向 manage.py 文件所在的目录。假如你从名为 tango_with_django_19 的仓 库中克隆源码,放在服务器的家目录中,那么这个路径应该设为: ``` /home/
/tango_with_django_19/code/tango_with_django_project/ ``` ### 配置 WSGI 脚本 Web Server Gateway Interface(WSGI,Web 服务器网关接口)为 Web 服务器和 Web 应用提供通 用的接口。PythonAnywhere 使用 WSGI 建立服务器与应用之间的连接,把入站请求映射到为你的 Web 应用分配的二级域名。 下面配置 WSGI 脚本。在 PythonAnywhere 的界面中打开“Web”标签页,在“Code”标题下有个链 接,指向 WSGI 文件,路径为 `/var/www/
_pythonanywhere_com_wsgi.py`。 PythonAnywhere 为我们提供了一个示例 WSGI 文件,为多个不同的使用场景提供了配置。这里, 我们要配置 Django 那部分。点击链接,打开编辑器。下面是针对 Rango 应用的配置。 ``` import os import sys # 把项目所在的目录添加到 PYTHONPATH 中 path = '/home/
/
/tango_with_django_project/' if path not in sys.path: sys.path.append(path) # 进入项目所在的目录 os.chdir(path) # 告诉 Django,settings.py 模块在哪里 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tango_with_django_project.settings') # 导入 Django 项目的配置 import django django.setup() # 导入 Django WSGI,处理请求 import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler() ``` 记得把 `
` 替换为你的 PythonAnywhere 用户名,并根据实际情况修改上述配置。WSGI 配置脚本中的其他代码都应删除,以防冲突。 这个脚本把项目所在的目录添加到 PYTHONPATH 中,这样 Python 才能访问到项目中的模块。如果 有其他路径要添加到 PYTHONPATH 中,可以继续添加。随后指定项目的 settings.py 模块所在的位 置。最后,导入 Django 的 WSGI 处理程序,启动应用。 修改好 WSGI 配置之后,点击右上角的“Save”按钮。回到“Web”标签页,点击页面顶部的“Reload” 按钮(那个绿色的大按钮)。应用重新加载之后,再次访问 PythonAnywhere 为你分配的二级域 名。如果一切顺利,你应该看到应用正常运行起来了。否则,仔细检查 WSGI 配置脚本和各个路 径。如果遇到 DisallowedHost 异常,参照下一小节的步骤解决。 ### 接受你的主机名 Django 新版引入了一项安全措施,即接受的主机。只允许 Web 服务器伺服特定的域名,能降低 应用被 HTTP Host 首部攻击的影响。首次运行应用时,可能会遇到 DisallowedHost 异常,阻碍应 用加载。 这个问题容易解决,只需修改项目的 settings.py 模块。首先,记下 PythonAnywhere 为你分配的二级域名。入门账户的域名格式为` http://
.pythonanywhere.com`,其中 `
` 是你的 PythonAnywhere 用户名。最好在本地(你的电脑中)编辑这个文件,然后把改动提交到 Git 仓 库,推送到远程仓库之后,再拉取到 PythonAnywhere 的服务器。当然,也可以在 PythonAnywhere 的 Web 界面中编辑这个文件,或者在终端里使用文本编辑器(如 nano 或 vi)编辑。 打开项目的 settings.py 模块,找到 ALLOWED_HOSTS 列表(文件顶部附近)。这个列表默认是空的, 把 PythonAnywhere 为你分配的二级域名添加进去: ``` ALLOWED_HOSTS = ['http://
.pythonanywhere.com'] ``` 如果你是在本地电脑中编辑的,现在要执行几个命令,把改动推送到 Git 仓库中:git add settings.py、git commit 和 git push。然后执行 git pull 命令,把改动拉取到 PythonAnywhere 的服务器中。如果你是在 PythonAnywhere 中编辑的,直接保存文件即可。 接下来,点击 PythonAnywhere 界面中的“Reload”按钮,重新加载应用。现在访问 PythonAnywhere 为你分配的二级域名,应该看到应用能正常运行起来了。但是,静态文件还不能用。 ### 设定静态文件路径 部署工作就快结束了。目前还有一个问题要解决:为应用设定一些路径。比如,我们要让 PythonAnywhere 的服务器能找到静态文件。 在 PythonAnywhere 的控制面板中点击应用的 URL,在打开的页面中找到“Static files”标题。我们 要填写正确的 URL 和文件系统路径,让 PythonAnywhere 的服务器找到并伺服静态文件。 首先,设定 Django 管理后台的静态文件位置。点击“Enter URL”链接,输入 /static/admin/,点击勾 号确认。然后点击“Enter path”链接,输入下述文件系统路径: ``` /home/
/.virtualenvs/rango/lib/
/site-packages/django/ contrib/admin/static/admin ``` 同样,要把
换成你的 PythonAnywhere 用户名。此外,根据你使用的 Python 版本,把 `
` 替换为 python2.7、python3.6 等。如果你的虚拟环境没有命名为 rango,还要 把它替换为你自己的值。输入完成后按回车键,或者点击勾号。 以同样的步骤添加 URL /static/ 和文件系统路径 `/home/
/
/tango_with_django_project/static`,设定 Web 应用的 static 目录。 设定好之后,点击页面顶部的“Reload”按钮,重新加载应用。注意,可能会出现 HTTP 502 - Bad Gateway 错误。重新加载后,你的 Web 应用应该能正确显示图像等静态文件了。 ### 搜索 API 密钥 把你的搜索 API 密钥保存在 search.key 文件中,供 Rango 的搜索功能使用。 ### 关闭调试模式 应用运行起来之后,最好告诉 Django,现在你的应用贮存在生产服务器中。为此,打开项目的 settings.py 文件,把 DEBUG = True 改成 DEBUG = False。这样修改之后,Django 的调试模式关闭 了,包含敏感信息的错误消息也不会显示了。尽管如此,你还是能看到出错时的堆栈跟踪(参见 下一节)。 # 18.5 日志文件 把 Web 应用部署到线上环境又增加了一层复杂度。换了环境,可能出现新的问题,有些还让人摸 不着头脑。遇到错误时,可以在 PythonAnywhere 创建的三个日志文件中寻找线索。 这些日志文件可以在 PythonAnywhere 界面中的“Web”标签页里查看,也可以在 Bash 控制台中直 接查看 /var/log/ 目录里的文件。 PythonAnywhere 创建的三个日志文件如下: ❏ access.log:记录对应用的请求信息 ❏ error.log:记录 Web 应用产生的错误消息 ❏ server.log:记录运行应用的 Unix 进程的详细信息 注意,各日志文件名的前面有 PythonAnywhere 为你分配的二级域名。例如 access.log 文件的全名 为
.pythonanywhere.com.access.log。