Django的配置介绍和代码初体验
一、Django版本介绍
因为现在很多公司的老项目依旧是1.11的,我先依旧学习1.11的
官网文档文档:https://yiyibooks.cn/xx/Django_1.11.6/index.html
二、Django的文件解析
我们以我的这个项目bookmanager为例
1、settings.py
1.1、管理界面本地化
- 本地化是将显示的语言、时间等使用本地的习惯,这里的本地化就是进行中国化.
- 中国大陆地区使用
简体中文
, 时区使用亚洲/上海时区
, 注意这里不使用北京时区.
- 修改这里管理后台的语言也是中文的了
-
# 语言设置 #LANGUAGE_CODE = 'en-us' # 默认的英文 LANGUAGE_CODE = 'zh-Hans' #修改为中文 #时区 #TIME_ZONE = 'UTC' #亚洲上海时区 TIME_ZONE = 'Asia/Shanghai' # 修改为上海时区
-
本地化前
-
-
本地化后
-
-
-
1.2、数据库配置
-
DATABASES
- 默认的数据库配置是使用sqlite,我们可以更改其使用mysql,后续使用mysql的更改
- 更改其使用mysql
-
########在setting原来默认的sqlite DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } ############修改成mysql如下 DATABASES = { 'default' : { 'ENGINE':'django.db.backends.mysql', # 引擎 'HOST' : '192.168.21.196', # 数据库主机 'PORT' : 3306, # 数据库端口 'USER' : 'root', # 数据库用户名 'PASSWORD' : 'Password@123', # 数据库用户名密码 'NAME' : 'testbook' # 数据库名字 } } #由于mysql默认引擎为MySQLdb,在__init__.py文件中添加下面代码 #在python3中须替换为pymysql,可在主配置文件(和项目同名的文件下,不是app配置文件)中增加如下代码 import pymysql pymysql.install_as_MySQLdb() #如果找不到pymysql板块,则通过pip install pymysql进行安装。
-
- 这是图
- 默认信息
-
1.3、配置子应用
- settings.py中的 INSTALLED_APPS,是用来配置子应用的
- 因为我们只是创建了子应用在这个项目下,但是这个项目有点笨,它识别不到这个子应用,需要我们手动配置
- 配置子应用的方法
- 方式一: 直接加入到,INSTALLED_APPS中
- 方式二:子应用名.apps.子应用名Config
-
# 安装/注册 子应用 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog.apps.BlogConfig', # 既可以这样方法, blog.apps.BlogConfig = blog 'login', # 也可以这样直接注册进去 # '子应用' # 子应用名.apps.子应用名Config ]
-
* 当使用 子应用名.apps.子应用名大写Config 这个模式要看清楚后面的子应用Config子应用首字母大写
- 例如,将刚创建的book子应用添加到工程中,可在INSTALLED_APPS列表中添加'book.apps.BookConfig'。
1.4、前端模板配置
- settings.py中的TEMPLATES,是用来配置前端模板的
- 比如我们新建一个文件夹templates在项目根目录下,和子应用同级别,将 TEMPLATES中的DIRS对应的参数修改为: [os.path.join(BASE_DIR, 'templates')]
- 配置前端模板
-
# 和模板相关的配置信息 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # dirs 设置模板路径 # BASE_DIR 是我们的项目的根路径 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 在项目的根目录下新建一个名为templates的目录来存放前端文件 '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', ], }, }, ]
-
1.5、工程的URL的配置入口
- settings.py中的ROOT_URLCONF,是用来配置工程的url入口的
-
# ROOT_URLCONF 是我们工程的URL的配置入口 # 默认是我们的工程名.urls # 可以修改,但是我们默认是不改的 ROOT_URLCONF = 'bookmanager.urls'
-
1.6、配置静态文件
- settings.py中的TEMPLATES,是用来配置前端模板的
- 比如我们新建一个文件夹templates在项目根目录下,和子应用同级别,将 TEMPLATES中的DIRS对应的参数修改为: [os.path.join(BASE_DIR, 'templates')]
-
#STATIC_URL = '/static/'为静态文件别名 STATIC_URL = '/static/' #静态文件地址拼接,后面'static'文件为自己建立的存放静态文件(JS,IMG,CSS)的文件名 STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), #主文件下静态文件 os.path.join(BASE_DIR,"blog","statics"),#项目blog文件下静态文件 )
-
1.7、设置打印日志到屏幕
- settings.py 中的LOGGING是设置日志打印
-
-
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level': 'DEBUG', }, } }
-
-
更多的settings设置请参考:https://www.django.cn/course/show-10.html
1.8、Debug设置
- Debug 的设置是直接导致你的项目后续的访问是否安全,因为设置为true别人就可以测试出你的url
- 我们在开发中设置settings.py中的DEBUG = True, 如果是业务上线就要设置 DEBUG = False,因为等True的时候会显示你的访问链接是一个错误界面,并且会暴漏你的所有的访问url,会造成危险
- 设置前的访问错误后的界面
- 设置后的访问出错后的界面
-
1.9、uwsgi
参考文档:Django 设置|Django 文档|Django (djangoproject.com)
当启动一个django项目的时候 要告诉它你的项目配置settings.py在哪个位置,而uwsgi就是项目的入口
指定设置:DJANGO_SETTINGS_MODULE
当你使用Django时,你必须告诉它你正在使用哪些设置。通过使用环境变量DJANGO_SETTINGS_MODULE
来执行此操作。
DJANGO_SETTINGS_MODULE
的值应采用 Python 路径语法,例如 .请注意,设置模块应位于 Python 导入搜索路径上。mysite.settings
而项目的uwsgi.py中就是可以更改你的 配置文件的地方
二、Django项目刨析
- 其实Django中的代码逻辑就是和我们以前所学的一些项目差不多
- 就是 解耦、解耦、解耦,重要的事说三遍
1、视图和URL
- 对于
Django
的设计框架MVT
.- 用户在URL中请求的是视图.
- 视图接收请求后进行处理.
- 并将处理的结果返回给请求者.
- 使用视图时需要进行两步操作
- 视图就是你的每个子应用中的views.py这个文件, 路由就是url.py文件
-
- 1.定义视图
- 2.配置URLconf
三、Django项目初体验
要谨记,我们这次使用的是django1.11版本,所以路由的写法可能和新版本有点出入
项目结构如下
1、settings.py中修改配置
-
""" Django settings for bookmanager project. Generated by 'django-admin startproject' using Django 1.11. For more information on this file, see https://docs.djangoproject.com/en/1.11/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.11/ref/settings/ """ import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'd%396g13f4frx(9p2j_33u=7-z$d13vvvowr-f11l14jn$r3iq' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] # Application definition # 应用模板 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'login' # 将子应用注册进入这个项目中 ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] # ROOT_URLCONF 是我们工程的URL的配置入口 # 默认是我们的工程名.urls # 可以修改,但是我们默认是不改的 ROOT_URLCONF = 'bookmanager.urls' # 和模板相关的配置信息 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # dirs 设置模板路径 # BASE_DIR 是我们的项目的根路径 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 在项目的根目录下新建一个名为templates的目录来存放前端文件 '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', ], }, }, ] WSGI_APPLICATION = 'bookmanager.wsgi.application' # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases # 数据库配置信息 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } # Password validation # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/1.11/topics/i18n/ # 语言设置 #LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-Hans' #时区 #TIME_ZONE = 'UTC' #亚洲上海时区 TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = '/static/'
-
2、项目中的url.py中配置路由
-
- 首先是在项目bookmanager中配置路由url.py
-
from django.conf.urls import include # 导入include这个模块,以便路由分发 from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^', include('login.urls')), # 将路由分发到login子应用的urls.py中 ]
3.在子应用中创建url.py文件,然后进行配置
- 记住子应用的url.py文件是需要新建立的
-
from django.conf.urls import url from login.views import index urlpatterns = [ url(r'index', index), ]
-
4、在子应用login中配置views.py
-
from django.shortcuts import render from django.http import HttpResponse # 导入HttpResponse模块 # Create your views here. """ 视图 1、就是python函数 2、函数的第一个参数就是请求和请求相关的,它是HttpRequest的实例对象和java一模一样 3、我们必须要返回一个响应,响应是httpResponse的实例对象或者它的子类实例对象 """ def index(request): return HttpResponse("欢迎光临Django第一个项目")
-
5、启动项目访问
- 我更改启动端口为8001,所以浏览器输入127.0.0.1:8001/index
-
6、访问html节面
- 上面只是返回了一个字符串,如果我想要返回一个html界面怎么办呢?
- 首先在项目的根目录下,和子应用同级别创建一个文件夹,我创建的叫templets,用来存放html文件
- 然后去settsing中配置 TEMPLATES,将DIRS的values设置为
- 然后再将views.py中的返回的函数方法更改为返回render
-
理解render(后端) 工作流程: return render(request,"login.html") return render(request, "app01/timer.html", {"t":ctime}) 1 按着settings-TEMPLATES-DIRS路径找指定文件 2 读取文件所有字符串 3 渲染: 检查字符串中是否有{{变量}} , if 没有找到: HttpResponse(文件字符串) else 找到 {{t}},用render第三个参数中的对应值进行相应替换(如果没有找到对应值,{{t}}---空) HttpResponse(替换后的文件字符串)
-
- 11
-
# BASE_DIR 是我们的项目的根路径 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 在项目的根目录下新建一个名为templates的目录来存放前端文件
-
- 然后再子应用login中的views.py更改index函数为
- 要谨记,login.views.py中的函数的返回界面中参数必须是dict
-
-
def index(request): """ render(request,template_name,context) request: 当前的请求 template_name 模板文件 context: 传递参数,参数必须是dict 字典,不能是其他的参数 """ name = "如花" context = { "name":name } return render(request,'index.html', context) # return HttpResponse("老王 我是django1.11")
-
7、再次访问界面就是
#########废弃#########
下面是个大体代码:
自带的:
from django.contrib import admin from django.urls import path from First import views #从First中导入 它的视图文件 # urlpatterns = [ # path('admin/', admin.site.urls), # ] from First import views import re urlpatterns = [ path('admin/',admin.site.urls), path('timer/',views.timer), path('login/',views.login), # re_path ('^article') #可以用正则的形式来进行匹配 进行调用视图 用正则的时候可以分组加括号 但是加括号是传递两个参数的 # 这是当你的url输入地址的时候进行匹配的 #分发用inclode就是为了解耦 为了让你自己的url放入自己的url内 ]
还要设置配置settings内的环境:
STATIC_URL = '/static/' STATICFILES_DIRS=[ os.path.join(BASE_DIR,'static'), ] 这是为了能引用static内我们引用jquery这种外部的 文件
app内的视图views
# from django.shortcuts import render from django.shortcuts import render #这是一个你返回一个渲染后的h from django.shortcuts import HttpResponse #这个是把你的内容传递到界面上显示 # Create your views here. # HttpResponse(字符串) -----》作为响应体返回 import time def timer(request): ctime = time.time() return render(request,"timer.html",{'t':ctime}) """ def login(request): if request.method == 'POST': #这个是当http协议执行的时候login函数内接收的是post请求还是get请求 user = request.POST.get('user') #因为接收的信息是以字典的形式来存储的那么我们用来获取发送来的信息 这个键是以form表单中的 input中的name来作为键来取值的 pwd = request.POST.get('pwd') print(user,pwd) if user == '老王' and pwd == '123': return HttpResponse('登陆成功') else: return render(request,'login.html') #如果是get请求就重新执行 login函数 并且login这个文件已经在templates内已经存在 render模块把路径已经建立好了可以直接取查找到 """ #request 其实是接受了ip协议请求的所有的内容 就可以判读你的传递进来的请求是哪种方式 def login(request): if request.method == 'POST': user = request.POST.get('user') #这里的post必须大写 pwd = request.POST.get('pwd') print(user,pwd) if user == '老王' and pwd == '123': return HttpResponse('登陆成功') else: return render(request,'login.html') #这一步的render相当于打开了login.html然后读取里面的内容 else: return render(request,'login.html')
templates 下的配置html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method = 'post'> 用户名 :<input type="text" name="user"/> 密码:<input type="password" name="pwd"> <input type="submit"> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .time{ color:red } </style> {# 这一步的导入 其实是导入的是settings里面的配置的static的信息 就是设置一个静态的路径这个static是别名可以设置#} <script src="/static/jquery-3.3.1.js"></script> <script> window.onload = function(){ $('.time').click(function(){ $(this).css('color','green') }) } </script> </head> <body> <h3>当前时间:<span class="time">{{ t }}</span></h3> </body> </html>