如何搭建 Django 网站?

  • 回答 (4)
  • 关注 (0)
  • 查看 (289)

最近刚入门 Python ,想实践下有什么方法搭建网站吗?

工口Miku工口Miku提问于
黄易音乐战组程序员回答于

Django是用Python编写的免费开源Web框架,用了MVC的框架模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。

在本教程中,您将学习如何连接到MySQL数据库,并为博客网站设置初始基础。这将涉及使用django-admin创建博客Web应用程序的框架,创建MySQL数据库,然后将Web应用程序连接到数据库。

准备

要学习本教程,您应该完成以下操作:

  • 一台安装了Ubuntu操作系统的服务器,没有服务器的同学可以在这个页面购买。我们建议您使用免费使用腾讯云开发者实验室进进行试验。同时,我们需要您安装Django,关于Django安装您可以参考这个教程。
  • 在服务器上需要安装MySQL服务,关于如何安装请参考这里,不过如果你是生产环境,我们建议您使用云数据库来进行存储。

有了这些准备并设置了Django开发环境后,我们可以继续创建我们的应用程序。

第一步 - 创建初始Django框架

为了给我们的应用大框架,我们需要使用django-admin命令生成项目框架。这个项目将成为我们博客应用的基础。

我们需要做的第一件事是转到主目录,我们可以使用以下命令:

cd ~

接下来,我们可以列出当前目录的内容:

ls

如果你从本系列的开头开始操作,你会发现有一个目录:

django-apps

这包含我们生成的框架项目,用于验证是否正确安装了所有内容。

由于这只是一个测试项目,我们不需要这个目录。我们将为我们的博客应用创建一个新目录。为您正在构建的应用程序调用一些有意义的名字。举个例子,我们称之为my_blog_app

mkdir my_blog_app

现在,转到新创建的目录:

cd my_blog_app

然后,创建并激活Python虚拟环境。

virtualenv env
. env/bin/activate

现在安装Django:

pip install django

my_blog_app目录中,我们将通过运行以下命令生成项目:

django-admin startproject blog

通过转到blog/目录来验证它是否有效:

cd blog

blog/目录应该在当前目录中~/my_blog_app/创建,创建是因为我们之前运行的django-admin命令。

运行ls验证是否已创建必要的项目。应该有一个blog目录和一个manage.py文件:

blog manage.py

现在您已经创建了一个包含博客应用程序初始启动的项目目录,我们可以继续下一步。

第二步 - 编辑设置

由于我们已经生成了项目框架,现在我们有了一个settings.py文件。

为了使我们的博客能够获得与我们区域相关联的正确时间,我们将编辑settings.py文件,以便它将使用您当前的时区。您可以使用时区列表作为参考。我们将使用America/New_York时间。

现在转到settings.py文件所在的目录:

cd ~/my_blog_app/blog/blog/

然后,使用nano或您选择的文本编辑器,打开并编辑settings.py文件:

nano settings.py

请转到文件的底部,编辑TIME_ZONE字段,如下所示:

...
# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/
​
LANGUAGE_CODE = 'en-us'
​
TIME_ZONE = 'UTC'
​
USE_I18N = True
​
USE_L10N = True
​
USE_TZ = True
...

我们将修改TIME_ZONE行,以便设置为当前的时区。在这个例子中,我们将使用纽约的时区:

...
# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/
​
LANGUAGE_CODE = 'en-us'
​
TIME_ZONE = 'America/New_York'
​
USE_I18N = True
...

编辑完成后请不要关闭配置文件,Django Web应用程序提供的文件称为静态文件。这可能包括呈现完整网页所需的任何文件,包括JavaScript,CSS和图像。所以我们需要配置静态文件。

转到settings.py文件尾并添加STATIC_ROOT如下所示:

...
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/
​
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

现在我们已经为配置文件添加了时区和路径,接下来我们应该将IP添加到允许的主机列表中。转到settings.py它所说的文件行ALLOWED_HOSTS.

...
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
​
ALLOWED_HOSTS = ['your server IP address']
​
# Application definition
...

在方括号和单引号之间添加服务器的IP地址。所做的更改后,按CTRL+X保存文件,然后按y确认更改。

