开始进入 django 开发之旅

2019-07-2663256 阅读30 评论

开发环境说明

本教程写作时开发环境的系统平台为 Windows 10 (64 位),Python 版本为 3.6.4 (64 位),django 版本为 2.2.3。

建议尽可能地与教程的开发环境保持一致(尤其是 Python 与 django 版本),避免不必要的麻烦。Python 版本必须为 Python 3.4 或以上,django 版本号必须为 django 2.2.x。

注意:

django 2.0 以上版本不再支持 Python 2。

安装 Python

Windows 下安装 Python 非常简单,去 Python 官方网站找到 Python 3 的下载地址,根据你的系统选择 32 位或者 64 位的安装包,下载好后双击安装即可。

安装完后检测 Python 是否可以正常运行。在命令行输入 python -V ,如果输出了 Python 的版本号,说明 Python 已安装成功。

> python -V
Python 3.6.4

提示:

如果提示命令未找到,而你又确定已经安装了 Python,多半是因为没有把 Python 添加到环境变量。可搜索如何把 Python 添加到环境变量的相关教程,将安装的Python 添加到环境变量即可。

使用虚拟环境

强烈推荐在虚拟环境下进行 django 的开发。

虚拟环境是一种 Python 工具,使用它可以创建一个独立的 Python 环境。

为什么要使用虚拟环境呢?举个例子,假设你已经在系统中安装了 Python,并且在阅读此教程前你已经进行过一些 django 的学习,但那时候安装的 django 还是 1.x 的老版本。我们教程使用的是最新版的 django 2.2.x 版本,你可能不愿意删除掉旧版的 django 1.x,因为那可能导致你以前的项目无法运行。既想让原来的项目在 django 1.x 环境下运行,又想再安装 django 2.2.x 来开启本教程的项目,怎么办呢?使用虚拟环境就能够完美解决这个问题。

虚拟环境帮我们从系统的 Python 环境中克隆一个全新的 Python 环境出来,这个环境独立于原来的 Python 环境。我们可以在这个新克隆的环境下安装 django 2.2.x,并且在这个新环境下运行我们的新项目。

有多种方式创建和使用虚拟环境,此前我个人习惯使用 virtualenv 配合 virtualenvwrapper 两个 Python 库来使用和管理虚拟环境,现在我比较喜欢使用 Pipenv 代替上面两个工具。此外 Python 3.3 以后的发行版,自带一个 venv 供开箱即用。为了简单起见,这里介绍两种方式,一种是我之前用的 virtualenv,还有一种就是我现在在用的 Pipenv。virtualenvwrapper 和 venv 的使用,可以在学完这个教程后自行探索。

鉴于 Pipenv 可以完美替代 virtualenv 和 virtualenvwrapper,而且对项目依赖的管理做的更好,所以后续教程如果用到虚拟环境,都会使用 Pipenv 进行管理。

virtualenv 创建和管理虚拟环境

virtualenv 的使用非常简单,首先安装 virtualenv,打开命令行工具,输入下面的命令即可安装 virtualenv:

> pip install virtualenv

安装成功后就可以开始创建虚拟环境,指定一个你喜欢的目录,virtualenv 会把这个新的虚拟环境装到你指定目录下。例如我把它装到 C:\Users\yangxg\.virtualenvs 目录下,并将虚拟环境命名为 blogproject_virtualenv(也可以取任何你喜欢的名字)。在命令栏运行如下命令:

> virtualenv C:\Users\yangxg\.virtualenvs\blogproject_virtualenv

虚拟环境已经创建好了,我们需要激活这个环境,进入到刚才创建的虚拟环境的根目录,运行 Scripts 目录下的 activate 程序激活它:

> cd C:\Users\yangxg\.virtualenvs\blogproject_virtualenv
> .\Scripts\activate
(blogproject_virtualenv) >

注意

Linux 下没有 Scripts 这个目录,取而代之的是 bin/ 目录。且激活命令为:

$ source ./bin/activate

