第二章 Django配置信息
2.1基本配置信息
#settings.py
import os
#项目路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#密钥配置
SECRET_KEY = '@@-b$-w0x3)ld6g_07dv6!+_1%%jgod+e=l6co(i7@xp1p6ixz'
#调试模式(开发调试阶段设置为True,部署上线应改为False)
DEBUG = True
#域名访问权限
#debug为True时,ALLOWED_HOSTS = [],项目只允许localhost或127.0.0.1在浏览器访问,当debug为False时,ALLOWED_HOSTS必须有值,否则程序无法启动。
ALLOWED_HOSTS = []
#ALLOWED_HOSTS = [“*”]
#允许所有域名访问
# Application definition
#app列表
INSTALLED_APPS = [
#内置后台管理系统
'django.contrib.admin',
#内置用户认证系统
'django.contrib.auth',
#记录项目中的model元数据
'django.contrib.contenttypes',
#标识当前访问网站的用户身份,记录相关用户信息
'django.contrib.sessions',
#消息提示功能
'django.contrib.messages',
#查找静态资源路径
'django.contrib.staticfiles',
#添加在项目中创建的app名称
'index',
]
2.2静态资源文件配置
1.静态资源路由
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
#DEBUG=True模式下,只能识别App目录下的static文件夹
STATIC_URL = '/static/'
2.静态资源集合
在不设置资源集合的情况下,浏览器只能访问到app目录下的static文件夹下的相关文件。
设置资源集合可以访问多个static目录下的资源
STATICFILES_DIRS=[
#访问根目录下的static文件夹
os.path.join(BASE_DIR,'static'),
#访问index app目录下的静态资源文件夹Mystatic
os.path.join(BASE_DIR,'index/Mystatic'),
]
浏览器访问图片的时候。路径都是http://127.0.0.1:8000/static/xxx.jpg,static是指资源路径STATIC_URL的值,不是特指文件夹名称,因为在Mystatic下的图片也可以通过以上路径访问。
3.静态资源部署
作用是在服务器上部署项目,实现服务器与项目的映射。收集整个项目的静态资源并存放在一个新的文件夹下,然后由这个文件夹与服务器之间构建映射关系。
STATIC_ROOT=os.path.join(BASE_DIR,'AllStatic')
当DEBUG = True,Django会自动提供静态文件袋里服务,开发阶段不需要部署STATIC_ROOT。当DEBUG为False时,需要手动配置。
2.3媒体资源
在项目根目录下创建media文件夹,将媒体资源存放其中。
在配置文件中设置:
#设置媒体路由地址信息
MEDIA_URL='/media/'
#获取media文件夹的完整路径
MEDIA_ROOT=os.path.join(BASE_DIR,'media')
将media文件夹注册到Django中,打开项目文件下的urls.py文件,添加media路由地址:
from django.contrib import admin
from django.urls import path, re_path
#导入项目应用index
from index import views
#配置媒体文件夹media
from django.views.static import serve
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.urls),
re_path('media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT},NAME='media'),
]
配置完成后可以通过http://127.0.0.1:8000/media/xxx.jpg正常访问
2.4模板配置
根目录下的templates文件夹下存放公用的模板文件,app目录下的templates文件夹下存放app使用的模板文件。
TEMPLATES = [
{
#定义模板引擎
'BACKEND': 'django.template.backends.django.DjangoTemplates',
#模板所在路径*******重点配置路径可以有多个
'DIRS': [
os.path.join(BASE_DIR, 'templates'),
#app目录下的模板文件
#os.path.join(BASE_DIR, 'index/templates'),
],
#是否在app里查找模板文件
'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',
],
},
},
]
2.5数据库配置
2.5.1.Django提供5种数据库引擎
'ENGINE': 'django.db.backends.sqlite3',#默认
'ENGINE': 'django.db.backends.mysql',
'ENGINE': 'django.db.backends.oracle',
'ENGINE': 'django.db.backends.postgresql',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
2.5.2.默认sqlite3,配置如下
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
2.5.3.使用mysql数据库
(1)由于mysqldb 不支持python3,所以选择mysqlclient模块连接MySQL
pip install mysqlclient -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
#配置settings.py文件
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'Django_db',
'USER':'root',
'PASSWORD':'123456',
'HOST':'127.0.0.1',
'PORT':'3306',
}
}
(2)使用pymysql连接MySQL,数据库伪装驱动
pip install pymysql
在项目__init__.py文件中初始化:
#DjangoModel\__init__.py
import pymysql
pymysql.install_as_MySQLdb()
(3)创建数据库Django_db:
管理员身份打开命令提示符:
mysql -uroot -p123456
create database Django_db charset=utf8;
数据库创建完成
(4)进行数据迁移
python manage.py makemigrations
python manage.py migrate
(5)遇到问题:
(a)数据库版本与Django版本不符,迁移失败提示:
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
MySQLclient目前只支持到python3.4,因此如果使用的更高版本的python,需要修改如下:
通过路径查找C:\Python\Python37\Lib\site-packages\django\db\backends\mysql\base.py。在这个路径下找到如下地方:将if。。。注释
version=Database.version_info
#if version<(1,3,13):
#raise........
Django迁移数据库表报错AttributeError: ‘str’ object has no attribute 'encode’解决方案:
进入C:\Python\Python37\Lib\site-packages\django\db\backends\mysql,打开operations.py文件,
query = getattr(cursor, '_executed', None)
if query is not None:
query = query.decode(errors='replace')
return query
(b)pycharm中加入MySQL数据库
driver选择mysql for 5.1
2.5.4多个数据库连接
在DATABASES 里设置多个键值对,实现多个数据库的连接:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'Django_db',
'USER':'root',
'PASSWORD':'123456',
'HOST':'127.0.0.1',
'PORT':'3306',
},
'MySqlite3':{
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'MyDjango':{
'ENGINE': 'django.db.backends.mysql',
'NAME':'MyDjango_db',
'USER':'root',
'PASSWORD':'123456',
'HOST':'127.0.0.1',
'PORT':'3306',
},
}
当项目有多个模型时,可以将每个模型对应的数据表选择在一个数据库中生成,没有指明就默认在default的数据库中
2.6中间件配置
中间件的概念:用来处理django的请求与响应的框架级别的钩子。在全局范围内改变django的输入与输出。
MIDDLEWARE = [
#内置的安全机制,保护用户与网站的通信安全
'django.middleware.security.SecurityMiddleware',
#session会话功能
'django.contrib.sessions.middleware.SessionMiddleware',
#处理请求信息,规范化请求内容
'django.middleware.common.CommonMiddleware',
#开启CSRF防护功能
'django.middleware.csrf.CsrfViewMiddleware',
#开启内置用户认证系统
'django.contrib.auth.middleware.AuthenticationMiddleware',
#开启内置信息提示功能
'django.contrib.messages.middleware.MessageMiddleware',
#开启恶意程序单击劫持
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
#顺序不能随意更改
中间件可以定义五个方法,分别是:(主要的是process_request和process_response)
- process_request(self,request)
- process_view(self, request, view_func, view_args, view_kwargs)
- process_template_response(self,request,response)
- process_exception(self, request, exception)
- process_response(self, request, response)
(具体使用参考:https://www.cnblogs.com/clschao/articles/10480419.html)
参考书籍《Django Web 应用开发实战》