您已成功编辑了settings.py文件,以便配置正确的时区。您还增加了静态文件,并将您的IP地址设置为您应用程序的ALLOWED_HOST(被允许主机)。

此时我们可以继续设置数据库连接。

第三步 - 安装MySQL数据库连接器

为了在我们的项目中使用MySQL,我们需要一个与Django兼容的Python3数据库连接器库。因此,我们将安装数据库连接器mysqlclient,这是MySQLdb的分叉版本。

根据mysqlclient文档,“MySQLdbMySQL数据库向Python的线程兼容接口。”主要区别在于mysqlclientPython 3支持的特别好!

我们需要做的第一件事就是安装python3-dev。您可以通过运行以下命令来安装python3-dev

sudo apt-get install python3-dev

python3-dev安装好,就可以安装必要的PythonMySQL开发头文件和库:

sudo apt-get install python3-dev libmysqlclient-dev

当您看到以下输出时:

After this operation, 11.9 MB of additional disk space will be used.
Do you want to continue? [Y/n]

输入y然后点击ENTER继续。

然后,我们将使用pip3PyPi中安装mysqlclient库。由于我们的版本pip指向pip3,我们只能使用pip。

pip install mysqlclient

您将看到类似于此的输出,验证它是否安装正确:

Collecting mysqlclient
  Downloading mysqlclient-1.3.12.tar.gz (82kB)
    100% |████████████████████████████████| 92kB 6.7MB/s
Building wheels for collected packages: mysqlclient
  Running setup.py bdist_wheel for mysqlclient ... done
  Stored in directory: /root/.cache/pip/wheels/32/50/86/c7be3383279812efb2378c7b393567569a8ab1307c75d40c5a
Successfully built mysqlclient
Installing collected packages: mysqlclient
Successfully installed mysqlclient-1.3.12

现在,使用以下命令安装MySQL服务器:

sudo apt-get install mysql-server

我们现在已经使用PyPi mysqlclient成功安装了MySQL服务器和MySQL客户端。

第四步 - 创建数据库

现在,您的Django应用程序的框架已经建立,并且已经安装mysqlclientmysql-server,我们将需要配置你的Django的后端MySQL。

验证MySQL服务是否正在运行:

systemctl status mysql.service

您将看到与此类似的输出:

● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2017-12-29 11:59:33 UTC; 1min 44s ago
 Main PID: 26525 (mysqld)
   CGroup: /system.slice/mysql.service
        └─26525 /usr/sbin/mysqld
​
Dec 29 11:59:32 ubuntu-512mb-nyc3-create-app-and-mysql systemd[1]: Starting MySQL Community Server...
Dec 29 11:59:33 ubuntu-512mb-nyc3-create-app-and-mysql systemd[1]: Started MySQL Community Server.

如果您看到类似于此的输出:

● mysqld.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

你可以运行sudo systemctl start mysql并且让mysql.service启动。

现在,您可以使用以下命令登录MySQL证书。-u用户名的标志,-p是告诉MySQL该用户需要密码:

mysql -u db_user -p

然后你会看到输出,询问你这个db_user的密码:

Enter password:

正确输入密码后,您将看到以下输出:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.20-0ubuntu0.16.04.1 (Ubuntu)
​
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
​
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
​
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

使用以下命令向我们展示当前数据库:

SHOW DATABASES;

假设您尚未创建任何数据库,您将看到类似于以下内容的输出:

+--------------------+
| Database          |
+--------------------+
| information_schema |
| mysql             |
| performance_schema |
| sys               |
+--------------------+
4 rows in set (0.00 sec)

默认情况下,数据库已经建立information_schemaMySQLperformance_schemasys四个库,我们不需要配置它们,因为它们包含对MySQL服务器本身很重要的信息。

现在,您已成功登录MySQL服务器,我们将创建将保存我们博客数据的初始数据库。要在MySQL中创建数据库,请使用有意义的数据库名称运行以下命令:

CREATE DATABASE blog_data;

成功创建数据库后,您将看到以下输出:

Query OK, 1 row affected (0.00 sec)

注意:如果您看到以下输出: ERROR 1007 (HY000): Can't create database blog_data; database exists 证明数据库blog_data已存在。 如果您看到以下MySQL错误,则表示存在MySQL语法错误。验证您是否完全按照本教程中的说明输入了命令。 ERROR 1007 (HY000): Can't create database blog_data; database exists