可以看到命令提示符前面多了 (blogproject_virtualenv),说明我们已经成功激活了虚拟环境,接下来就可以开始安装 django 了。

注意:

如果使用 PowerShell,微软默认不允许执行 ps1 脚本,如果你得到如下错误:

+CategoryInfo          : SecurityError:(:) [],PSSecurityException
+FullyQualifiedErrorId : UnauthorizedAccess

需要修改 PowerShell 的脚本执行策略以允许 ps1 脚本运行,命令为 Set-ExecutionPolicy RemoteSigned:

> Set-ExecutionPolicy RemoteSigned

执行策略更改
执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险,如 https:/go.microsoft.com/fwlink/?LinkID=135170
中的 about_Execution_Policies 帮助主题所述。是否要更改执行策略?
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 暂停(S)  [?] 帮助 (默认值为“N”): Y

即将执行策略修改为允许执行被信任的且由发布者签名的下载自 Internet 的脚本。

Pipenv 创建和管理虚拟环境

首先通过命令 pip install pipenv 安装 Pipenv。

然后创建一个文件夹,作为我们将要开发的博客项目的根目录,例如我在个人的工作目录 C:\Users\yangxg\SpaceLocal\Workspace\G_Courses 下新建一个名为 HelloDjango-blog-tutorial 的目录,作为项目根目录。

然后进入这个目录,在这个目录下执行 pipenv install,Pipenv 将会为我们做好一切工作。具体来说,Pipenv会根据项目文件夹的名称创建一个虚拟环境,并且会在项目根目录下生成 Pipfile 和 Pipfile.lock 用于管理项目依赖(以后使用 Pipenv 安装的依赖会自动写入 Pipfile 文件,无需再手动维护 requirements.txt 文件,类似于 node.js 的 package.json,简直爽歪歪)。

此外,Pipenv 还非常贴心地输出下列信息,告诉你如何使用创建的虚拟环境:

To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.

即,要激活虚拟环境,在项目根目录下运行 pipenv shell 命令。

或者,没有激活虚拟环境的情况下,运行 pipenv run + 命令,也可以在虚拟环境中执行指定的命令。

考虑到 Pipenv 可以非常方便地帮我们管理虚拟环境以及项目依赖,后续我们将始终使用 Pipenv 作为虚拟环境管理工具。

提示:

你可能想知道 pipenv 创建的虚拟环境在哪里?默认情况下,Pipenv 会将虚拟环境创建在 ~/.virtualenvs 目录下,在项目根目录下使用 pipenv --venv 可以查看到项目对应的虚拟环境的具体位置:

> pipenv --venv
C:\Users\yangxg\.virtualenvs\HelloDjango-blog-tutorial-VDQF8f6V

安装 Django

django 的官方文档对 如何安装 django 给出了详细且明确的指导,不过我们目前用不上这些,只需使用 pipenv 命令就可以解决问题。进入项目根目录,运行:

> pipenv install django==2.2.3

我们用 django==2.2.3 来安装指定的 django 版本以保证和教程中的一致。如果你直接 pipenv install django 的话有可能安装最新的 django 发行版本,而不是 django 2.2.3,有可能带来不兼容性,为后续教程的顺利进行带来麻烦。

测试一下安装是否成功,先在命令行输入 pipenv run python 启动虚拟环境中的 Python 解释器交互界面)。然后输入 import django,如果没有报错就说明 django 安装成功。通过运行 print(django.get_version()) 打印出 django 的版本号,确保安装了正确版本的 django。

> pipenv run python
(HelloDjango-blog-tutorial-VDQF8f6V) > python
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD6Type "help", "copyright", "credits" or "license" for more information.

>>> import django
>>> print(django.get_version())
2.2.3

建立 Django 工程

万事已经具备了,让我们来建立 django 项目工程。

