2.4 项目的功能配置
由于文件夹media、pstatic和templates是我们自行创建的,Django在运行中无法识别这些文件夹的具体作用,因此,我们还需要在Django的配置文件settings.py中添加这些文件夹,使Django在运行中能识别这些文件夹的作用。
使用PyCharm打开项目babys,然后打开babys文件夹的settings.py文件,如图2-9所示。
图2-9 打开settings.py
Django已为我们设置了一些默认的配置信息,比如项目路径、密钥配置、域名访问权限、App列表和中间件等。以项目babys为例,settings.py的默认配置如下:
上述代码列出了13个配置信息,每个配置信息的说明如下:
(1)项目路径BASE_DIR:主要通过os模块读取当前项目在计算机系统的具体路径,该代码在创建项目时自动生成,一般情况下无须修改。
(2)密钥配置SECRET_KEY:这是一个随机值,在项目创建的时候自动生成,一般情况下无须修改。主要用于重要数据的加密处理,提高项目的安全性,避免遭到攻击者恶意破坏。密钥主要用于用户密码、CSRF机制和会话Session等数据加密。
- 用户密码:Django内置一套Auth认证系统,该系统具有用户认证和存储用户信息等功能,在创建用户的时候,将用户密码通过密钥进行加密处理,保证用户的安全性。
- CSRF机制:该机制主要用于表单提交,防止窃取网站的用户信息来制造恶意请求。
- 会话Session:Session的信息存放在Cookie中,以一串随机的字符串表示,用于标识当前访问网站的用户身份,记录相关用户信息。
(3)调试模式DEBUG:该值为布尔类型。如果在开发调试阶段,那么应设置为True,在开发调试过程中会自动检测代码是否发生更改,根据检测结果执行是否刷新重启系统。如果项目部署上线,那么应将其改为False,否则会泄漏项目的相关信息。
(4)域名访问权限ALLOWED_HOSTS:设置可访问的域名,默认值为空列表。当DEBUG为True并且ALLOWED_HOSTS为空列表时,项目只允许以localhost或127.0.0.1在浏览器上访问。当DEBUG为False时,ALLOWED_HOSTS为必填项,否则程序无法启动,如果想允许所有域名访问,可设置ALLOW_HOSTS = ['*']。
(5)App列表INSTALLED_APPS:告诉Django有哪些App。在项目创建时已有admin、auth和sessions等配置信息,这些都是Django内置的应用功能,各个功能说明如下:
- admin:内置的后台管理系统。
- auth:内置的用户认证系统。
- contenttypes:记录项目中所有model元数据(Django的ORM框架)。
- sessions:Session会话功能,用于标识当前访问网站的用户身份,记录相关用户信息。
- messages:消息提示功能。
- staticfiles:查找静态资源路径。
(6)中间件MIDDLEWARE:这是一个用来处理Django的请求(Request)和响应(Response)的框架级别的钩子,它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。
(7)路由入口设置ROOT_URLCONF:告诉Django从哪个文件查找整个项目的路由信息(路由信息即我们定义的网址信息),默认值是与项目同名的文件夹的urls.py文件,即babys文件夹的urls.py。
(8)模板配置TEMPLATES:主要配置模板的解析引擎、模板的存放路径地址以及Django内置功能的模板使用配置信息。
(9)WSGI配置WSGI_APPLICATION:告诉Django如何查找WSGI文件,并从WSGI文件启动并运行Django系统服务,默认值是与项目同名的文件夹的wsgi.py文件,即babys文件夹的wsgi.py。
(10)数据库配置DATABASES:配置数据的连接信息,如连接数据库的模块、数据库名称、数据库的账号密码等,默认连接sqlite数据库。
(11)内置Auth认证的功能配置AUTH_PASSWORD_VALIDATORS:主要实现Django的Auth认证系统的内置功能。
(12)国际化与本地化配置:包含配置属性LANGUAGE_CODE、TIME_ZONE、USE_I18N、USE_L10N、USE_TZ,主要实现网站的语言设置、不同时区的时间设置等。
(13)静态资源配置STATIC_URL:设置静态文件的路径信息。
在网站开发阶段中,我们经常对配置文件settings.py的INSTALLED_APPS、MIDDLEWARE、TEMPLATES、DATABASES和STATIC_URL进行配置,从而完成网站的开发过程,而配置属性DEBUG和ALLOWED_HOSTS则用于网站上线阶段。
上述配置属性是Django默认的功能配置,在实际开发中,可根据实际情况适当添加或删除相应的功能配置。
2.4.1 添加项目应用
我们在项目babys添加了项目应用(App)index、commodity和shopper,但Django在运行过程中依然无法识别新增的项目应用(App),因此还需在Django的配置文件settings.py添加我们新增的项目应用(App)。在App列表INSTALLED_APPS分别添加index、commodity和shopper,添加信息如下:
在App列表INSTALLED_APPS添加项目应用(App)不用考虑添加顺序,一般情况下,新增的项目应用写在App列表INSTALLED_APPS末端,并且以字符串格式表示。
2.4.2 设置模板信息
在Web开发中,模板是一种较为特殊的HTML文档。这个HTML文档嵌入了一些能够让Django识别的变量和指令,然后由Django的模板引擎解析这些变量和指令,生成完整的HTML网页并返回给用户浏览。模板是Django里面的MTV框架模式的T部分,配置模板路径是为了告诉Django在解析模板时,如何找到模板所在的位置。
一般情况下,项目的根目录文件夹templates通常存放共用的模板文件,能为各个App的模板文件调用,这个模式符合代码重复使用的原则。我们已在项目babys创建了文件夹templates,它是用来存放Django模板文件的,在配置文件settings.py的配置属性TEMPLATES添加文件夹templates,配置信息如下:
模板配置以列表格式表示,每个元素具有不同的含义,其含义说明如下:
- BACKEND:定义模板引擎,用于识别模板里面的变量和指令。内置的模板引擎有Django Templates和jinja2.Jinja2,每个模板引擎都有自己的变量和指令语法。
- DIRS:设置模板所在的路径,告诉Django在哪个地方查找模板的位置,默认为空列表。
- APP_DIRS:是否在App里查找模板文件。
- OPTIONS:用于填充在RequestContext的上下文(模板里面的变量和指令),一般情况下不做任何修改。
模板文件夹也可以在项目应用(App)里面创建,比如在项目应用index中创建模板文件夹temps,那么在TEMPLATES的配置属性DIRS添加os.path.join(BASE_DIR, 'index/temp'),其中index/temp代表项目应用index的模板文件夹temps;并且配置属性APP_DIRS必须设置为True,否则Django无法从项目应用中查找模板文件。
2.4.3 添加中间件
中间件(Middleware)是一个用来处理Django请求(Request)和响应(Response)的框架级别的钩子,它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。
当用户在网站中进行某个操作时,这个过程是用户向网站发送HTTP请求(Request),而网站会根据用户的操作返回相关的网页内容,这个过程称为响应处理(Response)。从请求到响应的过程中,当Django接收到用户的请求时,首先经过中间件处理请求信息,执行相关的处理,然后将处理结果返回给用户。中间件的执行流程如图2-10所示。
图2-10 中间件的执行流程
从图2-10中能清晰地看到,中间件的作用是处理用户请求信息和返回响应内容。开发者可以根据自己的开发需求自定义中间件,只要将自定义的中间件添加到配置属性MIDDLEWARE中即可激活。
一般情况下,Django默认的中间件配置均可满足大部分的开发需求。我们在项目的MIDDLEWARE中添加LocaleMiddleware中间件,使得Django内置的功能支持中文显示,代码如下:
配置属性MIDDLEWARE的数据格式为列表类型,每个中间件的设置顺序是固定的,如果随意变更中间件很容易导致程序异常。每个中间件的说明如下:
- SecurityMiddleware:内置的安全机制,保护用户与网站的通信安全。
- SessionMiddleware:会话Session功能。
- LocaleMiddleware:国际化和本地化功能。
- CommonMiddleware:处理请求信息,规范化请求内容。
- CsrfViewMiddleware:开启CSRF防护功能。
- AuthenticationMiddleware:开启内置的用户认证系统。
- MessageMiddleware:开启内置的信息提示功能。
- XFrameOptionsMiddleware:防止恶意程序单击劫持。
2.4.4 配置数据库
默认情况下,Django支持使用PostgreSQL、MySQL、Sqlite3和Oracle数据库,如果要使用其他的数据库,如MSSQL或Redis等,需要自行安装第三方插件。配置属性DATABASES是设置项目所使用的数据库信息,不同的数据库需要设置不同的数据库引擎,数据库引擎用于实现项目与数据库的连接,Django提供了4种数据库引擎:
- 'django.db.backends.postgresql'
- 'django.db.backends.mysql'
- 'django.db.backends.sqlite3'
- 'django.db.backends.oracle'
在创建项目的时候,Django已默认使用Sqlite3数据库,配置文件settings.py的配置信息如下所示:
项目创建之后,如果没有修改配置属性DATABASES,当启动并运行Django时,Django会自动在项目的目录下创建数据库文件db.sqlite3,如图2-11所示。
图2-11 目录结构
由于项目babys需要使用MySQL数据库,因此在配置属性DATABASES中设置MySQL的连接信息。在配置数据库信息之前,首先确保本地计算机已安装MySQL数据库系统,然后再安装MySQL的连接模块,Django可以使用mysqlclient和pymysql模块实现MySQL连接。
mysqlclient模块可以使用pip指令安装,打开命令提示符窗口并输入安装指令pip install mysqlclient,然后等待模板安装完成即可。
如果使用pip在线安装mysqlclient的过程中出现错误,还可以选择whl文件安装。在浏览器中访问www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient并下载与Python版本相匹配的mysqlclient文件。我们将mysqlclient文件下载保存在D盘,然后打开命令提示符窗口,使用pip完成whl文件的安装,如下所示:
pip install D:\mysqlclient-1.4.6-cp38-cp38-win_amd64.whl
完成mysqlclient模块的安装后,在项目的配置文件settings.py中配置MySQL数据库连接信息,代码如下:
为了验证数据库连接信息是否正确,我们使用数据库可视化工具Navicat Premium打开本地的MySQL数据库。在本地的MySQL数据库创建数据库babys,如图2-12所示。
图2-12 数据库babys
刚创建的数据库babys是一个空白的数据库,接着在PyCharm的Terminal界面下输入Django操作指令python manage.py migrate来创建Django内置功能的数据表。
因为Django自带了内置功能,如Admin后台系统、Auth用户系统和会话机制等功能,这些功能都需要借助数据表实现,所以该操作指令可以将内置的迁移文件生成数据表,如图2-13所示。
图2-13 创建数据表
最后在数据库可视化工具Navicat Premium里查看数据库babys是否生成相应的数据表,如图2-14所示。
图2-14 查看数据表
使用mysqlclient连接MySQL数据库时,Django对mysqlclient版本有要求,打开Django的源码查看mysqlclient的版本要求,如图2-15所示。
图2-15 mysqlclient版本要求
一般情况下,使用pip安装mysqlclient模块都能符合Django的使用要求。如果在开发过程中发现Django提示mysqlclient过低,那么可以对Django的源码进行修改,将图2-15的if条件判断注释即可。
除了使用mysqlclient模块连接MySQL之外,还可以使用pymysql模块连接MySQL数据库。pymysql模块的安装使用pip在线安装即可,在命令提示符窗口下输入pip install pymysql指令并等待安装完成即可。
pymysql模块安装成功后,项目配置文件settings.py的数据库配置信息无须修改,只要在babys文件夹的__init__.py中设置数据库连接模块即可,代码如下:
若要验证pymysql模块连接MySQL数据库的功能,建议读者先将mysqlclient模块卸载,这样能排除干扰因素,而验证方式与mysqlclient模块连接MySQL的验证方式一致。记得在验证之前,务必将数据库babys的数据表删除,具体的验证过程不再重复讲述。
值得注意的是,如果读者使用的MySQL是8.0以上版本,在Django连接MySQL数据库时会提示django.db.utils.OperationalError的错误信息,这是因为MySQL 8.0版本的密码加密方式发生了改变,8.0版本的用户密码采用的是CHA2加密方式。
为了解决这个问题,我们通过SQL语句将8.0版本的加密方式改回原来的加密方式,这样可以解决Django连接MySQL数据库的错误问题。在MySQL的可视化工具中运行以下SQL语句:
Django除了支持PostgreSQL、SQLite3、MySQL和Oracle之外,还支持SQL Server和MongoDB的连接。由于不同的数据库有不同的连接方式,因此此处不过多介绍,本书主要以MySQL连接为例,若需了解其他数据库的连接方式,可自行搜索相关资料。
2.4.5 配置静态资源
静态资源的配置分别由配置属性STATIC_URL、STATICFILES_DIRS和STATIC_ROOT完成,默认情况下,Django只配置了配置属性STATIC_URL。一个项目在开发过程中肯定需要使用CSS和JavaScript文件,这些静态文件的存放路径主要在配置文件settings.py设置,Django默认的配置信息如下:
上述配置是设置静态资源的路由地址,其作用是使浏览器能成功访问Django的静态资源。默认情况下,Django只能识别项目应用(App)的static文件夹里面的静态资源。当项目启动时,Django会从项目应用(App)里面查找相关的资源文件,查找功能主要由App列表INSTALLED_APPS的staticfiles实现。
Django在调试模式(DEBUG=True)下只能识别项目应用(App)的static文件夹里面的静态资源,并且项目应用(App)的static文件夹在创建项目应用的时候不会自动生成,开发者还需要自行在项目应用(App)里面创建static文件夹,如果该文件夹改为其他名字,Django将无法识别;若将static文件夹放在babys的项目目录下,则Django也是无法识别的。
由于STATIC_URL的特殊性,在开发中会造成诸多不便,比如将静态文件夹存放在项目的根目录或者定义多个静态文件夹等。以项目babys为例,若想在网页上正常访问静态资源文件,可以将文件夹pstatic写入资源集合STATICFILES_DIRS,在配置文件settings.py添加并设置配置属性STATICFILES_DIRS,该属性以列表或元组的形式表示,设置方式如下:
如果项目中有多个静态资源文件夹,并且这些文件夹不是在项目应用(App)里面;或者项目应用(App)的静态文件夹名称不是static,那么我们只需在配置属性STATICFILES_DIRS添加对应的文件夹即可
静态资源配置还有STATIC_ROOT,其作用是在服务器上部署项目,实现服务器和项目之间的映射。STATIC_ROOT主要收集整个项目的静态资源并存放在一个新的文件夹,然后由该文件夹与服务器之间构建映射关系。STATIC_ROOT的配置如下:
STATIC_ROOT = os.path.join(BASE_DIR, 'AllStatic')
当项目的配置属性DEBUG设为True的时候,Django会自动提供静态文件代理服务,此时整个项目处于开发阶段,因此无须使用STATIC_ROOT。当配置属性DEBUG设为False的时候,意味着项目进入生产环境,Django不再提供静态文件代理服务,此时需要在项目的配置文件中设置STATIC_ROOT。
设置STATIC_ROOT需要使用Django操作指令collectstatic来收集所有的静态资源,这些静态资源会保存在STATIC_ROOT所设置的文件夹里。关于STATIC_ROOT的使用会在后续的章节详细讲述。
2.4.6 配置媒体资源
一般情况下,STATIC_URL是设置静态文件的路由地址,如CSS样式文件、JavaScript文件以及常用图片等。对于一些经常变动的资源,通常将其存放在媒体资源文件夹,如用户头像、商品主图、商品详细介绍图等。
媒体资源和静态资源是可以同时存在的,而且两者可以独立运行,互不影响,而媒体资源只有配置属性MEDIA_URL和MEDIA_ROOT。以项目babys为例,新建的文件夹media是用来存放媒体资源文件的,在配置文件settings.py分别设置MEDIA_URL和MEDIA_ROOT,使Django在运行的时候能够自动识别媒体资源文件夹media,详细的设置方式如下:
配置属性设置后,还需要将media文件夹注册到Django里,让Django知道如何找到媒体文件,否则无法在浏览器中访问该文件夹的文件信息。打开babys文件夹的urls.py文件,为媒体文件夹media添加相应的路由地址,代码如下:
最后,我们启动运行项目babys,在浏览器中分别访问http://127.0.0.1:8000/static/css/main.css和http://127.0.0.1:8000/media/imgs/p1.jpg,前者是访问项目babys的静态资源文件夹pstatic的文件夹CSS的样式文件main.css,后者是访问媒体资源文件夹media的文件夹imgs的图片文件p1.jpg,如图2-16所示。
图2-16 静态资源和媒体资源