接下来,看看我们的新建的数据库是否存在库中。

SHOW DATABASES;

您应该看到blog_data 已经在表中输出。

+--------------------+
| Database          |
+--------------------+
| information_schema |
| blog_data         |
| mysql                 |
| performance_schema |
| sys               |
+--------------------+
5 rows in set (0.00 sec)

您已成功为您的博客创建了一个MySQL数据库。

您想要退出MySQL服务器,请按CTRL+ D

步骤五 - 将MySQL数据库连接添加到您的应用程序

最后,我们将向Django应用程序添加数据库连接凭据。

注意:记住,连接设置,根据Django文档,请按以下顺序使用:

  • OPTIONS
  • NAME, USER, PASSWORD, HOST, PORT
  • MySQL option files.

让我们对Django博客应用程序连接到MySQL所需的更改。转到settings.py文件并使用以下内容替换当前DATABASES行。我们将配置您的数据库,以便它知道使用MySQL作为您的数据库后端以及从哪个文件读取您的数据库连接凭据:

...
# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases
​
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '/etc/mysql/my.cnf',
        },
    }
}
...

接下来,让我们编辑配置文件,使其具有您的MySQL凭据。使用nano作为sudo编辑文件并添加以下信息:

...
[client]
database = db_name
user = db_user
password = db_password
default-character-set = utf8

在本教程中,数据库名称是blog_data,MySQL服务器的用户名是您创建的用户名,密码是您创建的MySQL服务器密码。此外,您会注意到设置默认编码为utf8,这是在MySQL中编码unicode数据的常用方法。

编辑完文件后,我们需要重新启动MySQL才能使更改生效。

systemctl daemon-reload
systemctl restart mysql

重启MySQL需要几秒钟,所以请耐心等待。

第六步 - 测试MySQL与应用程序的连接

我们需要验证Django中的配置是否正确检测了MySQL服务器。我们可以通过简单地运行服务器来实现。如果失败,则表示连接无法正常工作。

我们需要转到以下目录:

cd ~/my_blog_app/blog/

从那里,我们可以运行以下命令:

python manage.py runserver your-server-ip:8000

您现在将看到类似于以下内容的输出:

Performing system checks...
​
System check identified no issues (0 silenced).
​
You have 13 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.
​
January 4, 2018 - 15:45:39
Django version 2.0.1, using settings 'blog.settings'
Starting development server at http://your-server-ip:8000/
Quit the server with CONTROL-C.

按照输出中的说明进行操作,在浏览器中打开http://your-server-ip:8000/查看您的Web应用程序并验证其是否正常工作。

如果您的页面显示类似于上面的屏幕截图,您的Django应用程序已经正常工作。完成测试后,可以按CTRL+ C停止runserver命令。这将返回您的编程环境。

当您离开Python运行环境时,可以运行以下命令:

deactivate

停用编程环境将返回终端命令。

1个老爷们回答于

首次注意到django-debug-toolbar这款工具,是因为笔者长期参与建设并维护的一款运维产品,经过两年多不断的修修补补,部门内运维同事用起来也越来越顺手了。然而产品中暴露出来慢的问题也日益突出,作为早期开发人员之一,有点心塞的感觉,跟组长沟通之后准备花点时间优化一下。刚开始着手优化的时候按照一贯的办法,找出响应慢的url,再在工程中加line-profile或cprofile来查看究竟哪些地方慢,这种方式效率特别低,加代码-测试-查看性能数据-定位问题原因-优化代码-重新测试,整个过程走下来,一个小小的优化就要花上半天时间。

晚上回家后就琢磨着怎么提升速度,就感觉这件事不能这么玩下去,如果有一款工具可以快速直观的定位出问题原因,那么这事就好办多了,团队内其他同事也可以参与进来一起优化。这就是本文要讲的django-debug-toolbar工具,为了简洁,本文后面统一简称为toolbar。

Django-debug-toolbar:

该说下toolbar是个什么东西了,简单说它就是一个django开发调试工具集,集成了许多相互独立的调试工具(panel),这些panel可以在前端直接展示调试信息。