django 工程(Project)是我们项目代码的容器,例如我们博客项目中所有的代码(包括 django 为我们自动生成的以及我们自己写的)都包含在这个工程里。其实说通俗一点就是用一个文件夹把一系列 Python 代码文件和 django 配置文件包裹起来,这个文件夹就可以看做一个 django 工程。我们不必亲自动手新建这个文件夹和代码文件,django 的内置命令已经帮我们做了这些事情。例如我把博客工程的代码放在C:\Users\yangxg\SpaceLocal\Workspace\G_Courses\HelloDjango-blog-tutorial 目录下,工程名我把它叫做 blogproject,那么在项目根目录运行如下命令创建工程:

> pipenv run django-admin startproject blogproject C:\Users\yangxg\SpaceLocal\Workspace\G_Courses\HelloDjango-blog-tutorial

django-admin startproject 命令用来初始化一个 django 项目,它接收两个参数,第一个是项目名 blogproject,第二个指定项目生成的位置,因为之前我们为了使用 Pipenv 创建了项目根目录,所以将项目位置指定为此前创建的位置。

进入工程所在目录 C:\Users\yangxg\SpaceLocal\Workspace\G_Courses\HelloDjango-blog-tutorial(你可能设置在其它路径),会发现多了一个 blogproject 的目录,整个项目的文件结构如下:

HelloDjango-blog-tutorial\
    Pipfile
    Pipfile.lock
    manage.py
    blogproject\
        __init__.py
        settings.py
        urls.py
        wsgi.py

最顶层的 HelloDjango-blog-tutorial 目录是我们刚刚指定的项目根目录。HelloDjango-blog-tutorial 目录下面有一个 manage.py 文件,manage 是管理的意思,顾名思义 manage.py 就是 django 为我们生成的管理这个项目的 Python 脚本文件,以后用到时会再次介绍。与 manage.py 同级的还有一个 blogproject 的目录,这里面存放了一些 django 的配置文件,例如 settings.py、urls.py 等等,以后用到时会详细介绍。

Hello Django

网站需要运行在一个 Web 服务器上,django 已经为我们提供了一个用于本地开发的 Web 服务器。在命令行工具里进入到 manage.py 所在目录,即 HelloDjango-blog-tutorial 目录下。运行 pipenv run python manage.py runserver 命令就可以在本机上开启一个 Web 服务器:

> pipenv run python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
July 05, 2019 - 21:05:37
django version 2.2.3, using settings 'blogproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

看到这样的信息表明我们的服务器开启成功。

在浏览器输入 http://127.0.0.1:8000/ ,看到如下的页面:

Welcome to django

It worked! django 工作了!

注意:

如果在浏览器输入 http://127.0.0.1:8000/ 后显示无法访问该网站,请检查是不是浏览器代理的问题。比如开启了某些 VPN 代理服务等,将它们全部关闭即可。

这是 manage.py 的第一个用法,运行它的 runserver 命令开启本地开发服务器,以后我们还会遇到更多的命令。

命令栏工具下按 Ctrl + c 可以退出开发服务器(按一次没用的话连续多按几次)。重新开启则再次运行 python manage.py runserver

django 默认的语言是英语,所以显示给我们的欢迎页面是英文的。我们在 django 的配置文件里稍作修改,让它支持中文。用任何一个文本编辑器打开 settings.py 文件,找到如下的两行代码:

HelloDjango-blog-tutorial/blogproject/settings.py

## 其它配置代码...

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'

## 其它配置代码...

LANGUAGE_CODE 的值改为 zh-hansTIME_ZONE 的值改为 Asia/Shanghai

HelloDjango-blog-tutorial/blogproject/settings.py

## 其它配置代码...

# 把英文改为中文
LANGUAGE_CODE = 'zh-hans'

# 把国际时区改为中国时区(东八区)
TIME_ZONE = 'Asia/Shanghai'

## 其它配置代码...

保存更改后关闭 settings.py 文件。

再次运行开发服务器,并在浏览器打开 http://127.0.0.1:8000/,可以看到 django 已经支持中文了。

一切准备就绪,开始进入我们的 django 博客开发之旅吧!

文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库。地址:https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial

-- EOF --

30 评论
登录后回复
毛毛虫Amelie
2020-10-28 16:21:34

