Django入门 | 青训营笔记

124 阅读7分钟

这是我参与「第四届青训营 」笔记创作活动的第1天

01 Django初级

Django 介绍

微信截图_20220305005007.png

安装: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 项目

  1. 配置虚拟环境(安装 django)pip list(查看当前环境)

  2. Terminal 创建项目(django-admin startproject 项目名字)

  3. 先启动项目(python manage.py runserver)

    1. 需要回到 manage 所在目录(cd 文件夹名字)
    2. Terminal 执行 python manage.py runserver
    3. 默认 8080 端口,若端口被占用可以指定启动端口(python manage.py runserver 8081)
    4. (python manage.py runserver 127.0.0.1:8082)
  4. 写功能,需要新建子应用(python manage.py startapp 子应用名字)

新项目里的文件介绍

  1. int.py(包)
  2. asgi.py
  3. setting.py(关于数据库,app,时序等配置文件)
  4. urls.py(路由配置)
  5. wsgi.py(项目部署,与 WSGI 兼容的 Web 服务器入口)
  6. manage.py(控制台)

新子应用里的文件介绍

  1. migrations(数据库迁移时生成的文件)
  2. models.py(数据库创建的类,类与类之间的关系)
  3. views.py(处理发出的请求)
  4. tests.py(写测试)

完成 Django 项目的第一个请求

需要提前配置文件编码为 UTF-8

  1. 请求流程

  2. 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),
    ]
    
  3. 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 配置

  1. 配置 settings.py

    1. 包含 Django 安装的所有位置
    2. 包含模块级变量的 Python 模块
    3. 所有配置项的 key 必须大写
    4. 每一个配置项有默认值
    5. 可以添加自定义的配置项(要大写)
  2. 应用 settings 文件

    1. manage.py 启动

      默认在 manage.py 启动

    2. 手动指定配置文件位置

    3. 服务器部署启动

      在 wsgi.py 配置

      os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'firstDjango.settings')
      #firstDjango.settings 为文件目录
      
  3. 常用配置项

    """
    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'
    
    
  4. 程序中获取 settings 中的配置项

    切记不要导入具体的 settings 模块的路径,会形成高耦合

    from django.conf import settings
    
    # 要用的时候导入后,再获取
    debug=settings.DEBUG
    

URL 调度器工作原理

include,用主路由包含子路由,进行汇总

可以用 include 去调用其他文件(app)中的 urls,分别对应其 views,方便管理分类

  1. 在主项目中配置 urls 的 path
  2. 在子 app 中配置对应的 urls
  3. 配置 path 时,前面写返回路由(可带参数),后面写调用的当下的 view
  4. view 中配置函数

URL 调度器示例

静态路由

动态路由

自定义路径转换器

URL 调度器中正则表达式的使用

默认值使用_异常处理

引用其他 URL 调度器

URL 反向解析

命名空间

Django 模型简单示例

模型修改后重新应用

逆向从数据库表生成模型类

Django 项目使用 Sqlite3 数据库