关于panel更详细的说明可以参考官方文档django-debug-toolbar,笔者这里只打算介绍个人觉得最有用的两个panel。

一是SQLPanel,它能记录每个sql请求及耗时情况,并提供explain按钮给我们直接分析慢的原因,另外还可以统计出类似查询的次数(比如for循环中的查询)。另外一个是ProfilingPanel,它可以跟踪http响应的整个函数调用过程及时长,这样可以帮助我们快速定位出最耗时的函数。

DEBUG_TOOLBAR_PANELS = [

    # ...
    'debug_toolbar.panels.settings.SettingsPanel',  # settings配置,比如启动时陪在环境变量中的一些值 /yx
    'debug_toolbar.panels.sql.SQLPanel',  # sql查询时间、重复查询、explain
    'debug_toolbar.panels.profiling.ProfilingPanel',  # 性能分析
]

工作原理:

整个toolbar框架的核心就是中间件,toolbar通过中间件的方式加入到django工程中,toolbar中所有的panel也是类似中间件的形式被toolbar调用。

下面结合django请求处理过程来说明toolbar是如何工作,图Django请求响应处理过程

中黄色区域标记的是django中间件处理函数,toolbar中间件实现了Request中间件、View中间件和Response中间件,在Request中间件和View中间件中toolbar一次调用所有panel的中间件进行处理,最后toolbar在Response中间件中收集所有panel采集的debug信息,并以html的形式注入到response body中, 这就是debug-toolbar的大致工作流程。更具体一点,我们通过几个panel的例子进行说明:

(1)SettingsPanel: 这个panel很简单,仅仅在response中间件调用时读取django settings信息,并输出成页面片段 (2)SQLPanel:比如说描述的SQLPanel就是在该panel启用的时候对database connection进程patch,进行一个wrap操作,这样每次外层视图函数view内部进行db操作时,sqlpanel就可以记录起来,在response中间件调用时输出结果,同时进行unwrap操作。 (3)ProfilingPanel:又比如说ProfilingPanel模块是在调用View中间件的时候直接用cprofile调用视图函数,并收集profile数据。

使用总结:(重点部分)

下面是项目中的实践总结出来的一点经验,希望能给大家提供点有用的信息:

(1)ajax问题处理 前面讲django-debug-toolbar时提到, toolbar将调试信息以html的形式注入到返回的html内容中,由于ajax请求返回更多的是json数据,如果直接将debug信息插入返回内容会导致真实的返回内容被破坏。目前网上最为成熟的解决方案是Django-Debug-Panel,

(2)需要注意的页面冲突问题及解决办法 toolbar将调试信息以html的形式注入到返回的html内容中带来的另外一个问题就是容易引起页面bug,比较容易想到的jquery重复加载会导致两次加载之间初始化的第三方jQuery插件被清空。为了防止toolbar引起页面bug,比较保守的方式是采用(1)中提到的方案,我在附件中提供了一小段代码供参考。

(3)是否可以将django-debug-toolbar应用到现网? 我们在开发、维护过程中往往有一些直接在现网定位问题的需求,特别是开发环境往往系统的熵、数据量都不够,另外,现网发现问题往往要以最快的速速找到原因和解决方案,在开发环境重现问题效率特别低,如果能够直接在现网定位问题,很快情况下将会大大加快问题跟进处理周期,对开发人员本身也能一定程度提升工作效率。

将toolbar用于现网需要几个方面的问题:

a. 性能:其实开启toolbar对单次请求具有一定影响,特别是ProfilingPanel执行耗时非常大,它是toolbar默认不开启的唯一一个panel。由于toolbar只是调试工具,并不用于监控,可以仅在需要时打开。另外所有panel功能都处于关闭状态,toolbar对系统和单次请求的性能影响都非常小(只是几个逻辑判断),因此将toolbar用于现网性能方面是可行的。

b. 稳定性:这一块是最难确认的,为了简化问题分析,我们将服务进程生命周期按panel开启前后分成三个阶段。panel从未开启之前,panel的代码是没有执行到,对服务进程是没有影响的。由于panel开启时可能会向python代码中注入一部分代码,因此对于panel关闭之后对稳定性是否有影响要看注入的代码是否恢复,经过检查toolbar中panel代码,可以确定,panel关闭之后代码是恢复了的。比如前面工作原理