看了这么多的博客,博主的文章最通俗易懂,写得每一个解析都写在了心坎上。谢谢博主大公无私的精神,祝博主工作顺利,生活美满!!!

回复
虫儿飞ZZZZZC
2020-07-14 09:42:30

重新开启则再次运行 python manage.py runserver
显示错误 ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?
1.环境变量的设置,请问安装这篇文章的安装的,找不到django的路径在哪里,已设置py的环境变量 C:\Python\Python36\ C:\Python\Python36\Scripts\ C:\Users\zchan\.virtualenvs\zchan-1ryHVbdm 请问应该怎样找呢?
2.激活?在文章的前面已按照在项目根目录下运行 pipenv shell 命令激活 ,但是还是运行python manage.py runserver进行重启,运行pipenv run python manage.py runserver可以正常进入
3.请问怎样可以运行python manage.py runserver进入呢?

回复
虫儿飞ZZZZZC 虫儿飞ZZZZZC
2020-07-14 15:15:27

谢谢博主的教程,目前解决了这个问题,如果在pipenv虚拟环境下运行,就需要在根目录下运行pipenv run python manage.py runserver,实在是太白了。

回复
Jacky_github
2020-07-10 13:31:42

博主真厉害,博客也很漂亮,想加个友链:jackypy.xyz

回复
志哥哥撒
2020-06-02 18:24:56

建议静态文件下载到本地,或者加载到缓存中,不要从CDN中加载,每次访问你的网站刚开始的时候都很慢。

回复
lcnwys
2020-05-15 00:07:03

博主,我想为我的网站单独做一个留言板,就像现在评论这样的,应该看哪一部分的教程呢

回复
追梦人物 lcnwys
2020-06-02 14:11:08

留言板的话,我这个教程中涉及到的知识就足够了,类似于评论的实现。

回复
HMY777
2020-04-21 19:36:04

特地登陆上来给博主点赞 👍

回复
追梦人物 HMY777
2020-06-02 14:11:14

谢谢!

回复
XT-0220
2020-04-06 10:27:59

安装项目的所有依赖是在哪个文档中来的,用pycharm自带的虚拟环境可以适用吗

回复
追梦人物 XT-0220
2020-04-10 19:47:51

可以的,依赖请看 pipfile 文件,或者 github 上 master 分支中的 requirements.txt 文件。

回复
yzp-99
2020-03-25 12:52:12

大佬我用conda创建虚拟环境进行开发也可以吧,感觉也挺方便的。

回复
erkang123
2020-03-24 18:10:57

大佬,我从你github上拉的代码,在执行运行命令时,提示:django.db.utils.OperationalError: unable to open database file,我看你上面没有db.sqlite3啊,看你部署时怎么可以运行的呢?

回复
erkang123 erkang123
2020-03-24 18:13:09

希望大佬能帮忙解决下哈

回复
追梦人物 erkang123
2020-04-10 19:57:51

sorry,这是一个 bug,目前仓库最新代码已经解决。或者,请在项目根目录创建一个 database 文件夹就可以了

回复
闫帅Mac
2019-11-22 13:13:59

大神在win上用哪个IDE编辑代码?是用pycharm还是直接在cmd命令下编辑?

回复
追梦人物 闫帅Mac
2020-02-25 11:49:40

当然是 PyCharm

回复
kwailao
2019-10-24 21:09:24

博主帮我看看我弄我好久也查不到什么原因 安装虚拟环境一直报错 搜也搜不到靠你了谢谢
C:\Users\劳劳>virtualenv abc
Using base prefix 'c:\users\劳劳\appdata\local\programs\python\python36'
New python executable in C:\Users\劳劳\abc\Scripts\python.exe
Command C:\Users\劳劳\abc\Scripts\python.exe -m pip config list had error code 1
Installing setuptools, pip, wheel...

Complete output from command C:\Users\劳劳\abc\Scripts\python.exe - setuptools pip wheel:
Traceback (most recent call last):
File "", line 3, in
ModuleNotFoundError: No module named 'pkgutil'


