这是我参与「第四届青训营 」笔记创作活动的第1天
01 Django初级
Django 介绍
安装:pip install django
Django 结构:
浏览器——URL 解释器——View——Model——Database——Model——View——Template(Caching)——Web
相关术语 MVC、MTV、ORM 介绍
B/S 和 C/S
Django 用于开发 B/S 架构的软件
软件分为 B/S 和 C/S 框架:
- B/S:全称 Browser/Server(浏览器/服务器)
- C/S:全称 Client/Server(客户端/服务器)
MVC
Model(模型) View(视图) Controller(控制器)
一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑
- M:管理应用程序的状态(通常存储到数据库种),并约束改变状态的行为(或者叫做“业务规则”)
- V:负责把数据格式化后呈现给用户
- C: 接受外部用户的操作,根据操作访问模型获取数据,并调用“视图”显示这些数据。控制器是将“模型”和“视图”隔离,并成为二者之间的联系纽带。
MTV
Django 也是一个 MVC 框架。但是在 Django 中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV 模式:
- M:模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
- T: 模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
- V:视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。
ORM
ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。
ORM 使用对象,封装了数据库操作,因此可以不碰 SQL 语言。开发者只使用面向对象编程,与数据对象直接交互,不用关心底层数据库。
| 数据库 | ORM |
|---|---|
| 表(Table) | 类(Class) |
| 记录(record,行数据) | 对象(Object) |
| 字段(Field) | 对象的属性(Attribute) |
ORM 优点
- 数据模型都在一个地方定义,更容易更新和维护,也利于重用代码。
- ORM 有现成的工具,很多功能都可以自动完成,比如数据消毒、预处理、事务等等。
- 它迫使你使用 MVC 架构,ORM 就是天然的 Model,最终使代码更清晰。
- 基于 ORM 的业务代码比较简单,代码量少,语义性好,容易理解。
- 你不必编写性能不佳的 SQL。
ORM 缺点
- ORM 库不是轻量级工具,需要花很多精力学习和设置。
- 对于复杂的查询,ORM 要么是无法表达,要么是性能不如原生的 SQL。
- ORM 抽象掉了数据库层,开发者无法了解底层的数据库操作,也无法定制一些特殊的 SQL。
搭建 Django 项目
-
配置虚拟环境(安装 django)pip list(查看当前环境)
-
Terminal 创建项目(django-admin startproject 项目名字)
-
先启动项目(python manage.py runserver)
- 需要回到 manage 所在目录(cd 文件夹名字)
- Terminal 执行 python manage.py runserver
- 默认 8080 端口,若端口被占用可以指定启动端口(python manage.py runserver 8081)
- (python manage.py runserver 127.0.0.1:8082)
-
写功能,需要新建子应用(python manage.py startapp 子应用名字)
新项目里的文件介绍
- int.py(包)
- asgi.py
- setting.py(关于数据库,app,时序等配置文件)
- urls.py(路由配置)
- wsgi.py(项目部署,与 WSGI 兼容的 Web 服务器入口)
- manage.py(控制台)
新子应用里的文件介绍
- migrations(数据库迁移时生成的文件)
- models.py(数据库创建的类,类与类之间的关系)
- views.py(处理发出的请求)
- tests.py(写测试)
完成 Django 项目的第一个请求
需要提前配置文件编码为 UTF-8
-
请求流程
-
urls.py 配置
from django.contrib import admin from django.urls import path from first_app import views urlpatterns = [ # 数据库后台的地址 path('admin/', admin.site.urls), # 配置访问地址和调用的views(app中的)的方法 path('first_request/',views.my_first_request), path('login_html/',views.login_html), ] -
views.py 配置
from cgitb import html, reset from django.http import HttpResponse from django.shortcuts import render #-*-coding=utf-8-*- # sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030') # Create your views here. def my_first_request(request): return HttpResponse('succes') def login_html(request): # 可以通过request获取访问的内容 # 可以返回页面html文件 # 通过dir查询可以接收到的request详细类型 # print(dir(request)) # html=''' # <html> # <body> # <form method="post"> # 用户名:<input name = "username" type="text"></input></br> # 密码:<input name = "password" type = "password"></input></br> # <input type="submit" value="login"></input> # </form> # </body> # </html> # ''' # return HttpResponse(html) # 跳转html模板 return render(request,'login.html')
发送请求执行顺序:浏览器——urls.py——views.py——浏览器
Django 配置
-
配置 settings.py
- 包含 Django 安装的所有位置
- 包含模块级变量的 Python 模块
- 所有配置项的 key 必须大写
- 每一个配置项有默认值
- 可以添加自定义的配置项(要大写)
-
应用 settings 文件
-
manage.py 启动
默认在 manage.py 启动
-
手动指定配置文件位置
-
服务器部署启动
在 wsgi.py 配置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'firstDjango.settings') #firstDjango.settings 为文件目录
-
-
常用配置项
""" Django settings for firstDjango project. Generated by 'django-admin startproject' using Django 3.2. For more information on this file, see https://docs.djangoproject.com/en/3.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/3.2/ref/settings/ """ from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # 是项目的基础链接 # print('BASE_DIR------',BASE_DIR) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! # 用于加密session,一个随机的字符串 SECRET_KEY = 'django-insecure-qb@yu($f^&3m^9gmqk(%ovxzef1s$98a7g7u03@4otvtwq9hkb' # SECURITY WARNING: don't run with debug turned on in production! # 调式模式,可以看到错误的所有相关信息,部署时一定要修改为False DEBUG = True # 允许访问的域名设置 开发环境不用理会 # 上线后 如果运行所有域名访问,则设置['*'] # 如果指定某些可以访问,则设置['*.baidu.com']等 ALLOWED_HOSTS = [] # Application definition # 子应用的配置 # 子应用必须配置'polls' INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 子应用必须配置,否则不起不用 # 需要写'子应用名字' 'polls' ] # 中间层配置 # 自己编写的 中间层 需要配置在最后 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', # 从这以后开始配置 ] # 配置基础的urls 创建项目的时候自动身材 ROOT_URLCONF = 'firstDjango.urls' # 配置模板 # 想相应的模板进行显示 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # 配置模板目录 # 'DIR':[os.path.join(BASE_DIR),'templates'] 'DIRS': [], '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配置 WSGI_APPLICATION = 'firstDjango.wsgi.application' # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases # 数据库配置 # 默认sqlite3 # 如果需要使用mysql,需要写入以下内容 """ DATABASES = { 'default':{ 'ENGINE':'django.db.backends.mysql', # 数据库的名字 'NAME':'django_test1', 'USER':'root', 'PASSWORD':'123456', # 访问的主机 'HOST':'127.0.01', # 访问的端口 'PORT':'3306', } } """ DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } # Password validation # https://docs.djangoproject.com/en/3.2/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/3.2/topics/i18n/ # 语言选择 zh-Hans 为中文 LANGUAGE_CODE = 'en-us' # 时区 Asia/Shanghai 是中国时区 TIME_ZONE = 'UTC' # 国际化 USE_I18N = True # 本地化 USE_L10N = True # 使用时区,配套TIME_ZONE使用,必须设置为False USE_TZ = False # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.2/howto/static-files/ # 静态文件的路径,默认是 static # 如果在各自项目的static目录以外,还有目录存放静态文件,需要添加如何属性: """ STATICFILES_DIRS=( os.path.join(BASE_DIR,"common_static1"), '/var/www/static', ) """ STATIC_URL = '/static/' # Default primary key field type # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -
程序中获取 settings 中的配置项
切记不要导入具体的 settings 模块的路径,会形成高耦合
from django.conf import settings # 要用的时候导入后,再获取 debug=settings.DEBUG
URL 调度器工作原理
include,用主路由包含子路由,进行汇总
可以用 include 去调用其他文件(app)中的 urls,分别对应其 views,方便管理分类
- 在主项目中配置 urls 的 path
- 在子 app 中配置对应的 urls
- 配置 path 时,前面写返回路由(可带参数),后面写调用的当下的 view
- view 中配置函数
URL 调度器示例
静态路由
动态路由