(2)提到的SQLPanel在response中间件调用时有unwrap操作。最后panel开启过程中,可以从Web服务模式进行考虑。如果Web服务工作在进程模式,由于进程必须处理完一个请求再处理另外的请求,因此进程模式下panel开启过程中只会对当前请求有影响。最后线程和协程的服务模式可能因为全局代码被patch而受到一定影响,因此对于ProfilingPanel这种开启会进行patch操作会对线程和协程模式有短暂影响,进程模式是安全的。

c. 安全:任何系统被任意查看系统内部信息都很危险,开启和查看都只能管理员才能进行操作。

总结:仅在Web服务是进程模式时toolbar部署到现网环境才是可信的。另外,所有panel应该是默认关闭的,只有管理员和开发人员才允许开启和查看toolbar的debug信息。

(4)是否可以应用于django1.3代码环境 目前官方的toolbar仅支持django1.6及以后的版本,1.3是不支持的,由于笔者实践的项目是基于django1.3开发的,笔者针对django1.3对toolbar进行了一个代码调整,除了StaticFilePanel,其它panel都可以用到1.3环境。附件中提供了修改后的代码供参考。

(5)应用到蓝鲸app开发环境

一个记录第三方接口调用的panel:

前面提到的SQLPanel和ProfilingPanel是toolbar中非常重要的两个功能,个人感觉toolbar中最重要的是它可以作为构建自己开发工具的脚手架,提供了很多开发工具构建思路的同时,还可以减轻构建开发工具的工作量。笔者的另外一个项目中应用了大量第三方http接口服务,前期接口对接和后面的运营过程中遇到了很多接口问题,定位和反馈问题很是耗费时间,最终笔者写了一个http-client-panel, 它可以在不用修改接口调用代码的情况下,记录第三方http接口调用的详细输入输出,欢迎大家试用。

展望:

我在使用toolbar的过程中也总结了一些痛点和可改进的地方,希望有兴趣的同学可以一起完善django开发工具。

  1. 性能分析工具不够完善,基于cprofile开发的,缺少line-profile更细致的性能分析,如果能结合cprofile的功能定位出大致慢的函数,然后可以方便的用line-profiler定位具体慢的行,这个性能分析工具将会更棒。
  2. 缺少一个好用的bug定位的panel。 a. 程序异常退出位置有时定位比较耗时,如果有一个panel能直接显示出http响应轨迹,那么定位异常位置会更直观更快速。 b. 程序异常的往往因为非预期的变量值,但是往往靠猜测然后确认,如果能直接显示感兴趣的变量值,可以节省不少时间。
fengge77回答于

设置Django开发环境

开发环境是在本地计算机上安装Django,您可以在将Django应用程序部署到生产环境之前用它们进行开发和测试。Django本身提供的主要工具是一组用于创建和使用Django项目的Python脚本,以及一个可用于测试本地(即在您的计算机上,而不是在外部Web服务器上)的简单开发 Web服务器。 您可以按照腾讯云实验室给出的搭建 Python 的 Django 环境进行分步操作,本指南不再进行赘述。

创建网站

我们将介绍如何创建网站的基本框架,然后您可以对其进行设置,路径选择,模型搭建,视图和模板填充。

创建项目

首先打开命令提示符/终端,确保您在虚拟环境中,导航 到您要存储Django应用程序的位置,并为您的新网站创建一个文件夹(举例:django_projects)。然后使用cd命令进入该文件夹:

mkdir django_projects 
cd django_projects

使用django-admin startproject 命令创建新项目locallibrary(您也可以使用其他命名),然后导航到该文件夹。

django-admin startproject locallibrary
cd locallibrary

django-admin工具创建文件夹/文件结构,如下所示:

locallibrary/
    manage.py
    locallibrary/
        __init__.py
        settings.py
        urls.py
        wsgi.py

我们当前的工作目录应如下所示:

../django_projects/locallibrary/