...Installing setuptools, pip, wheel...done.
Traceback (most recent call last):
File "c:\users\劳劳\appdata\local\programs\python\python36\lib\runpy.py", line 193, in run_module_as_main
"__main_
", mod_spec)
File "c:\users\劳劳\appdata\local\programs\python\python36\lib\runpy.py", line 85, in run_code
exec(code, run_globals)
File "C:\Users\劳劳\AppData\Local\Programs\Python\Python36\Scripts\virtualenv.exe_main
.py", line 9, in
File "c:\users\劳劳\appdata\local\programs\python\python36\lib\site-packages\virtualenv.py", line 870, in main
symlink=options.symlink,
File "c:\users\劳劳\appdata\local\programs\python\python36\lib\site-packages\virtualenv.py", line 1173, in create_environment
install_wheel(to_install, py_executable, search_dirs, download=download)
File "c:\users\劳劳\appdata\local\programs\python\python36\lib\site-packages\virtualenv.py", line 1019, in install_wheel
_install_wheel_with_search_dir(download, project_names, py_executable, search_dirs)
File "c:\users\劳劳\appdata\local\programs\python\python36\lib\site-packages\virtualenv.py", line 1110, in _install_wheel_with_search_dir
call_subprocess(cmd, show_stdout=False, extra_env=env, stdin=script)
File "c:\users\劳劳\appdata\local\programs\python\python36\lib\site-packages\virtualenv.py", line 963, in call_subprocess
raise OSError("Command {} failed with error code {}".format(cmd_desc, proc.returncode))
OSError: Command C:\Users\劳劳\abc\Scripts\python.exe - setuptools pip wheel failed with error code 1

回复
kwailao
2019-10-23 13:37:13

小白看不懂后面pipenv得方法你直接用文字描述?

回复
追梦人物 kwailao
2019-10-23 15:59:18

哪个方法不懂呢?文章里应该都有说明吧?

回复
kwailao
2019-10-22 22:25:06

新的虚拟环境装到你指定目录 这一步我提示AssertionError

回复
追梦人物 kwailao
2019-10-23 15:58:54

报的什么错?

回复
13366
2019-10-06 13:02:49

为什么我必须访问localhost:8000/才能进去

回复
追梦人物 13366
2019-10-09 06:51:22

127.0.0.1 和 localhost 是一样的,除非你修改了 host 或者开了什么代理。

回复
719923505
2019-09-03 15:51:24

运行django命令为什么前面都要添加 pipenv run

回复
追梦人物 719923505
2019-09-04 19:48:07

因为要在虚拟环境运行命令,django 是装在虚拟环境的

回复
719923505
2019-09-03 12:10:50

1、pipenv 区不区分适用于python3还是python2?
2、pipenv install 的时候能指定安装python3的虚拟环境吗?
3、根目录是不是HelloDjango-blog-tutorial?使用pipenv --venv 这个位置的是安装的python,django等需要的库的位置,是吧
4、pipenv run python 运行后出现的跟你的不一样,如下:(不能上图的)

hui@hui-Inspiron-3558:~/dev-python/HelloDjango-blog-tutorial$ pipenv run python
Python 3.5.2 (default, Nov 12 2018, 13:43:14) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> print(django.get_version())
2.2.3
>>>

回复
追梦人物 719923505
2019-09-04 19:51:19
  1. 不指定参数则使用系统默认的 Python 版本,从你的输出来看应该是 Python 3.5.2
  2. 你的默认就是,可以,输入 pipenv --help 可查看可用参数
  3. 你项目的根目录名,我的是 HelloDjango-blog-tutorial
  4. pipenv --venv 输出虚拟环境安装目录,django 安装在这个目录下,并没有看出和我的不一样。。
回复
追梦人物 追梦人物
2019-09-04 19:53:09
  • Markdown 失效了?
  • Markdown 失效了?
  • Markdown 失效了?
回复
laomaner
2019-08-21 15:49:16

看一下能不能评论~

回复