locallibrary项目的子文件夹是网站的入口点:

  • init.py是一个空文件,指示Python将此目录视为Python包。
  • settings.py包含所有的网站设置。这是我们注册我们创建的任何应用程序,静态文件的位置,数据库配置详细信息等的地方。
  • urls.py定义站点URL到视图的映射。虽然这可能包含所有 url映射代码,但更常见的是将某些映射委托给特定应用程序,稍后您将看到。
  • wsgi.py 用于帮助您的Django应用程序与Web服务器通信。您可以将其视为样板。

manage.py脚本用于创建应用程序,与数据库的工作,并开始开发网络服务器。

创建目录应用程序

接下来,运行以下命令来创建将存在于我们的localibrary项目中的目录应用程序(这必须与项目的manage.py在同一文件夹中运行):

python3 manage.py startapp catalog

该工具将创建一个新文件夹,并使用文件填充该应用程序的不同部分(下面以粗体显示)。大多数的文件会以其目的来进行有效地命名(例如,意见应存放在views.py,模型存在models.py,测试存在tests.py,管理站点配置是 admin.py,申请注册是apps.py),并含有一些用于处理相关对象的最小样板代码。

更新的项目目录现在应如下所示:

locallibrary/
    manage.py
    locallibrary/
    catalog/
        admin.py
        apps.py
        models.py
        tests.py
        views.py
        __init__.py
        migrations/

另外我们现在有:

  • 一个迁移的文件夹,用来存放“迁移” -文件允许你修改你的模型自动更新数据库。
  • init.py - 这里创建的空文件,以便Django / Python将该文件夹识别为Python包, 并允许您在项目的其他部分中使用其对象。

注册目录应用程序

既然已经创建了应用程序,我们必须将它注册到项目中,以便在运行任何工具时将其包含在内(例如,将模型添加到数据库中)。通过将应用程序添加到INSTALLED_APPS项目设置中的列表来注册应用程序 。

打开项目设置文件django_projects / locallibrary / locallibrary / settings.py并找到INSTALLED_APPS 列表的定义。然后在列表末尾添加一个新行,如下面的注释所示。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'catalog.apps.CatalogConfig', //添加此行
]

新行指定在 创建应用程序时CatalogConfig/locallibrary/catalog/apps.py中为您生成的应用程序配置对象()。

指定数据库

这也是您通常指定要用于项目的数据库的点 - 在可能的情况下使用相同的数据库进行开发和生产是有意义的,以避免一些细微的差别。您可以在数据库(Django文档)中找到有关不同选项的信息。

我们将在这个例子中使用SQLite数据库,因为我们不希望在演示数据库上需要大量的并发访问,而且因为它不需要额外的设置!您可以在settings.py中查看此数据库的配置方式(下面还包含更多信息):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

因为我们使用的是SQLite,所以我们不需要在此处进行任何进一步的设置。

其他项目设置

settings.py文件也用于配置其他一些设置,但在这一点上,你可能只是想改变TIME_ZONE -这应该是与标准时区信息数据库时区列表相等的字符串(在TZ列在表中包含您想要的值)。将您的TIME_ZONE值更改为适合您所在时区的其中一个字符串,例如:

TIME_ZONE = 'Europe/London'

您应该注意的其他两个设置为:

  • SECRET_KEY。这是一个密钥,用作Django网站安全策略的一部分。如果您不在开发环境中保护此代码,则需要在将其放入生产环境时进行修改。
  • DEBUG。能够让调试日志显示错误,而不是HTTP状态代码响应。在生产环境下应该设置为False,因为调试信息对攻击者很有用,但是现在我们可以将其设置为True

连接URL映射器

该网站使用项目文件夹中的URL映射文件(urls.py)创建。虽然您可以使用此文件来管理所有URL映射,但更常见的是将映射推迟到关联的应用程序上 。

打开locallibrary / locallibrary / urls.py 并记下说明文本,该文本解释了使用URL映射器的一些方法。

"""locallibrary URL Configuration
​
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
​
urlpatterns = [
    path('admin/', admin.site.urls),
]

URL映射通过urlpatterns变量进行管理,该变量是Python 的函数列表path()。每个path() 函数或将URL模式与特定视图相关联,该模式将在模式匹配时显示,或者与另一个URL模式测试代码列表相关联。该urlpatterns 列表最初定义了一个函数,该函数将所有带有admin /admin.site.urls的URL映射到模块,该模块包含Administration应用程序自己的URL映射定义。

将下面的行添加到文件的底部,以便将新的列表项添加到urlpatterns列表中。这个新项目包括将具有path()模式的请求catalog/ 转发到模块catalog.urls(具有相对URL /catalog/urls.py的文件)。

# Use include() to add paths from the catalog application 
from django.conf.urls import include
from django.urls import path
​
urlpatterns += [
    path('catalog/', include('catalog.urls')),
]

现在让我们将我们网站的根URL(即127.0.0.1:8000)重定向到URL 127.0.0.1:8000/catalog/; 这是我们将在这个项目中使用的唯一应用程序。为此,我们将使用一个特殊的视图函数(RedirectView),它将第一个参数作为匹配函数中的/catalog/指定的URL模式path()(在本例中为根URL )重定向到()的新URL 。

将以下行再次添加到文件的底部:

#Add URL maps to redirect the base URL to our application
from django.views.generic import RedirectView
urlpatterns += [
    path('', RedirectView.as_view(url='/catalog/')),
]

将路径函数的第一个参数留空。如果您将第一个参数写为'/',Django会在您启动开发服务器时给出以下警告:

System check identified some issues:
​
WARNINGS:
?: (urls.W002) Your URL pattern '/' has a route beginning with a '/'. 
Remove this slash as it is unnecessary. 
If this pattern is targeted in an include(), ensure the include() pattern has a trailing '/'.

Django默认不提供CSS,JavaScript和图像等静态文件,但在创建站点时,开发Web服务器可以这样做。作为此URL映射器的最终添加,您可以通过附加以下行在开发期间启用静态文件。

现在将以下最终块添加到文件的底部:

# Use static() to add url mapping to serve static files during development (only)
from django.conf import settings
from django.conf.urls.static import static
​
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

最后一步,在目录文件夹中创建一个名为urls.py的文件,并添加以下文本以定义导入的 urlpatterns。这是我们在构建应用程序时添加模式的地方。

from django.urls import path
from catalog import views
​
​
urlpatterns = [
​
]

测试网站框架

此时我们有一个完整的框架项目。该我们将对其进行一些测试。

在我们这样做之前,我们应该首先运行数据库迁移。这会更新我们的数据库,包含我们安装的应用程序中的任何模型(并删除一些构建警告)。

运行数据库迁移

Django使用Object-Relational-Mapper(ORM)将Django代码中的模型定义映射到底层数据库使用的数据结构。当我们更改模型定义时,Django会跟踪更改并创建数据库迁移脚本(在/ locallibrary / catalog / migrations /中),以自动迁移数据库中的基础数据结构以匹配模型。

当我们创建网站时,Django会自动添加一些模型供网站的管理部分使用(我们稍后会详细介绍)。运行以下命令为数据库中的这些模型定义表(确保您位于包含manage.py的目录中):

python3 manage.py makemigrations
python3 manage.py migrate

makemigrations 命令 为项目中安装的所有应用程序创建(但不应用)迁移(您也可以指定应用程序名称以仅为单个项目运行迁移)。这使您有机会在应用这些迁移之前检查这些迁移的代码 - 当您对Django熟悉后,您可以选择略微调整它们!

migrate命令实际上将迁移应用于您的数据库(Django会跟踪哪些已添加到当前数据库)。

运行网站

在开发过程中,您可以先使用开发Web服务器对网站进行测试,然后在本地Web浏览器上进行查看。

通过调用该命令运行开发Web服务器runserver(与manage.py位于同一目录中):

python3 manage.py runserver
​
 Performing system checks...
​
 System check identified no issues (0 silenced).
 August 15, 2018 - 16:11:26
 Django version 2.1, using settings 'locallibrary.settings'
 Starting development server at http://127.0.0.1:8000/
 Quit the server with CTRL-BREAK.

服务器运行后,您可以通过导航到http://127.0.0.1:8000/本地Web浏览器来查看该站点。您应该看到一个如下所示的站点错误页面:

别担心!这个错误页面是正常的,因为我们没有在catalogs.urls模块中定义任何页面/网址(我们在获取网站根目录的URL时将其重定向到)。

此时我们知道Django正在工作!

扫码关注云+社区